是否可以在没有纹理的JavaFX 8中创建3d模型?

时间:2013-10-24 17:56:01

标签: 3d javafx-8

我想在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模型吗?

1 个答案:

答案 0 :(得分:5)

简答

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

一些解释

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

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

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

还可以使用其他着色技术,例如flat shadinggouraud shading或自定义着色算法,但Java 8中不支持使用这些着色技术的材质 - 您必须使用PhongMaterial。 / p>

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