4

我正在使用 JavaFX 8 开发一个 3D 项目。我已经用几个 TriangleMesh 对象构建了一个 Car 3d 模型,我还使用其他几个 JavaFX 'Shape 3D' 来创建车轮和车轴。

问题是 MeshViews 元素看起来是透明的。我可以通过它看到其他 Shape3D 对象

在此处输入图像描述 2 个圆柱体是可见的,即使 MeshView 在它的前面

这是我制作的其中一个 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 版本 8.0.121-b13

4

1 回答 1

3

默认情况下,JavaFX场景不包含深度缓冲区。当用于 3D 时,这可能会导致奇怪的 Escherian 伪影,其中远离相机的物体或表面被绘制在靠近相机的物体或表面之上。

应用程序可能会在创建场景时请求深度缓冲区支持或场景抗锯齿支持。只有 2D 形状且没有任何 3D 变换的场景不需要深度缓冲区,也不需要场景抗锯齿支持。

要启用深度缓冲区,请使用带有参数的构造函数之一boolean depthBuffer

对于SubScene相应的构造函数也需要一个SceneAntialiasing参数。(默认值为SceneAntialiasing.DISABLED。)

(基于Fabian的评论,对于那些不仔细看评论的人。)

于 2018-06-01T19:23:10.593 回答