使用Matrix4f围绕多个轴旋转盒子

显示名称

问题有所改变,我想出了如何绕单轴旋转

我想使用一个角度绕Y轴旋转一个框。该框具有一个大小,并带有一个Vector3f来指示旋转。

要正确旋转框,我要做的就是旋转原点位置,然后旋转原点位置加上大小,然后使用这两个引用来渲染该框。

但是,这种旋转无法正常工作,并会导致渲染失真。

这是我旋转位置的代码:

    Matrix4f matrix = new Matrix4f();

    // Rotate the origin position
    Vector3f pos = new Vector3f(new Vector3f(blockX, blockY, blockZ));

    matrix.m03 = pos.x;
    matrix.m13 = pos.y;
    matrix.m23 = pos.z;

    Vector3f rot = new Vector3f(new Vector3f(0, 1f, 0f));

    Matrix4f.rotate((float) Math.toRadians(45f), rot, matrix, matrix);

    Vector3f locationMin = new Vector3f(matrix.m03, matrix.m13, matrix.m23);

    // Rotate the position with the size
    // Top left back is the position of the block
    Vector3f sizeRot = new Vector3f(new Vector3f(blockX + size, blockY + size, blockZ + size));
    matrix = new Matrix4f();

    matrix.m03 = sizeRot.x;
    matrix.m13 = sizeRot.y;
    matrix.m23 = sizeRot.z;

    rot = new Vector3f(new Vector3f(0, 1f, 0f));

    Matrix4f.rotate((float) Math.toRadians(45f), rot, matrix, matrix);

    Vector3f locationMax = new Vector3f(matrix.m03, matrix.m13, matrix.m23);

    // Then here I use the locationMax and the locationMin to render the cube

此代码可能有什么问题?我用来旋转盒子的逻辑是否正确?如旋转原点位置,然后旋转原点位置加上大小。

编辑:我发布了翻译后旋转是愚蠢的,所以我只旋转了不翻译的locationMax(仅大小),然后翻译了,但仍然得到相同的结果(图形伪像)。

新代码:

    float rx = blockX, ry = blockY, rz = blockZ;
    Matrix4f matrix = new Matrix4f();

    Vector3f rot = new Vector3f(0, 1f, 0f);
    matrix = new Matrix4f();

    matrix.m03 = size;
    matrix.m13 = size;
    matrix.m23 = size;

    Matrix4f.rotate((float) Math.toRadians(45f), rot, matrix, matrix);
    matrix.translate(new Vector3f(rx, ry, rz), matrix);

    float mx = matrix.m03;
    float my = matrix.m13;
    float mz = matrix.m23;
    // Here is use rx, ry, rz and mx, my, mz to render the box

============ *我想通了(见下文)* ==============

编辑:

这就是我最终要做的事情:

    // Origin point
    Vector4f a = new Vector4f(blockX, blockY, blockZ, 1);

    // Rotate a matrix 45 degrees
    Matrix4f mat = new Matrix4f();
    mat.rotate((float) Math.toRandians(45f), new Vector3f(
            0, 1f, 0), mat);

    /* Transform the matrix to each point */

    Vector4f c = new Vector4f(size.x, 0, size.z, 1);
    Matrix4f.transform(mat, c, c);
    Vector4f.add(c, a, c);

    Vector4f b = new Vector4f(size.x, 0, 0, 1);
    Matrix4f.transform(mat, b, b);
    Vector4f.add(b, a, b);

    Vector4f d = new Vector4f(0, 0, size.z, 1);
    Matrix4f.transform(mat, d, d);
    Vector4f.add(d, a, d);

    // Here is use a, b, c, and d to render the box.

问题是我想绕所有轴旋转,而不仅仅是绕Y轴旋转。这使得代码非常长且不可读,并且当我尝试绕所有轴旋转时会出现很多错误。

更新问题:

如何获取上面的代码并使之生效,以便可以围绕所有3个轴旋转。我想这样做,所以我可以制作一个广告牌,该广告牌将始终面向相机。

这是我计算相机和物体之间的角度的方法:

    Vector3f angle = new Vector3f();
    // Calculate the distance between camera and object
    Vector3f.sub(game.getCamera().getLocation(),
            new Vector3f(blockX, blockY, blockZ), angle);

    // Calculate the angle around the Y axis.
    float vectorAngle = (float) ((float) Math.atan2(angle.z, angle.x) * -1 + (Math.PI / 2.0f));
