【发布时间】:2014-02-24 19:54:06
【问题描述】:
我的程序读入一个 ASCII 编码的 .stl 文件并将其解析为 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 对象的整个表面似乎被赋予了整个纹理的混合。当我用一半的红色和一半的蓝色纹理进行测试时,整个几何图形都呈现为紫色。
【问题讨论】:
标签: java 3d javafx textures mesh