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 可完全解决问题。
我构建了一个 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 可完全解决问题。