内森·拉弗蒂(Nathan Lafferty)

广告牌是计算机图形学的一种非常普遍的应用程序(我肯定您已经注意到了,因为您在问这个问题!)

最终,我认为您基于以下原因使问题复杂化了:

如旋转原点位置,然后旋转原点位置加上大小。

对于计算机图形学,最常见的转换是缩放,平移和旋转,您可以执行这些转换以达到所需的效果(传统上可以缩放,然后围绕原点旋转,然后平移顶点的位置)。

此外,您将使用三个主要矩阵来渲染3d模型:“世界矩阵”,“视图矩阵”和“投影矩阵”。我相信您对从模型空间转换为世界空间有误解。

图形TRS和矩阵信息如果您遇到概念上的问题,或者此答案不足,我强烈建议您查看此链接。我还没有找到更好的资源来解释计算机图形学的基础。

因此,目前,您的三个角度(在Vector3中以度为单位)对应于广告牌和相机的X,Y和Z坐标空间中的角度差。有了这些信息,我们就可以通过首先在一个地方收集所有矩阵变换来生成View矩阵。

我将假设您已经拥有转换矩阵和缩放矩阵,并且它们都可以使用。这意味着我们只需要生成Rotation矩阵,然后使用缩放矩阵对该矩阵进行转换,然后通过我们的平移矩阵对该矩阵进行转换即可。

X旋转 X旋转矩阵

Y旋转Y旋转矩阵

Z旋转Z旋转矩阵

(图片来自上方的CodingLabs链接)

所以,你会产生这三个矩阵,使用X,Y和Z角度先前计算,然后变换它们,将它们合并为一个矩阵,变换的是矩阵通过缩放矩阵,然后转换由转换矩阵矩阵。现在,您拥有了一个很棒的矩阵,当您将一个顶点乘以该矩阵时,它将将该顶点转换为所需的大小,旋转和位置。

因此,您可以通过此生成的矩阵来变换每个顶点。

然后在那之后,您应该完成!使用这些技术有望大大简化您的代码,并使您走上正确的道路:)

那么现在一些代码呢?

//I do not guarantee that this code compiles! I did not write it in an IDE nor did I compile it
float angleToRotX = 180f;
float angleToRotY = 90f;
float angleToRotZ = 0f;

// example vertex
Vector4f vertex = new Vector4f(0, 1, 0, 1);

// Rotate vertex's X coordinates by the desired degrees
Matrix4f rotationXMatrix = new Matrix4f();
rotationXMatrix.rotX(angleToRotX);

Matrix4f rotationYMatrix = new Matrix4f();
rotationYMatrix.rotY(angleToRotY);

Matrix4f rotationZMatrix = new Matrix4f();
rotationZMatrix.rotZ(angleToRotZ);

//now let's translate it by 1.5, 1, 1.5 in the X,Y,Z directions
Matrix4f translationMatrix = new Matrix4f();
translationMatrix.setTranslate(new Vector3f(1.5, 1, 1.5));

/*
Now we have our three rotational matrices. So we multiply them (transform them) to get a single matrix to transform all of the points in this model to the desired world coordinates

*/
Matrix4f rotationMatrix = new Matrix4f();
rotationMatrix.mul(rotationXMatrix);
rotationMatrix.mul(rotationYMatrix);
rotationMatrix.mul(rotationZMatrix);

Matrix4f worldMatrix = translationMatrix;
worldMatrix.mul(rotationMatrix);

//now worldMatrix, when applied to a vertex, will rotate it by X,Y,Z degrees about the origin of it's model space, and then translate it by the amount given in translationMatrix

worldMatrix.transform(vertex);

//now vertex should be (1.5, 0, 1.5, 1) with (x,y,z,1)

现在,该代码可以真正简化了,并且过于冗长。试试看!我没有安装Java下载我的机器上,但我抓住从Java文档的方法在这里

这是正在发生的事情的图像(同样,取自编码实验室):

示例世界矩阵

(高级信息:四元数。这确实是在3D空间中定向模型的一种很酷的方法,但是我不太了解它们,无法向其他人解释它,我也认为您的问题是更根本)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用四元数围绕轴旋转多个点

来自分类Dev

沿轴旋转盒子

来自分类Dev

Floatbuffer到Matrix4f错误顺序LWJGL

来自分类Dev

我可以使用swift在iOS中围绕y轴旋转对象,但是如何围绕单个轴旋转许多对象?

