2012-05-27 3 views
0

Я работаю с Java3d под eclipse Indigo в окнах. После окончательного изменения примера StlLoader и классов ObjLoad, чтобы загрузить мои файлы STL, я получаю результат, который выглядит следующим образом (я думаю, что из других вопросов это, безусловно, плохие векторные нормали). Кто-нибудь знает, почему у меня может быть эта проблема? Я использую SolidWorks для сохранения STL как файла ASCII и использования модификации кода для загрузки файлов STL, указанных на java3d.org. Хотя я только изменил некоторые свойства внешнего вида и фиксированный сломанный импорт и т. Д. Я подтвердил, что нормальные грани, помещенные в «normList» ниже, точно соответствуют таковым из файла.Java3d - Bad Normals using GeometryInfo

Пример Результат:

enter image description here

Отрывок из StlFile.java от http://www.java3d.org:

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 
+0

Если вы попробуете что-то простое, как куб или сфера, это выглядит правильно? Попытка угадать, если это проблема с файлом модели или вашим кодом. – Tim

+0

Результат для сферы почти такой же. Нормали в файле выглядят несколько разумно. Кто-нибудь знает способ легкого построения нормалей по цвету или со стрелкой/линией? Сфера pic [здесь] (http://i.imgur.com/j02Ng.png) –

+0

Кто-нибудь обнаружил что-нибудь полезное по этому вопросу? –

ответ

0

Если некоторые участки на поверхности действительно черного цвета (0x000000), я думаю, некоторые из нормали фактически указывают внутрь модель, а не внешнюю.

Вы можете проверить правильность вершин v1, v2, v3 для всех треугольников в правом порядке (просто проверьте, если det (v1, v2, v3)> 0) и соответственно переупорядочивают точки. В качестве альтернативы, определите «противоположные» нормали и умножьте их на -1