JavaFX 3D着色面。。。再一次

JavaFX 3D着色面。。。再一次,java,javafx,javafx-3d,Java,Javafx,Javafx 3d,我研究过这个,但还是不明白。下面最短的代码显示了一个金字塔全灰色,而我试图给出构成金字塔的6个三角形。所以为什么这些颜色不显示出来 请注意,我从那个问题中借用了getTexCoords().addAll(…)语句,但显然我仍然做错了什么。它是uv贴图吗?那到底是什么?我已经看到了拓扑解释(spheremap),但这与纹理/颜色有什么关系 谢谢你的帮助-迈克尔 public class ColoredPyramid extends Application { public void sta

我研究过这个,但还是不明白。下面最短的代码显示了一个
金字塔
全灰色,而我试图给出构成
金字塔的6个
三角形
。所以为什么这些颜色不显示出来

请注意,我从那个问题中借用了
getTexCoords().addAll(…)
语句,但显然我仍然做错了什么。它是uv贴图吗?那到底是什么?我已经看到了拓扑解释(
sphere
map
),但这与纹理/颜色有什么关系

谢谢你的帮助-迈克尔

public class ColoredPyramid extends Application {
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 200, 200, true);
        primaryStage.setTitle("Colored Pyramid");
        primaryStage.setScene(scene);
        primaryStage.show();

        TriangleMesh colouredPyramid = new TriangleMesh();
        float height = 100;
        float hypotenuse = 150;
        colouredPyramid.getPoints().addAll(0, 0, 0); //0-index:: top
        colouredPyramid.getPoints().addAll(0, height, -hypotenuse / 2); //1-index:: x=0, z=-hyp/2 ==> Closest to user
        colouredPyramid.getPoints().addAll(-hypotenuse / 2, height, 0); //2-index:: x=hyp/2,  z=0 ==> Leftest
        colouredPyramid.getPoints().addAll(hypotenuse / 2, height, 0);  //3-index:: x=hyp/2,  z=0 ==> rightest
        colouredPyramid.getPoints().addAll(0, height, hypotenuse / 2); ////4-index:: x=0, z=hyp/2  ==> Furthest from user

        //Next statement copied from stackoverflow.com/questions/26831871/coloring-individual-triangles-in-a-triangle-mesh-on-javafx
        colouredPyramid.getTexCoords().addAll(
            0.1f, 0.5f, // 0 red
            0.3f, 0.5f, // 1 green
            0.5f, 0.5f, // 2 blue
            0.7f, 0.5f, // 3 yellow
            0.9f, 0.5f  // 4 orange
        );

        colouredPyramid.getFaces().addAll(0, 0, 2, 0, 1, 0); //Left front face ---> RED
        colouredPyramid.getFaces().addAll(0, 1, 1, 1, 3, 1); //Right front face ---> GREEN
        colouredPyramid.getFaces().addAll(0, 2, 3, 2, 4, 2); //Right back face ---> BLUE
        colouredPyramid.getFaces().addAll(0, 3, 4, 3, 2, 3); //Left back face ---> RED
        colouredPyramid.getFaces().addAll(4, 4, 1, 4, 2, 4); //Base: left triangle face ---> YELLOW
        colouredPyramid.getFaces().addAll(4, 0, 3, 0, 1, 0); //Base: right triangle face ---> ORANGE

        MeshView meshView = new MeshView(colouredPyramid);
        Group group = new Group(meshView);
        group.setTranslateX(100);
        group.setTranslateY(80);
        root.getChildren().add(group);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

要了解JavaFX 3D如何定义任何给定3D形状的颜色,请查看
PhongMaterial
(粗体是我的):

PhongMaterial类提供表示Phong着色材质的特性的定义。它描述了灯光与其应用的网格表面的交互作用。PhongMaterial通过漫反射和镜面反射组件以及环境光和自发光项反射光几何曲面上点的颜色是这四个分量的数学函数

这意味着您首先需要提供材质,然后需要指定其中任何组件,例如漫反射组件

如果从引用的图像复制图像:

并使用它创建材质实例:

PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(new Image(getClass().getResourceAsStream("bB2jV.png")));
meshView.setMaterial(material);
您可以看到,此图像用于将颜色应用于金字塔:

如果修改面的纹理索引,将根据纹理坐标获得不同的颜色

要了解更多信息,可以查看FXyz3D,它提供了基于此概念的
TexturedMesh
类。在那里你会发现许多不同的3D形状“纹理化”原语,它们可以使用不同的纹理“模式”。大多数模式甚至不需要图像,因为图像是在内部创建的。这允许基于数学函数创建例如颜色渐变

这是一个使用3D函数定义密度贴图的
四面体网格的示例:

TetrahedraMesh tetra = new TetrahedraMesh(10, 5, null);
tetra.setTextureModeVertices3D(1530, p -> p.magnitude());

您必须回答的第一个问题:您将应用为纹理的图像在哪里?您设置的纹理坐标将查看该图像。提示:您需要一个图像并设置材质漫反射贴图。谢谢Jose,但是。。。我不明白你的意思。为什么我需要一个图像来将顶点映射到纹理?顺便说一句,推荐我“突出”文本中的代码位的人:我该怎么做?谢谢...@M.Kemper这张照片上有人脸的颜色。看看你最初提到的问题。关于您问题中的格式代码,请参阅Jose,非常感谢-我使用.png文件使其正常工作。我仍然感到困惑,你不能索引到一个颜色数组(毕竟,这就是.png文件以一种迂回的方式提供的内容,但是……它让我走得更远了,所以谢谢!JavaFX 3D提供了一般的基本实现。但是这些实现很容易扩展。这就是我们使用FXyz3D所做的。欢迎任何人提供新的想法。如果答案对您有效,请将其标记为已接受,这样就可以了。)也会对其他人有所帮助。我将看一看FXyz3D(看起来像一个令人畏惧的软件包!;-).@M.Kemper在您的屏幕上有一个指示您如何将答案标记为已接受。只需查看答案左上角的灰色复选框,即接近赞成票或反对票的复选框。只有您可以检查答案是否有效,任何人,包括您在内,都可以投票。