结合JavaFX 3D Shapes看起来很透明

时间:2017-03-31 15:31:11

标签: java 3d javafx-8 javafx-3d

我正在研究JavaFX 8中的3D项目。我已经构建了一个带有几个TriangleMesh对象的Car 3d模型,我还使用了其他几个JavaFX的Shape 3D来创建轮子和轴。

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

enter image description here 即使MeshView位于其前面,也可以看到2个圆柱

这是我制作的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

1 个答案:

答案 0 :(得分:1)

默认情况下,JavaFX Scene不包含depth buffer。当用于3D时,这可能会导致奇怪的Escherian瑕疵,其中远离相机的物体或表面被绘制在靠近相机的顶部。

  

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

要启用深度缓冲区,请使用one of the constructors that takes a boolean depthBuffer argument

对于SubScenecorresponding constructor也需要SceneAntialiasing参数。 (默认值为SceneAntialiasing.DISABLED。)

(基于Fabian's comment,对于那些不密切关注评论的人。)