3d 如何在JavaFX中相同地渲染三角形的正面和背面

3d 如何在JavaFX中相同地渲染三角形的正面和背面,3d,javafx,rendering,3d,Javafx,Rendering,我开始使用JavaFX可视化三维非结构化网格,我面临一个渲染问题 如[1]所示,除非使用CullFace.NONE选项,否则JavaFX仅渲染三角形的正面。但是后面的脸是黑色的 由于3D网格是由外部工具(如Gmsh)生成的,因此我无法控制面方向。使用网格的科学软件也不需要定向网格 因此,我不想在以后重新确定网格的方向,只想相同地渲染三角形的正面和背面。这在JavaFX8中是可能的吗?怎么做 谢谢你的回答 值得注意的是:我也在Oracle论坛[2]上发布了一个类似的问题,但这些论坛似乎很空。如果你

我开始使用JavaFX可视化三维非结构化网格,我面临一个渲染问题

如[1]所示,除非使用CullFace.NONE选项,否则JavaFX仅渲染三角形的正面。但是后面的脸是黑色的

由于3D网格是由外部工具(如Gmsh)生成的,因此我无法控制面方向。使用网格的科学软件也不需要定向网格

因此,我不想在以后重新确定网格的方向,只想相同地渲染三角形的正面和背面。这在JavaFX8中是可能的吗?怎么做

谢谢你的回答

值得注意的是:我也在Oracle论坛[2]上发布了一个类似的问题,但这些论坛似乎很空。如果你们中的一些人知道JavaFX社区在哪里活动,一个链接会很有用。我当然会更新这两个线程,如果我有有用的答案分享

问候

[1]


[2] 解决方案1

可以通过绘制两组具有不同面方向的网格来解决此问题。请参阅下面的结果和代码。但是,这会使数据量和处理时间翻一番

附言:还有一个问题值得一提。目前尚不清楚,在当前版本的JavaFX(@2014年8月)中,是否可以对网格边的颜色与面的颜色不同。这将是必要的,如果你需要使一个平面瓷砖可见的个人瓷砖。解决方案是再添加两个网格对象的线集。但这是所需资源的四倍

此外,还需要剔除一些不必要的边。在下图中,只需突出显示地板边缘,而不需要突出显示对角线

解决方案2

将每个网格面替换为三维网格对象,即创建板而不是矩形曲面。因此,一个打开的长方体对象将由五块板组成,长方体的内部和外部将具有相同的颜色。这个解决方案和第一个解决方案一样,仍然是一个黑客攻击,仍然会产生处理开销

数字

实际JavaFX渲染与所需渲染(在Matlab中生成)之间的比较:

部分解决方案:

代码

import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;

/**
// * Draw polygonal 3D box.
// * 
// * INPUT
// * - footprint: 2D polygon coordinates; 
// *   closed path (i.e. first and last coordinates are identical); ex:
// *   float[] footprint = {
// *       10, -1,
// *       -1, -1,
// *       -1, 5,
// *       10, 5,
// *       10, -1
// *   };
// * - zLevel: z-coordinate of actual floor level: int k; float zLevel = k * HEIGHT - HEIGHT;
// * - HEIGHT: height of the box: private static final float HEIGHT = (float) 50;
// * 
// * NOTE: we have to use the mesh method since the straightforward way
// * to construct a rectangle - "rectangle" method - produces blurry edges.
// *
// */
public class DrawPolygonalBox {

// Draw polygonal 3D box.
public static Group draw(float[] footprint, float zLevel, float HEIGHT) {

    Group box = new Group();
    int y = 0;

    // for each footprint coordinate make a rectangle
    int n = footprint.length - 2;

    // one side of the box
    for (int k = 0; k < n; k = k + 2) {

        float[] points = {
            footprint[k], y + zLevel, footprint[k + 1],
            footprint[k + 2], y + zLevel, footprint[k + 3],
            footprint[k + 2], y + zLevel + HEIGHT, footprint[k + 3],
            footprint[k], y + zLevel + HEIGHT, footprint[k + 1]
        };            
        float[] texCoords = {
            1, 1,
            1, 0,
            0, 1,
            0, 0
        };
        int[] faces = {
            0, 0, 2, 2, 1, 1,
            0, 0, 3, 3, 2, 2
        };
        int[] faces2 = {
            0, 0, 1, 1, 2, 2,
            0, 0, 2, 2, 3, 3
        };

        TriangleMesh mesh1 = new TriangleMesh();
        mesh1.getPoints().setAll(points);
        mesh1.getTexCoords().setAll(texCoords);
        mesh1.getFaces().setAll(faces);

        TriangleMesh mesh2 = new TriangleMesh();
        mesh2.getPoints().setAll(points);
        mesh2.getTexCoords().setAll(texCoords);
        mesh2.getFaces().setAll(faces2);

        final MeshView rectangle1 = new MeshView(mesh1);
        rectangle1.setMaterial(new PhongMaterial(Color.web("#FF0000",0.25)));
        rectangle1.setCullFace(CullFace.BACK);

        final MeshView rectangle2 = new MeshView(mesh2);
        rectangle2.setMaterial(new PhongMaterial(Color.web("#FF0000",0.25)));
        rectangle2.setCullFace(CullFace.BACK);

        final MeshView wire1 = new MeshView(mesh1);
        wire1.setMaterial(new PhongMaterial(Color.web("#000000",0.5)));
        wire1.setCullFace(CullFace.BACK);
        wire1.setDrawMode(DrawMode.LINE);

        final MeshView wire2 = new MeshView(mesh2);
        wire2.setMaterial(new PhongMaterial(Color.web("#000000",0.5)));
        wire2.setCullFace(CullFace.BACK);
        wire2.setDrawMode(DrawMode.LINE);

        // add to group
        box.getChildren().addAll(rectangle1, wire1, rectangle2, wire2);
    }

    return box;
}
导入javafx.scene.Group;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.PhongMaterial;
导入javafx.scene.shape.CullFace;
导入javafx.scene.shape.DrawMode;
导入javafx.scene.shape.MeshView;
导入javafx.scene.shape.TriangleMesh;
/**
//*绘制多边形3D框。
// * 
//*输入
//*-示意图:二维多边形坐标;
//*闭合路径(即第一个和最后一个坐标相同);前任:
//*float[]封装外形={
// *       10, -1,
// *       -1, -1,
// *       -1, 5,
// *       10, 5,
// *       10, -1
// *   };
//*-z标高:实际楼层标高的z坐标:int k;float zLevel=k*高度-高度;
//*-高度:箱体高度:专用静态最终浮动高度=(浮动)50;
// * 
//*注意:我们必须使用网格方法,因为这种方法非常简单
//*要构造矩形-“矩形”方法-生成模糊边缘。
// *
// */
公共类抽屉{
//绘制多边形3D框。
公共静态组绘制(浮动[]示意图、浮动zLevel、浮动高度){
组框=新组();
int y=0;
//为每个示意图坐标创建一个矩形
int n=footprint.length-2;
//盒子的一边
对于(int k=0;k

}

你有没有想过这一点?我也有同样的问题,没有。我只是放弃了,没有使用JavaFX,而是使用VTK及其Java包装。不知道这在最新版本中是否已解决。该死。我在任何地方都找不到有关此主题的任何内容。请尝试VTK。对不起,我帮不了你。也许会有帮助。