立方体 3D 点旋转 X 和 Z

Cube 3D points rotations X & Z

包括有关您的目标的详细信息:

描述预期:

实际结果:

展示您尝试过的内容并告诉我们您发现了什么(在此站点或其他地方)以及为什么它不能满足您的需求。当您提供研究时,您可以获得更好的答案。

我看到一些网站准确描述了我想要的内容:

显示一些代码

旋转方式

public void rotateX() {
        for(int i = 0; i < points.size(); i++) {
            
            Vector vector = points.get(i);
            
          double sinTheta = Math.sin(eulerAngle.getX());
          double cosTheta = Math.cos(eulerAngle.getX());
            
          double y = vector.getY();
          double z = vector.getZ();
            
            vector.setY(y * cosTheta - z * sinTheta);
        vector.setZ(z * cosTheta + y * sinTheta);
    }
}
    
public void rotateY() {
    for(int i = 0; i < points.size(); i++) {
            
        Vector vector = points.get(i);
            
        double sinTheta = Math.sin(eulerAngle.getY());
        double cosTheta = Math.cos(eulerAngle.getY());
            
        double x = vector.getX();
        double z = vector.getZ();
            
        vector.setX(x * cosTheta - z * sinTheta);
      vector.setZ(z * cosTheta + x * sinTheta);
    }
}
    
public void rotateZ() {
        for(int i = 0; i < points.size(); i++) {
      
            Vector vector = points.get(i);
      
            double sinTheta = Math.sin(eulerAngle.getZ());
          double cosTheta = Math.cos(eulerAngle.getZ());
      
          double x = vector.getX();
          double y = vector.getY();
          
            vector.setX(x * cosTheta - y * sinTheta);
        vector.setY(y * cosTheta + x * sinTheta);
    }
}

我的设置方法

    public void setupPoints() {
    
    ArrayList<Vector> points = new ArrayList<Vector>();
    
    points.add(getA());
    points.add(getB());
    points.add(getC());
    points.add(getD());
    points.add(getE());
    points.add(getF());
    points.add(getG());
    points.add(getH());
    
    this.points = points;
    
    rotateZ();
    rotateY();
    rotateX();
}

我的积分位置是(我知道它不是一个精确的立方体):

我的环境:

注意:只有 Y 旋转完美,我注意到 Y 轴上的旋转对应于坐标系中的 Z 轴旋转,其中 Y 将是“高度”,这是我第一次工作3d space 计划所以我正在学习。感谢您阅读到这里。

您的旋转方法是正确的,但它们是围绕通过原点的轴旋转的。

您希望它们围绕穿过物体中心的轴旋转。你没有看到围绕 Y 轴旋转的问题,因为它恰好穿过立方体的中心。

您可以通过在旋转前将对象“移动”到原点,并在旋转后将其移回原点来解决此问题。例如,对于 X 旋转:

      double y = vector.getY() - objectCenterY;
      double z = vector.getZ() - objectCenterZ;
        
      vector.setY(y * cosTheta - z * sinTheta + objectCenterY);
      vector.setZ(z * cosTheta + y * sinTheta + objectCenterZ);