JavaFX如何修复MeshView中的多个立方体?

问题描述 投票:0回答:1

我将 15 个立方体作为

TriangleMesh
添加到
MeshView
。不知怎的,尽管我遵循逆时针规则,但立方体的面看起来还是破碎的。也许 3D 网格中有多个立方体会使立方体看起来破碎? 我的多维数据集代码是一个较大程序中的两个类: 类
Cubes
和 班级
Chart3DItem

import common.Common;
import entities.Location;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;

public class Cubes extends TriangleMesh
{   
   public Cubes ()
   {
      float size = 50;
      
      //    /Z
      //   /
      //  /
      // 0 -------->X
      // |
      // |
      // | 
      // Y
 
      int count = Common.getCurrentGame()
            .getVisitedSolarsystemsMap().keySet().size();
      
      float[] allCorners = new float[count*24];
      int index = 0;
      
      for (Location location : Common.getCurrentGame()
            .getVisitedSolarsystemsMap().keySet())
      {
         float deltaX = location.getX().floatValue()*120; // factor is to scale the range [0 to 10} to [0 to 600]
         float deltaY = location.getY().floatValue()*120;
         float deltaZ = location.getZ().floatValue()*120;
         
         float[] corners = new float[]{ 
               // X, Y, Z 
               deltaX,deltaY,deltaZ+size,
               deltaX+size,deltaY,deltaZ+size,
               deltaX,deltaY+size,deltaZ+size,
               deltaX+size,deltaY+size,deltaZ+size,
               deltaX,deltaY,deltaZ,
               deltaX-size,deltaY,deltaZ,
               deltaX,deltaY+size,deltaZ,
               deltaX+size,deltaY+size,deltaZ
                 };
         
         for (int i = 0; i < corners.length; i++)
         {
            allCorners[i+index] = corners[i];
         }
         index += 24;
      }
      
      
      
      // 0--------->1
      // |
      // |
      // |
      // |
      // 1

        float[] textureCoordinateOnImage = new float[]{
              0,0
        };
        
        //    4---------5
        //   /|        /|
        //  / |       / |
        // 0--------->1 |
        // |  6------|--7
        // | /       | /
        // |/        |/
        // 2---------3
        
        int[] allTriangles = new int[count*72];
        index = 0;
        int a = 0;
        for(int i = 0; i < count; i++)
        {
           int triangles[] = new int[]{
                 a+5,0,a+4,0,a+0,0, // top
                 a+5,0,a+0,0,a+1,0, // top
                    
                 a+0,0,a+4,0,a+6,0, // left
                 a+0,0,a+6,0,a+2,0, // left
                    
                 a+1,0,a+0,0,a+2,0, // front
                 a+1,0,a+2,0,a+3,0, // front
                    
                 a+5,0,a+1,0,a+3,0, // right
                 a+5,0,a+3,0,a+7,0, // right
                    
                 a+4,0,a+5,0,a+7,0, // back
                 a+4,0,a+7,0,a+6,0, // back
                    
                 a+3,0,a+2,0,a+6,0, // bottom
                 a+3,0,a+6,0,a+7,0  // bottom
              };
           
           for (int j = 0; j < triangles.length; j++)
           {
              allTriangles[j+index] = triangles[j];
           }
           
           a += 8;
           index += 72;
        }

        this.getPoints().addAll(allCorners);
        this.getTexCoords().addAll(textureCoordinateOnImage);
        this.getFaces().addAll(allTriangles);
   }
   
   public static MeshView getSolarsystems()
   {
      MeshView cube = new MeshView(new Cubes());
      cube.setDrawMode(DrawMode.FILL);
      PhongMaterial material = new PhongMaterial();
      material.setSpecularColor(Color.ORANGE);
      cube.setMaterial(material);
      return cube;
   }
}

import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.MeshView;
import javafx.scene.transform.Rotate;
import scences.Cubes;

public class Chart3DItem extends StackPane
{
   private Group group = new Group();
   private SubScene scene3d;
   
   public Chart3DItem()
   {
      initContent();
   }

   private void initContent()
   {
      this.setAlignment(Pos.CENTER);
      this.getStyleClass().add("solarsystem-pane");
      this.setPrefHeight(600.0);
      this.setMinHeight(600.0);
      this.setMaxHeight(600.0);
      this.setPrefWidth(600.0);
      this.setMinWidth(600.0);
      this.setMaxWidth(600.0);
      
      this.getChildren().add(new PointLight());
      PerspectiveCamera camera = new PerspectiveCamera();
      camera.setTranslateZ(-2000);
      this.getChildren().add(camera);
      
      scene3d = new SubScene(group, 600, 600, true, SceneAntialiasing.DISABLED);
      scene3d.setCamera(camera);
      this.getChildren().add(scene3d);
   }

   public void update()
   {
      group.getChildren().clear();
      MeshView view = Cubes.getSolarsystems();
      group.getChildren().add(view);
      this.setOnMouseDragged(event -> {
         Rotate rotX = new Rotate(event.getX()/1000f);
         rotX.axisProperty().set(Rotate.X_AXIS);
         view.getTransforms().add(0,rotX);
         Rotate rotY = new Rotate(event.getY()/1000f);
         rotY.axisProperty().set(Rotate.Y_AXIS);
         view.getTransforms().add(1,rotY);
         /*Rotate rotZ = new Rotate(event.getZ()/1000f);
         rotZ.axisProperty().set(Rotate.Z_AXIS);
         view.getTransforms().add(rotZ);*/
      });
   }
}

broken cube faces

代表 3D 网格中 15 个太阳系的 15 个立方体被添加到一个组中,该组被添加到一个子场景中,该子场景被添加到一个

StackPane
(在程序中作为菜单的节点添加 -项目)。

在菜单项中可以看到破碎的立方体。即使我选择将 Color.ORANGE 添加到

PhongMaterial

,它们也显示为黑色和白色。

欢迎所有想法。我用谷歌搜索并在互联网上搜索,但找不到一个网格中有多个立方体并失去颜色的问题。

java javafx mesh uicolor
1个回答
0
投票

有一个小 - 减号,而不是 + 加号。

float[] corners = new float[]{ 
           // X, Y, Z 
           deltaX,deltaY,deltaZ+size,
           deltaX+size,deltaY,deltaZ+size,
           deltaX,deltaY+size,deltaZ+size,
           deltaX+size,deltaY+size,deltaZ+size,
           deltaX,deltaY,deltaZ,
           deltaX+size,deltaY,deltaZ,
           deltaX,deltaY+size,deltaZ,
           deltaX+size,deltaY+size,deltaZ
             };

这是正确显示的。只是颜色还缺失。

multiple cubes but no orange color

© www.soinside.com 2019 - 2024. All rights reserved.