JavaFX TriangleMesh 渲染不正确

JavaFX TriangleMesh rendering incorrectly

我构建了一个 OBJ 到 JavaFX 三角形网格解析器并从搅拌机导入了猴头样本模型,但它没有正确渲染。它几乎似乎具有类似 wallhack 的效果。此 link 包含我要导入的对象以及显示问题的视频。 Link。这是我正在使用的代码。

if(tmp.startsWith("v ")) {
    split = tmp.split(" ");
    verticies.add(Float.parseFloat(split[1]));
    verticies.add(Float.parseFloat(split[2]));
    verticies.add(Float.parseFloat(split[3]));
} else if(tmp.startsWith("f ")) {
    split = tmp.split("f |/\d*/\d* *");
    faces.add(Integer.parseInt(split[1]) - 1);
    faces.add(Integer.parseInt(split[2]) - 1);
    faces.add(Integer.parseInt(split[3]) - 1);
    if(split.length > 4) {
        faces.add(Integer.parseInt(split[3]) - 1);
        faces.add(Integer.parseInt(split[4]) - 1);
        faces.add(Integer.parseInt(split[1]) - 1);
    }
}

那里已经有一些 3D 模型 JavaFX 导入器。

您可以从 OpenJFX 项目中查看 3DViewer 项目。它是开源的。

如果您克隆项目,构建它并运行它,您将能够导入您的 obj 文件:

如您所见,obj 文件没有问题。

您可以查看 OBJ 导入器的 code,了解如何解析 obj 文件并将其转换为 TriangleMesh

可以在 interactivemesh.org 找到其他导入器,但它不是开源的。

关于你提到的问题,你可以玩一下剔除面:

meshView.setCullFace(CullFace.BACK);

meshView.setCullFace(CullFace.FRONT);

会改变三角形的缠绕顺序,影响您对模型的看法。默认为返回。

事实证明,解决方案非常简单,与我的 OBJ 代码无关。 Scene 构造函数采用布尔参数来确定是否启用深度缓冲。如果您使用不采用深度缓冲参数的构造函数,则它默认为 false。将其设置为 true 可完全解决问题。