我想在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);
如果我在没有texCoords
和faces
数组的情况下使用此代码,那么它肯定不起作用。那么有可能创建没有纹理的3D模型吗?
答案 0 :(得分:5)
简答
您必须为TriangleMesh定义所有点,面和纹理坐标,以使网格在Java 8中有效渲染。
一些解释
您正在为模型使用TriangleMesh。面描述了用于绘制网格的三角形。如果您不提供面,那么系统无法知道构成要渲染的多边形的三角形是什么。
这只是一个实现细节(在TriangleMesh javadoc中记录),您必须为网格提供纹理坐标值,即使在您的情况下,因为您将使用单个漫反射颜色渲染,它也不会不管价值观是什么。
Java 8仅定义了一种用于渲染3D形状(如网格)的材质。该材料是PhongMaterial。使用PhongMaterial,您无需提供用于渲染材质的图像纹理,您可以通过调用material.setDiffuseColor(Color.BLUE)为材质(例如蓝色)使用基本颜色。每个多边形将根据phong shading algorithm进行着色,同时考虑场景图中的其他项目,如点光源,环境光,透明区域,遮挡区域,镜面高光等。这样您就可以实际查看模型(如果所有多边形都涂成蓝色,它只会显示为蓝色斑点,您将无法辨别模型的内部细节)。
还可以使用其他着色技术,例如flat shading或gouraud shading或自定义着色算法,但Java 8中不支持使用这些着色技术的材质 - 您必须使用PhongMaterial。 / p>
现在,如果您将PhongMaterial的漫反射颜色设置为纯色并且不为PhongMaterial设置任何其他值,则提供给TriangleMesh的纹理坐标的值无关紧要。提供纹理坐标,以便着色器可以从材质中查找像素颜色以渲染多边形。由于材质具有单一的均匀颜色,您可以指定任何有效的纹理坐标(例如0到1之间的任何值),它将返回相同的颜色。因此,在您的情况下,如果您不想要,则不需要为模型计算纹理坐标,您可以将所有纹理坐标值设置为0或1,并且您将获得相同的渲染输出