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

Eug*_*ene 4 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);
Run Code Online (Sandbox Code Playgroud)

如果我使用没有texCoordsfaces数组的代码,它肯定不起作用.那么有可能创建没有纹理的3D模型吗?

jew*_*sea 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,并且您将获得相同的渲染输出.