Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx:将图像应用于meshview不起作用_Java_Javafx_Javafx 3d - Fatal编程技术网

Javafx:将图像应用于meshview不起作用

Javafx:将图像应用于meshview不起作用,java,javafx,javafx-3d,Java,Javafx,Javafx 3d,我试图用phongmaterial将图像应用到我的meshview立方体,但屏幕上只显示没有颜色的黑色立方体。它过去可以处理长方体和立方体,但现在不能处理它们了 还有,有人能告诉我如何获得特定立方体的面吗 这是我的密码: Rotate rxBox = new Rotate(30, 0, 0, 0, Rotate.X_AXIS); Rotate ryBox = new Rotate(50, 0, 0, 0, Rotate.Y_AXIS); Rotate rzBox = new Rotate(30,

我试图用phongmaterial将图像应用到我的meshview立方体,但屏幕上只显示没有颜色的黑色立方体。它过去可以处理长方体和立方体,但现在不能处理它们了

还有,有人能告诉我如何获得特定立方体的面吗

这是我的密码:

Rotate rxBox = new Rotate(30, 0, 0, 0, Rotate.X_AXIS);
Rotate ryBox = new Rotate(50, 0, 0, 0, Rotate.Y_AXIS);
Rotate rzBox = new Rotate(30, 0, 0, 0, Rotate.Z_AXIS);

@Override
public void start(Stage primaryStage) {


    float hw = 100/2f;
    float hh = 100/2f;
    float hd = 100/2f;

    float points[] = {
            hw, hh, hd,
            hw, hh, -hd,
            hw, -hh, hd,
            hw, -hh, -hd,
            -hw, hh, hd,
            -hw, hh, -hd,
            -hw, -hh, hd,
            -hw, -hh, -hd};

    float tex[] = {
            100, 0,
            200, 0,
            0, 100,
            100, 100,
            200, 100,
            300, 100,
            400, 100,
            0, 200,
            100, 200,
            200, 200,
            300, 200,
            400, 200,
            100, 300,
            200, 300};

    int faces[] = {
            0, 10, 2, 5, 1, 9,
            2, 5, 3, 4, 1, 9,
            4, 7, 5, 8, 6, 2,
            6, 2, 5, 8, 7, 3,
            0, 13, 1, 9, 4, 12,
            4, 12, 1, 9, 5, 8,
            2, 1, 6, 0, 3, 4,
            3, 4, 6, 0, 7, 3,
            0, 10, 4, 11, 2, 5,
            2, 5, 4, 11, 6, 6,
            1, 9, 3, 4, 5, 8,
            5, 8, 3, 4, 7, 3};

    int[] facesSmoothingGroups = {0,0,1,1,2,2,3,3,4,4,5,5};

   // URL resource = Main.class.getResource("DFv8z.png");
    Image diffuseMap = new Image(Main.class.getResource("PCmIW.png").toExternalForm());

    TriangleMesh mesh = new TriangleMesh();
    mesh.getPoints().addAll(points);
    mesh.getTexCoords().addAll(tex);
    mesh.getFaces().addAll(faces);
   // mesh.getFaceSmoothingGroups().addAll(facesSmoothingGroups);

    Material cubeMaterial = new PhongMaterial(Color.TRANSPARENT, diffuseMap, null, null, null);

    MeshView m = new MeshView(mesh);
    m.getTransforms().addAll(rxBox, ryBox, rzBox);
    m.setMaterial(cubeMaterial);

    final Group g = new Group(m);

    g.setTranslateX(400/2);
    g.setTranslateY(400/2);
    //g.setTranslateZ(400/2);
    g.setRotationAxis(Rotate.Y_AXIS);
    g.setRotationAxis(Rotate.X_AXIS);
    //g.setRotationAxis(Rotate.Z_AXIS);




    Scene scene = new Scene(g, 400, 400, Color.SKYBLUE);


    primaryStage.setTitle("Hello World");
    primaryStage.setScene(scene);
    primaryStage.show();

}

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

@Override
public void handle(MouseEvent event) {
    // TODO Auto-generated method stub

}
}


