【问题标题】:JavaFX 3D Colouring faces ... againJavaFX 3D着色面孔......再次
【发布时间】:2018-05-27 08:36:17
【问题描述】:

我研究了这个question,但我还是不明白。下面的最短代码显示了一个完全灰色的Pyramid,而我尝试给构成pyramid 的6 个triangles 提供不同的颜色。那么......为什么这些颜色不显示?

请注意,我从该问题中借用了getTexCoords().addAll(..) 声明,但显然我仍然做错了什么。是uv mapping 吗?那到底是什么?我看过一个拓扑解释(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);
    }
}

【问题讨论】:

  • 您必须回答的第一个问题:您将作为纹理应用的图像在哪里?您设置的纹理坐标将查看该图像。提示:您需要一张图片并设置材质漫反射贴图。
  • 谢谢 Jose,但是……我不明白你的意思。为什么需要图像来将顶点映射到纹理?
  • 顺便说一句,对于建议我“突出显示”文本中的代码位的人:我该怎么做?谢谢...
  • @M.Kemper 该图像具有面部的颜色。请参阅您最初提到的问题。有关您问题中的格式代码,请参阅meta.stackoverflow.com/questions/251361/…

标签: java javafx javafx-3d


【解决方案1】:

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

PhongMaterial 类提供了代表 Phong 着色材质的属性定义。它描述了光与它所应用的网格表面的相互作用。 PhongMaterial 根据漫反射和镜面反射分量以及环境和自发光项反射光。 几何表面上点的颜色是这四个分量的数学函数

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

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

并用它创建一个材质实例:

PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(new Image(getClass().getResourceAsStream("bB2jV.png")));
meshView.setMaterial(material);

您可以看到此图像用于将颜色应用于您的金字塔:

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

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

这是TetrahedraMesh 的示例,它使用 3D 函数来定义密度图:

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

【讨论】:

  • 何塞,非常感谢 - 我让它工作,使用 .png 文件。我仍然很困惑你不能索引到一个颜色数组(毕竟这实际上是那个 .png 文件的迂回方式,但是......它让我更进一步,所以谢谢!
  • JavaFX 3D 提供了一般的基本实现。但是这些可以很容易地扩展。这就是我们对 FXyz3D 所做的。欢迎任何人提出新的想法。如果答案对您有用,请将其标记为已接受,这样对其他人也有帮助。
  • 我会看看 FXyz3D(看起来像一个令人生畏的包!;-)。
  • @M.Kemper 您的previous question 上有一个link,它向您展示了如何将答案标记为已接受。
  • 只看答案左上角的灰色复选标记,即接近赞成票或反对票的那个。只有你可以检查答案是否有效,任何人,包括你,只要有足够的声望就可以投票。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多