0

WindowsのEclipse IndigoでJava3dを使用しています。最後に StlLoader の例と ObjLoad クラスを変更して STL ファイルをロードすると、以下のような結果が得られます (他の質問から、これらは間違いなく悪いベクトル法線だと思います)。なぜ私がこの問題を抱えているのか知っている人はいますか? SolidWorks を使用して STL を ASCII ファイルとして保存し、java3d.org で提供されている STL ファイルをロードするためのコードの変更を使用しています。一部の外観プロパティを変更し、破損したインポートなどを修正しただけですが、以下の「normList」に入れられたファセット法線がファイルのものと完全に一致することを確認しました。

結果の例:

ここに画像の説明を入力

http://www.java3d.orgからの StlFile.java のスニペット:

private SceneBase makeScene()
{
// Create Scene to pass back
SceneBase scene = new SceneBase();
BranchGroup group = new BranchGroup();
scene.setSceneGroup(group);

// Store the scene info on a GeometryInfo
GeometryInfo gi = new GeometryInfo(GeometryInfo.TRIANGLE_STRIP_ARRAY);

// Convert ArrayLists to arrays: only needed if file was not binary
if(this.Ascii)
{
  coordArray = objectToPoint3Array(coordList);
  normArray = objectToVectorArray(normList);
}

gi.setCoordinates(coordArray);
gi.setNormals(normArray);
gi.setStripCounts(stripCounts);

// Setting the Material Appearance
Appearance app = new Appearance();

// Coloring Attributes
ColoringAttributes catt = new ColoringAttributes();
catt.setShadeModel( ColoringAttributes.NICEST );
app.setColoringAttributes(catt);

Material mat = new Material(new Color3f(0.6f, 0.6f, 0.6f),      // ambient
                            new Color3f(0, 0, 0),               // emissive
                            new Color3f(0.6f, 0.6f, 0.6f),      // diffuse
                            new Color3f(0.6f, 0.6f, 0.6f),      // specular
                            10);                                // shininess
app.setMaterial(mat);

// Put geometry into Shape3d
Shape3D shape = new Shape3D(gi.getGeometryArray(), app);

group.addChild(shape);
scene.addNamedObject(objectName, shape);

return scene;
} // end of makeScene
4

1 に答える 1

0

表面の一部の領域が本当に黒い場合 (0x000000)、法線の一部が実際にはモデルの外側ではなく内側を向いていると思います。

すべての三角形の頂点 v1、v2、v3 が右側の順序で定義されているかどうかを確認し ( det(v1,v2,v3) > 0 かどうかをテストするだけです)、それに応じてポイントを並べ替えることができます。または、「反対の」法線を検出し、それらに-1を掛けます

于 2012-09-13T19:28:45.233 に答える