您走在正确的轨道上,但您需要:

  • 使用规格化纹理坐标,介于0.0f和1.0f之间
  • 不要将漫反射颜色设置为透明,只需设置漫反射贴图图像
对于第一部分,只需定义净图像的总长度和高度:

float L = 400f;
float H = 300f;
然后规格化纹理坐标:

float tex[] = {
        100f / L,   0f / H,
        200f / L,   0f / H,
          0f / L, 100f / H,
        100f / L, 100f / H,
        200f / L, 100f / H,
        300f / L, 100f / H,
        400f / L, 100f / H,
          0f / L, 200f / H,
        100f / L, 200f / H,
        200f / L, 200f / H,
        300f / L, 200f / H,
        400f / L, 200f / H,
        100f / L, 300f / H,
        200f / L, 300f / H};    
Point3D normal = m.sceneToLocal(0, -1, 0);
对于第二部分,只需使用setter:

PhongMaterial cubeMaterial = new PhongMaterial();
cubeMaterial.setDiffuseMap(diffuseMap);
还有纹理立方体(启用平滑组):

编辑

为了找出顶面,在任何可能的旋转之后,如果您根据净图像和面定义的顺序定义当前颜色和法线,则可以轻松完成此操作:

final String[] colors = {"Blue", "Red", "White", "Yellow", "Cyan", "Green"};

float normals[] = {
     1f,  0f,  0f,
    -1f,  0f,  0f,
     0f,  1f,  0f,
     0f, -1f,  0f,
     0f,  0f,  1f,
     0f,  0f, -1f,
};
然后,要跟踪顶面,它对应于场景坐标中的法线
{0,-1,0}

因此,基本上需要在网格坐标中表示法线:

float tex[] = {
        100f / L,   0f / H,
        200f / L,   0f / H,
          0f / L, 100f / H,
        100f / L, 100f / H,
        200f / L, 100f / H,
        300f / L, 100f / H,
        400f / L, 100f / H,
          0f / L, 200f / H,
        100f / L, 200f / H,
        200f / L, 200f / H,
        300f / L, 200f / H,
        400f / L, 200f / H,
        100f / L, 300f / H,
        200f / L, 300f / H};    
Point3D normal = m.sceneToLocal(0, -1, 0);
最后,您必须将此法线与
法线中定义的任何法线相匹配。该索引将为您提供以下颜色:

private String getColor(MeshView m, float[] normals) {

    Point3D normal = m.sceneToLocal(0, -1, 0);

    for (int i = 0; i < normals.length; i += 3) {
        if (normals[i] * normal.getX() + normals[i+1] * normal.getY() + normals[i+2] * normal.getZ() > 0.99) {
            return colors[i / 3];
        }
    }
    return "no color found";
}
private String getColor(MeshView m,float[]normals){
点3D法线=m.sceneToLocal(0,-1,0);
对于(int i=0;i0.99){
返回颜色[i/3];
}
}
返回“未找到颜色”;
}

Hi jose,图像现在工作正常。但当我随机掷骰子时,我想打印出上面的颜色。我试图返回面,但它返回面总数。如果你适当缩放纹理坐标(在0-1之间),你应该得到我发布的图片。如果将纹理坐标除以100,而不是除以L(400)或H(300),则得到每个面的网格。如何使用faceSmoothingGroups跟踪哪一侧位于顶部?为此,请使用
PickResult
。通过单击或按下等鼠标事件,您可以获得例如
事件。getPickResult().getIntersectedFace()
。不需要平滑组。只需执行:
m.setOnMouseClicked(e->System.out.println(“e”+e.getPickResult().getIntersectedFace())伟大,考虑然后接受答案,所以它对其他人也是有用的。