Моя программа читает файл .stl в кодировке ASCII и анализирует его в TriangleMesh, чтобы отобразить его на экране. Он отлично работает, пока мне нужен только один цвет для всей геометрии. Но теперь я хочу иметь возможность назначать разные цвета разным полигонам сетки. Позже мы узнаем, какому лицу нужно будет придать какой цвет, но сейчас достаточно проверки концепции. К сожалению, я не могу заставить его работать. Вот что у меня есть до сих пор:
public static MeshView parseSTLwithColor(String stlString){
TriangleMesh mesh = new TriangleMesh();
PhongMaterial textureMaterial = new PhongMaterial();
Image texture = new Image("http://nikijacob.com/wp-content/uploads/2011/01/Mosaic.jpg");
textureMaterial.setDiffuseMap(texture);
Просто настройте быструю тестовую текстуру с разными цветами.
String withoutHeader = stlString.substring(12);
String[] facetsArray = withoutHeader.split("endfacet");
for(int h=0;h<facetsArray.length;h++){
if(facetsArray[h].contains("endloop")){
facetsArray[h] = facetsArray[h].substring(0,facetsArray[h].indexOf("endloop"));
}
}
for(int i= 0 ; i<facetsArray.length;i++){
int facetOffset = i*3;
String[] verticesArray = facetsArray[i].split("vertex");
if(verticesArray.length != 4) break;
for(int j=1;j<4;j++){
String[] vectorArray = verticesArray[j].split(" ");
for(int k=1;k<4;k++) mesh.getPoints().addAll(Float.parseFloat(vectorArray[k]));
Да, не лучший способ сделать это, но это была только первая попытка. По сути, строка данных сетки, закодированных в ASCII, разбивается на грани сетки, затем каждая грань разбивается на 3 точки, затем каждая точка разбивается на 3 вектора, как в 3d. Каждый из них преобразуется в число с плавающей запятой и добавляется в массив точек TriangleMesh.
mesh.getTexCoords().addAll(1/(100+j),1/(100+j));
}
Затем я назначаю каждой точке текстурную координату. Я попытался дать каждой точке немного разные координаты, потому что подумал, что это может помочь. (Но этого не произошло.)
mesh.getFaces().addAll((facetOffset), (facetOffset),(1+facetOffset), (1+facetOffset),(2+facetOffset), (2+facetOffset));
}
MeshView meshView = new MeshView(mesh);
meshView.setMaterial(textureMaterial);
return meshView;
}
И немного домашнего хозяйства. Создайте грани из точек и координат текстуры, создайте экземпляр MeshView и дайте ему текстуру, чтобы можно было вернуть текстурированное Meshview.
Теперь проблема проявляется в том, что вместо того, чтобы назначать разные цвета граням, кажется, что вся поверхность 3D-объекта представляет собой смесь всей текстуры. Когда я тестировал текстуру, наполовину красную и наполовину синюю, вся геометрия стала фиолетовой.