java - 在同一轴上平移和旋转时出现奇怪的行为

标签 java android matrix opengl-es

我试图在 OpenGL ES 中围绕其中心旋转对象。当我在同一轴上使用 Matrix.translateM() 时,Matrix.setRotatem() 将我的对象中心更改为该轴上的 0。 当我尝试以下操作时:

Matrix.translateM(rotationMatrix, OFFSET, 0, 1, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, -1, 0);

那么效果就是: enter image description here

但是当我做这样的事情时:

Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);

效果是: enter image description here

第二张图是正确的样子。所以,我的问题是:为什么在 y 轴上平移会造成这种困惑。

最佳答案

如果你想围绕一个枢轴旋转一个对象,那么你必须:

  • 以这种方式平移对象,即枢轴位于原点 (0, 0, 0)。
    由于您的对象位于 (0, 1, 0),这意味着对象必须平移 (0, -1, 0)。

  • 旋转对象。如果对象必须在屏幕的投影平面中旋转,则旋转轴必须是 z 轴 (0, 0, 1)。如果对象必须绕垂直轴旋转,则旋转轴必须是 z 轴 (0, 1, 0)。对于绕水平轴的旋转,对象必须绕 x 轴 (0, 1, 0) 旋转。

  • 以枢轴回到其原始位置的方式平移矩形。
    这意味着对象必须按 (0, 1, 0) 进行翻译。

rotationMatrix = translate(0, 1, 0) * rotate * translate(0, -1, 0)

您必须使用 Matrix操作 Matrix.translateMMatrix.rotateM,它们创建一个新矩阵并将输入矩阵乘以新矩阵:

private float[] rotationMatrix = new float[16];
Matrix.setIdentityM(rotationMatrix, 0);

Matrix.translateM(rotationMatrix, 0, 0, 1, 0);
Matrix.rotateM(rotationMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(rotationMatrix, 0, 0, -1, 0);

请注意,旋转轴是 Matrix.rotateM 的最后 3 个参数。您必须根据需要设置它们。

关于java - 在同一轴上平移和旋转时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291850/

相关文章:

java - 提取单引号中存在的字符串数据

Java 正则表达式与换行符不匹配

java - JNA从java调用没有源代码的DLL

java - 是否可以指向特定的 JPanel

android - 为什么使用 FFMPEG 向视频添加水印后视频大小会增加?

c++ - 如何使用 glm::lookAt() 旋转对象?

android - com.android.internal.R.attr 和 android.R.attr 是否具有相同的值集?

android - 从 phonegap 重启设备

C++ 模板参数通过赋值推导

C# WPF 如何更改 RenderTransformOrigin 但保持位置?