4

我想在 JavaFX 8 应用程序中创建一个模型,该模型将具有 ~400000 个多边形。而且我不需要任何纹理,只需要简单的颜色。通常有必要有这样的东西:

float[] points = {
    -5, 5, 0,
    -5, -5, 0,
    5, 5, 0,
    5, -5, 0
};
float[] texCoords = {
    1, 1,
    1, 0,
    0, 1,
    0, 0
};
int[] faces = {
    2, 2, 1, 1, 0, 0,
    2, 2, 3, 3, 1, 1
};

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

如果我使用没有texCoordsfaces数组的代码,它肯定不起作用。那么是否可以创建没有纹理的 3d 模型?

4

1 回答 1

5

简答

您必须为 TriangleMesh 定义所有点、面和纹理坐标,网格才能在 Java 8 中有效渲染。

一些解释

您正在为模型使用TriangleMesh。面描述了用于绘制网格的三角形。如果您不提供面,则系统无法知道构成要渲染的多边形的三角形是什么。

这只是一个实现细节(在 TriangleMesh javadoc 中记录),您必须为您的网格提供纹理坐标值,即使在您的情况下,您将使用单一漫反射颜色进行渲染,这并不重要价值观是什么。

Java 8 仅定义了一种用于渲染 3D 形状(例如网格)的材料。该材料是PhongMaterial。使用 PhongMaterial,您无需为渲染材质提供图像纹理,您可以通过调用material.setDiffuseColor(Color.BLUE) 为材质使用基本颜色(例如蓝色)。每个多边形都将根据phong 着色算法进行着色,同时考虑场景图中的其他项目,例如点光源、环境光、透明区域、遮挡区域、镜面高光等。这使您可以真实地查看模型(如果所有多边形都被涂成蓝色,它只会显示为蓝色斑点,您将无法辨别模型的内部细节)。

还有其他可以使用的着色技术,例如平面着色gouraud 着色或自定义着色算法,但 Java 8 不支持使用这些着色技术的材质 - 您必须使用 PhongMaterial。

现在,如果您将 PhongMaterial 的漫反射颜色设置为纯色并且不为 PhongMaterial 设置任何其他值,则提供给 TriangleMesh 的纹理坐标值将无关紧要。提供纹理坐标以便着色器可以从材质中查找像素颜色以渲染多边形。由于材质具有单一的统一颜色,您可以指定任何有效的纹理坐标(例如,0 和 1 之间的任何值),它将返回相同的颜色。因此,在您的情况下,如果您不想计算模型的纹理坐标,您可以将所有纹理坐标值设置为 0 或 1,您将获得相同的渲染输出。

于 2013-10-24T19:00:42.770 回答