获取旋转和缩放后的长方体的顶点的3D坐标,其中缩放,中心位置和所有轴上的旋转

时间:2018-07-23 16:03:52

标签: java math geometry lwjgl trigonometry

我一直在想弄清楚我遇到的这个问题。 我有一个长方体,它相对于世界从其中心(在3D空间上)相对于世界在所有3个轴上旋转,长方体的中心位置和所有轴上的立方体比例(宽度,高度和深度)。我需要找到长方体所有顶点的坐标。

在浏览Internet时,我只找到了2D案例的例子,却不知道如何前进到3D空间。

谁能帮我吗?我将在用LWJGL(轻量级Java游戏库)制成的游戏引擎中使用它。

编辑:(对于@httpdigest):

program blox4
   implicit none
   integer i
   integer j(3)
   integer k

   j = [-1,12,13]
do i = 1, size(j)
factorial: BLOCK
   if(j(i) < 0) then
      write(*,'(*(g0))') j(i),' is too small'
      EXIT factorial
   end if
   if(j(i) > 12) then
      write(*,'(*(g0))') j(i),' is too big'
      EXIT factorial
   end if
   write(*,'(*(g0))') j(i),'! = ',product([(k,k=1,j(i))])
END BLOCK factorial
end do
end program blox4

这仍然不准确,有人可以发现问题吗?

编辑:解决方案: 角度必须以弧度表示,谢谢您的支持!

1 个答案:

答案 0 :(得分:1)

如果您使用的是LWJGL,也可以使用JOML,在这种情况下,以下可能是可能您想要的

import org.joml.*;
public class CubePositions {
  public static void main(String[] args) {
    /* Cuboid center position */
    float px = 10, py = 0, pz = 0;
    /* Euler angles around x, y and z */
    float ax = 0, ay = 0, az = (float) java.lang.Math.PI / 2.0f;
    /* Scale factor for x, y und z */
    float sx = 1, sy = 3, sz = 1;
    /* Build transformation matrix */
    Matrix4f m = new Matrix4f()
        .translate(px, py, pz) // <- translate to position
        .rotateXYZ(ax, ay, az) // <- rotation about x, then y, then z
        .scale(sx, sy, sz);    // <- scale
    /* Compute cube corners and print them */
    Vector3f[] corners = new Vector3f[8];
    for (int i = 0; i < corners.length; i++) {
      int x = i % 2 * 2 - 1;
      int y = i / 2 % 2 * 2 - 1;
      int z = i / 4 % 2 * 2 - 1;
      corners[i] = m.transformPosition(x, y, z, new Vector3f());
      System.out.println(String.format(
          "Corner (%+d, %+d, %+d) = %s",
          x, y, z, corners[i]));
    }
  }
}

给定中心位置,围绕x的欧拉旋转,然后y然后z的欧拉旋转以及给定的单位轴比例因子,它计算变换矩阵M = T * Rx * Ry * Rz * S,然后通过该变换矩阵来变换单位立方角的位置通过P' = M * P矩阵。