来自分类Dev

如何将Eigen :: Matrix4f转换为Eigen :: Affine3f

来自分类Dev

围绕鼠标旋转多个对象

来自分类Dev

jQuery围绕xy轴旋转矩形

来自分类Dev

如何围绕特定轴旋转矢量

来自分类Dev

如何使用四元数围绕翻译对象的局部坐标轴旋转?

来自分类Dev

围绕x,y,z轴旋转纹理并使用它绘制多边形

来自分类Dev

Spritekit围绕中心旋转多个节点

来自分类Dev

在间隔[0,π/ 4]上,由y = cos(x),x轴和y轴的图限制的固体体积围绕x轴旋转

来自分类Dev

为什么围绕x轴平移CALayer会影响围绕Y轴的旋转

来自分类Dev

围绕对象轴THREE.js旋转对象

来自分类Dev

在循环中围绕自己的轴旋转每个元素(处理)

来自分类Dev

围绕其自身的轴旋转3D图元

来自分类Dev

Three.js-围绕特定轴旋转对象

来自分类Dev

Three.js-围绕轴旋转Object3D

来自分类Dev

使用CSS围绕圆旋转对象?

来自分类Dev

使用变换矩阵围绕任意点旋转

来自分类Dev

使用变换矩阵围绕任意点旋转

来自分类Dev

使用glMultMatrix围绕固定点旋转对象

来自分类Dev

使用 CSS 动画围绕地球旋转点

来自分类Dev

Android的“游戏旋转矢量”传感器会忽略围绕垂直轴的旋转吗?

来自分类Dev

统一-围绕Y轴旋转对象,同时不断向地面设置不同的旋转

来自分类Dev

围绕Y轴的CSS 3D旋转导致Chrome中旋转的内容闪烁

来自分类Dev

如何围绕同一原点旋转多个 SVG 重用元素?

来自分类Dev

有没有办法使用操纵杆的轴输入来围绕一个点旋转游戏对象?

来自分类Dev

有没有简单的方法可以使用Java在不跳入Java 3D的情况下围绕z轴旋转图像?

Related 相关文章

  1. 1

    使用四元数围绕轴旋转多个点

  2. 2

    沿轴旋转盒子

  3. 3

    Floatbuffer到Matrix4f错误顺序LWJGL

  4. 4

    我可以使用swift在iOS中围绕y轴旋转对象,但是如何围绕单个轴旋转许多对象?

  5. 5

    如何将Eigen :: Matrix4f转换为Eigen :: Affine3f

  6. 6

    围绕鼠标旋转多个对象

  7. 7

    jQuery围绕xy轴旋转矩形

  8. 8

    如何围绕特定轴旋转矢量

  9. 9

    如何使用四元数围绕翻译对象的局部坐标轴旋转?

  10. 10

    围绕x,y,z轴旋转纹理并使用它绘制多边形

  11. 11

    Spritekit围绕中心旋转多个节点

  12. 12

    在间隔[0,π/ 4]上,由y = cos(x),x轴和y轴的图限制的固体体积围绕x轴旋转

  13. 13

    为什么围绕x轴平移CALayer会影响围绕Y轴的旋转

  14. 14

    围绕对象轴THREE.js旋转对象

  15. 15

    在循环中围绕自己的轴旋转每个元素(处理)

  16. 16

    围绕其自身的轴旋转3D图元

  17. 17

    Three.js-围绕特定轴旋转对象

  18. 18

    Three.js-围绕轴旋转Object3D

  19. 19

    使用CSS围绕圆旋转对象?

  20. 20

    使用变换矩阵围绕任意点旋转

  21. 21

    使用变换矩阵围绕任意点旋转

  22. 22

    使用glMultMatrix围绕固定点旋转对象

  23. 23

    使用 CSS 动画围绕地球旋转点

  24. 24

    Android的“游戏旋转矢量”传感器会忽略围绕垂直轴的旋转吗?

  25. 25

    统一-围绕Y轴旋转对象,同时不断向地面设置不同的旋转

  26. 26

    围绕Y轴的CSS 3D旋转导致Chrome中旋转的内容闪烁

  27. 27

    如何围绕同一原点旋转多个 SVG 重用元素?

  28. 28

    有没有办法使用操纵杆的轴输入来围绕一个点旋转游戏对象?

  29. 29

    有没有简单的方法可以使用Java在不跳入Java 3D的情况下围绕z轴旋转图像?

热门标签

归档