【问题标题】:Get 3D coordinates of vertices of rotated and scaled cuboid with scale, center position and rotation on all axis获取旋转和缩放长方体顶点的 3D 坐标,并在所有轴上进行缩放、中心位置和旋转
【发布时间】:2018-07-23 16:03:51
【问题描述】:

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

浏览互联网时,我只找到了 2D 案例的示例,不知道如何推进到 3D 空间。

任何人都可以帮助我吗?我将在使用 LWJGL(轻量级 Java 游戏库)制作的游戏引擎中使用它。

编辑:(对于@httpdigest):

public Vector3f[] getExtents(){

    Matrix4f m = new Matrix4f();

    m.translate(getPosition());
    m.rotate(getRotation().x, new Vector3f(1, 0, 0));
    m.rotate(getRotation().y, new Vector3f(0, 1, 0));
    m.rotate(getRotation().z, new Vector3f(0, 0, 1));
    m.scale(new Vector3f(getScaleX(), getScaleY(), getScaleZ()));
    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;
        Vector4f corner = Matrix4f.transform(m, new Vector4f(x, y, z, 1), null);
        corners[i] = new Vector3f(corner.x, corner.y, corner.z);
    }
    return corners;
}

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

编辑:解决方案: 角度需要以弧度为单位,谢谢支持!

【问题讨论】:

  • 欢迎来到 StackOverflow。你的问题不太清楚,因为有多种方法可以定义“它在所有 3 轴上相对于世界中心的旋转”。请更准确地定义。但更重要的是,解释这是一个实际计算机编程(本网站的目的)中的问题,而不是现在出现的数学问题。
  • 您想使用什么语言?正如现在所写,我不确定这个问题与编程有何关系。
  • Java,LWJGL 是我正在使用的@JanBoyer
  • @RoryDaulton,我已经更新了这个问题。我不太确定这种旋转的名称,但我只需要从 2d 到 3d 的转换(我在 [link] (math.stackexchange.com/questions/1490115/…) 中有一个 2d 答案示例
  • 我不是在寻找旋转的 name,而是在您的代码中给出的 definition。定义 3D 旋转的一种方法是使用具有行列式 1 的 3x3 正交矩阵。另一种方法是围绕一个平行于 x 轴的轴逆时针旋转角度,然后另一个平行于 y 轴,然后另一个平行于 z 轴。还有其他人。您的代码如何定义旋转?您可能需要显示代码示例。此外,由于不涉及旋转,因此您的 2D 链接毫无价值。

标签: java math geometry lwjgl trigonometry


【解决方案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]));
    }
  }
}

它计算一个变换矩阵M = T * Rx * Ry * Rz * S 给定中心位置,欧拉围绕 x、y 和 z 旋转以及给定的单位轴的缩放因子,然后通过该矩阵通过以下方式变换单位立体角的位置P' = M * P.

【讨论】:

  • 您好,感谢您的帮助!它肯定比我以前的要好,看看我是如何将它转换为 LWJGL 的,也许你能发现问题,因为似乎只有 1 个轴错误(我把赌注押在 Z 轴上,因为它在您的代码中的起始值是不同的)。感谢您的支持!如果您能解释为什么 Z 轴上的旋转在开始时是 java.lang.Math.PI / 2.0f 也将不胜感激
  • 这些只是示例/虚拟值,您显然必须将其替换为位置、旋转和比例的实际值。
  • 是的@httpdigest,我做到了,而且确实有效!谢谢您,祝您度过愉快的一周!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
相关资源
最近更新 更多