我正在研究JavaFX 8中的3D项目。我已经构建了一个带有几个TriangleMesh对象的Car 3d模型,我还使用了其他几个JavaFX的Shape 3D来创建轮子和轴。
问题是MeshViews元素看起来是透明的。我可以通过它看到其他Shape3D对象
这是我制作的TriangleMesh之一的一个例子
// ============================= ROOF ============================= //
TriangleMesh roofMesh = new TriangleMesh(VertexFormat.POINT_TEXCOORD);
roofMesh.getPoints().addAll(
/* X */ -roofWidth/2.f, /* Y */ roofHeight + wheelDiameter / 2 + wheelGap + doorHeight, /* Z */ - roofLength/2, //PT0
/* X */ roofWidth/2.f, /* Y */ roofHeight + wheelDiameter / 2 + wheelGap + doorHeight, /* Z */ - roofLength/2, //PT1
/* X */ -roofWidth/2.f, /* Y */ roofHeight + wheelDiameter / 2 + wheelGap + doorHeight, /* Z */ roofLength/2, //PT2
/* X */ roofWidth/2.f, /* Y */ roofHeight + wheelDiameter / 2 + wheelGap + doorHeight, /* Z */ roofLength/2 //PT3
);
roofMesh.getTexCoords().addAll(
0, 0, // t0
1, 0, // t1
0, 1, // t2
1, 1 // t3
);
roofMesh.getFaces().addAll(
1,1, 0,0,2,2,
3,3, 1,2 ,2,1
);
创建网格后我正在创建一个新的MeshView对象
meshViewMap.put("roof", new MeshView(roofMesh));
我还在MeshViews中应用了一个材质:
private void setTexColor(Shape3D shape, Color c, String imagePath )
{
PhongMaterial pm = new PhongMaterial();
pm.setDiffuseColor(c);
pm.setSpecularColor(c);
shape.setMaterial(pm);
}
这些是您可以在图像中看到的圆柱体:
//Create Axles
Cylinder frontCylinder = new Cylinder(0.5, bodyWidth);
Cylinder rearCylinder = new Cylinder(0.5, bodyWidth);
PhongMaterial cylinderMat = new PhongMaterial();
cylinderMat.setDiffuseColor(Color.BLACK);
cylinderMat.setSpecularColor(Color.BLACK);
frontCylinder.setMaterial(cylinderMat);
rearCylinder.setMaterial(cylinderMat);
frontCylinder.setRotate(90);
rearCylinder.setRotate(90);
frontCylinder.setTranslateZ( 0.7f * (bodyLength/2 + hoodLength/2));
rearCylinder.setTranslateZ( -0.4f * (bodyLength/2 + hoodLength/2));
frontCylinder.setTranslateY(wheelDiameter/2);
rearCylinder.setTranslateY(wheelDiameter/2);
this.getChildren().add(frontCylinder);
this.getChildren().add(rearCylinder);
我尝试将不透明度设置为1,即使它是默认值。
Java Version 8.0.121-b13
答案 0 :(得分:1)
默认情况下,JavaFX Scene不包含depth buffer。当用于3D时,这可能会导致奇怪的Escherian瑕疵,其中远离相机的物体或表面被绘制在靠近相机的顶部。
应用程序可以在创建场景时请求深度缓冲支持或场景抗锯齿支持。仅具有2D形状且没有任何3D变换的场景不需要深度缓冲区也不需要场景抗锯齿支持。
要启用深度缓冲区,请使用one of the constructors that takes a boolean depthBuffer
argument。
对于SubScene,corresponding constructor也需要SceneAntialiasing
参数。 (默认值为SceneAntialiasing.DISABLED
。)
(基于Fabian's comment,对于那些不密切关注评论的人。)