Javafx 为什么漫反射贴图不应用于我的MeshView?

Javafx 为什么漫反射贴图不应用于我的MeshView?,javafx,javafx-3d,Javafx,Javafx 3d,问题 我想将漫反射贴图应用于网格视图。当我将带有漫反射贴图的材质应用到网格视图时,它不可见。但是,应用于长方体的相同材质是可见的 问题 要将漫反射贴图应用于MeshView,我必须做什么 代码 该代码生成带有随机噪声的图像。该图像用作PhongMaterial中的漫反射贴图。将显示图像,图像上方为应用材质的长方体,长方体上方为应用材质的网格视图(金字塔)。该材质在金字塔上不可见。可以使用鼠标拖动进行旋转 import java.util.Random; import javafx.applic

问题

我想将漫反射贴图应用于网格视图。当我将带有漫反射贴图的材质应用到网格视图时,它不可见。但是,应用于长方体的相同材质是可见的

问题

要将漫反射贴图应用于MeshView,我必须做什么

代码

该代码生成带有随机噪声的图像。该图像用作PhongMaterial中的漫反射贴图。将显示图像,图像上方为应用材质的长方体,长方体上方为应用材质的网格视图(金字塔)。该材质在金字塔上不可见。可以使用鼠标拖动进行旋转

import java.util.Random;

import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class Test extends Application {

    private double mousePosX, mousePosY;
    private double mouseOldX, mouseOldY;
    private final Rotate rotateX = new Rotate(20, Rotate.X_AXIS);
    private final Rotate rotateY = new Rotate(-45, Rotate.Y_AXIS);

    @Override
    public void start(Stage primaryStage) {

        // cube
        Group group = new Group();

        // size of the cube
        double size = 400;
        group.getTransforms().addAll(rotateX, rotateY);

        Image diffuseMap = createImage( size);

        // show noise image
        ImageView iv = new ImageView( diffuseMap);
        iv.setTranslateX(-0.5*size);
        iv.setTranslateY(-0.20*size);
        iv.setRotate(90);
        iv.setRotationAxis(new Point3D(1,0,0));
        group.getChildren().add( iv);

        // create material out of the noise image
        PhongMaterial material = new PhongMaterial();
        material.setDiffuseMap(diffuseMap);

        // create box with noise diffuse map
        Box box = new Box( 100,100,100);
        box.setMaterial(material);
        group.getChildren().add( box);

        // create pyramid with diffuse map
        float h = 150;                    // Height
        float s = 150;                    // Side

        TriangleMesh pyramidMesh = new TriangleMesh();

        pyramidMesh.getTexCoords().addAll(1,1,1,0,0,1,0,0);

        pyramidMesh.getPoints().addAll(
                0,    0,    0,            // Point 0 - Top
                0,    h,    -s/2,         // Point 1 - Front
                -s/2, h,    0,            // Point 2 - Left
                s/2,  h,    0,            // Point 3 - Back
                0,    h,    s/2           // Point 4 - Right
            );

        pyramidMesh.getFaces().addAll(
          0,0,  2,0,  1,0,          // Front left face
          0,0,  1,0,  3,0,          // Front right face
          0,0,  3,0,  4,0,          // Back right face
          0,0,  4,0,  2,0,          // Back left face
          4,0,  1,0,  2,0,          // Bottom rear face
          4,0,  3,0,  1,0           // Bottom front face
        ); 


        MeshView pyramid = new MeshView(pyramidMesh);
        pyramid.setDrawMode(DrawMode.FILL);
        pyramid.setTranslateY(-250);

        // apply material
        // TODO: why is the diffuse map not displayed?
        pyramid.setMaterial(material);

        group.getChildren().add(pyramid);

        // scene
        StackPane root = new StackPane();
        root.getChildren().add(group);
        Scene scene = new Scene(root, 1600, 900, true, SceneAntialiasing.BALANCED);
        scene.setCamera(new PerspectiveCamera());

        // interaction listeners
        scene.setOnMousePressed(me -> {
            mouseOldX = me.getSceneX();
            mouseOldY = me.getSceneY();
        });
        scene.setOnMouseDragged(me -> {
            mousePosX = me.getSceneX();
            mousePosY = me.getSceneY();
            rotateX.setAngle(rotateX.getAngle()-(mousePosY - mouseOldY));
            rotateY.setAngle(rotateY.getAngle()+(mousePosX - mouseOldX));
            mouseOldX = mousePosX;
            mouseOldY = mousePosY;

        });

        primaryStage.setResizable(false);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    /**
     * Create image with random noise
     */
    public Image createImage( double size) {

        Random rnd = new Random();

        int width = (int) size;
        int height = (int) size;

        WritableImage wr = new WritableImage(width, height);
        PixelWriter pw = wr.getPixelWriter();
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {

                Color color = Color.rgb(rnd.nextInt( 256), rnd.nextInt( 256), rnd.nextInt( 256));
                pw.setColor(x, y, color);

            }
        }

        return wr;

    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.util.Random;
导入javafx.application.application;
导入javafx.geometry.Point3D;
导入javafx.scene.Group;
导入javafx.scene.PerspectiveCamera;
导入javafx.scene.scene;
导入javafx.scene.sceneatialiasing;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.image.PixelWriter;
导入javafx.scene.image.WritableImage;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.PhongMaterial;
导入javafx.scene.shape.Box;
导入javafx.scene.shape.DrawMode;
导入javafx.scene.shape.MeshView;
导入javafx.scene.shape.TriangleMesh;
导入javafx.scene.transform.Rotate;
导入javafx.stage.stage;
公共类测试扩展了应用程序{
私人双鼠标塞,鼠标塞;
私人双鼠标;
私有最终旋转rotateX=新旋转(20,旋转X_轴);
私有最终旋转旋转Y=新旋转(-45,旋转Y_轴);
@凌驾
公共无效开始(阶段primaryStage){
//立方体
组=新组();
//立方体的大小
双倍尺寸=400;
group.getTransforms().addAll(rotateX,rotateY);
图像扩散图=创建图像(大小);
//显示噪声图像
ImageView iv=新的ImageView(扩散图);
iv.setTranslateX(-0.5*尺寸);
iv.setTranslateY(-0.20*尺寸);
iv.设置旋转(90);
iv.设置旋转轴(新点3D(1,0,0));
group.getChildren().add(iv);
//从噪波图像中创建材质
PhongMaterial材质=新的PhongMaterial();
材料。设置扩散图(扩散图);
//使用“噪波漫反射贴图”创建长方体
盒子=新盒子(100100);
箱体材料(材料);
group.getChildren().add(框);
//使用漫反射贴图创建金字塔
浮动h=150;//高度
浮点数s=150;//侧面
三角形网格棱锥网格=新三角形网格();
getTexCoords().addAll(1,1,1,0,0,1,0,0);
pyramidMesh.getPoints().addAll(
0,0,0,//点0-顶部
0,h,-s/2,//点1-前
-s/2,h,0,//点2-左
s/2,h,0,//第3点-返回
0,h,s/2//第4点-右侧
);
pyramidMesh.getFaces().addAll(
0,0,2,0,1,0,//左前面部
0,0,1,0,3,0,//右前方
0,0,3,0,4,0,//右背面
0,0,4,0,2,0,//左背面
4,0,1,0,2,0,//底部背面
4,0,3,0,1,0//底部正面
); 
网格视图棱锥体=新网格视图(棱锥体网格);
金字塔.setDrawMode(DrawMode.FILL);
棱锥体。setTranslateY(-250);
//应用材料
//TODO:为什么不显示漫反射贴图?
金字塔。设置材料(材料);
group.getChildren().add(金字塔);
//场面
StackPane root=新的StackPane();
root.getChildren().add(组);
Scene-Scene=新场景(root,1600,900,true,sceneatialiasing.BALANCED);
scene.setCamera(新透视摄像头());
//互动听众
scene.setOnMousePressed(我->{
mouseOldX=me.getSceneX();
mouseOldY=me.getSceneY();
});
scene.setonMouseDrawed(我->{
mousePosX=me.getSceneX();
mousePosY=me.getSceneY();
rotateX.setAngle(rotateX.getAngle()-(mousePosY-mouseOldY));
rotateY.setAngle(rotateY.getAngle()+(mousePosX-mouseOldX));
mouseOldX=mousePosX;
mouseOldY=鼠标点;
});
primaryStage.SetResizeable(假);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*创建带有随机噪声的图像
*/
公共图像createImage(双倍大小){
随机rnd=新随机();
整数宽度=(整数)大小;
整数高度=(整数)大小;
WritableImage wr=新的WritableImage(宽度、高度);
PixelWriter pw=wr.getPixelWriter();
对于(int x=0;x
截图

非常感谢你的帮助

问题 此形状由6个单一形状组成。这四个三角形都在A点相交。 底部有一个矩形,因为它们是三角形,所以创建矩形需要两个三角形。下图显示了该形状的俯视图

如你所见,我们得5分。所以它们必须被加到三角形网格的点上。一个点由三个浮点值(x、y、z)组成的元组组成。所以这个数组总是由3,6,9,…,15等大小组成

质地 如果你想有一个图像作为网格的材质(就像你做的那样),你可以
import java.util.Random;

import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class Test extends Application {

    private double mousePosX, mousePosY;
    private double mouseOldX, mouseOldY;
    private final Rotate rotateX = new Rotate(20, Rotate.X_AXIS);
    private final Rotate rotateY = new Rotate(-45, Rotate.Y_AXIS);

    @Override
    public void start(Stage primaryStage) {

        // cube
        Group group = new Group();

        // size of the cube
        double size = 400;
        group.getTransforms().addAll(rotateX, rotateY);

        Image diffuseMap = createImage(size);

        // show noise image
        ImageView iv = new ImageView(diffuseMap);
        iv.setTranslateX(-0.5 * size);
        iv.setTranslateY(-0.20 * size);
        iv.setRotate(90);
        iv.setRotationAxis(new Point3D(1, 0, 0));
        group.getChildren().add(iv);

        // create material out of the noise image
        PhongMaterial material = new PhongMaterial();
        material.setDiffuseMap(diffuseMap);

        // create box with noise diffuse map
        Box box = new Box(100, 100, 100);
        box.setMaterial(material);
        group.getChildren().add(box);

        // create pyramid with diffuse map
        float h = 150; // Height
        float s = 150; // Side
        float hs = s / 2;

        // coordinates of the mapped image
        float x0 = 0.0f;
        float y0 = 0.0f;
        float x1 = 1.0f;
        float y1 = 1.0f;

        TriangleMesh pyramidMesh = new TriangleMesh();

        pyramidMesh.getPoints().addAll( //
                0.0f, 0.0f, 0.0f, // A 0 Top of Pyramid
                hs, h, -hs, // B 1
                hs, h, hs, // C 2
                -hs, h, hs, // D 3
                -hs, h, -hs // E 4
        );

        pyramidMesh.getTexCoords().addAll( //
                x0, y0, // 0
                x0, y1, // 1
                x1, y0, // 2
                x1, y1 // 3
        );

        pyramidMesh.getFaces().addAll(// index of point, index of texture, index of point, index of texture, index of point, index of texture
                0, 0, 1, 1, 2, 3, // ABC (counter clockwise)
                0, 0, 2, 1, 3, 3, // ACD (counter clockwise)
                0, 0, 3, 1, 4, 3, // ADE (counter clockwise)
                0, 0, 4, 1, 1, 3, // AEB (counter clockwise)
                4, 0, 3, 1, 2, 3, // EDC (Bottom first triangle clock wise)
                2, 0, 1, 1, 4, 3 // CBE (Bottom second triangle clock wise)
        );

        MeshView pyramid = new MeshView();
        pyramid.setMesh(pyramidMesh);
        pyramid.setDrawMode(DrawMode.FILL);
        pyramid.setTranslateY(-250);

        // apply material
        // TODO: why is the diffuse map not displayed?
        pyramid.setMaterial(material);
        group.getChildren().add(pyramid);

        // scene
        StackPane root = new StackPane();
        root.getChildren().add(group);
        Scene scene = new Scene(root, 1600, 900, true, SceneAntialiasing.BALANCED);
        scene.setCamera(new PerspectiveCamera());

        // interaction listeners
        scene.setOnMousePressed(me -> {
            mouseOldX = me.getSceneX();
            mouseOldY = me.getSceneY();
        });
        scene.setOnMouseDragged(me -> {
            mousePosX = me.getSceneX();
            mousePosY = me.getSceneY();
            rotateX.setAngle(rotateX.getAngle() - (mousePosY - mouseOldY));
            rotateY.setAngle(rotateY.getAngle() + (mousePosX - mouseOldX));
            mouseOldX = mousePosX;
            mouseOldY = mousePosY;

        });

        primaryStage.setResizable(false);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    /**
     * Create image with random noise
     */
    public Image createImage(double size) {

        Random rnd = new Random();

        int width = (int) size;
        int height = (int) size;

        WritableImage wr = new WritableImage(width, height);
        PixelWriter pw = wr.getPixelWriter();
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                Color color = Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
                pw.setColor(x, y, color);
            }
        }
        return wr;
    }

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