【问题标题】:What's the math behind the setRotateM function in android.opengl.matrix?android.opengl.matrix 中的 setRotateM 函数背后的数学原理是什么?
【发布时间】:2017-01-17 06:30:42
【问题描述】:

android.opengl.matrix 包中有一个setRotateM 函数,它

将欧拉角转换为旋转矩阵。

实现的主要部分是:

rm[rmOffset + 0]  =   cy * cz;
rm[rmOffset + 1]  =  -cy * sz;
rm[rmOffset + 2]  =   sy;
rm[rmOffset + 3]  =  0.0f;

rm[rmOffset + 4]  =  cxsy * cz + cx * sz;
rm[rmOffset + 5]  = -cxsy * sz + cx * cz;
rm[rmOffset + 6]  =  -sx * cy;
rm[rmOffset + 7]  =  0.0f;

rm[rmOffset + 8]  = -sxsy * cz + sx * sz;
rm[rmOffset + 9]  =  sxsy * sz + sx * cz;
rm[rmOffset + 10] =  cx * cy;
rm[rmOffset + 11] =  0.0f;

rm[rmOffset + 12] =  0.0f;
rm[rmOffset + 13] =  0.0f;
rm[rmOffset + 14] =  0.0f;
rm[rmOffset + 15] =  1.0f;

在哪里cx = cos(angleOnX), sz = sin(angleOnZ) etc.

这串代码会给出一个 4x4 矩阵:

[  cy*cz, cx*sz + cx*cz*sy, sx*sz - cz*sx*sy, 0]
[ -cy*sz, cx*cz - cx*sy*sz, cz*sx + sx*sy*sz, 0]
[     sy,           -cy*sx,            cx*cy, 0]
[      0,                0,                0, 1]

同时,分别给定围绕 x、y、z 轴的旋转矩阵

Rx = [ 1,  0,   0, 0]
     [ 0, cx, -sx, 0]
     [ 0, sx,  cx, 0]
     [ 0,  0,   0, 1]

Ry = [  cy, 0, sy, 0]
     [   0, 1,  0, 0]
     [ -sy, 0, cy, 0]
     [   0, 0,  0, 1]

Rz = [ cz, -sz, 0, 0]
     [ sz,  cz, 0, 0]
     [  0,   0, 1, 0]
     [  0,   0, 0, 1]

我能找到的最相似的作文是

(Rx * Ry * Rz)^T = Rz^T * Ry^T * Rx^T = 
[  cy*cz, cx*sz + cz*sx*sy, sx*sz - cx*cz*sy, 0]
[ -cy*sz, cx*cz - sx*sy*sz, cz*sx + cx*sy*sz, 0]
[     sy,           -cy*sx,            cx*cy, 0]
[      0,                0,                0, 1]

在 android 的实现 R 和原始乘法 Rxyz^T 之间, R(1,2) R(1,3) R(2,2) R(2,3) 分量略有不同,其中cx 和sx 切换。

考虑到android.opengl.matrix 是一个应用广泛、经过时间考验的软件包,我一定是做错了什么。

我有两个问题: 1. 这种差异是如何发生的? 2. 为什么是(Rx * Ry * Rz)^T?我想是Rz * Ry * Rx

【问题讨论】:

    标签: android matrix opengl-es rotational-matrices euler-angles


    【解决方案1】:

    问题 1:在使用行或列向量进行特定旋转顺序的右手系统中只有一个结果。所以其中一个公式是错误的。也许你包含了投影矩阵中的一些术语。

    问题 2:它是 x,y,z 顺序,因为旋转是按该顺序(或相反)完成的。

    android 版本的差异可能是由于 gui 是左手系统。

    【讨论】:

    • 您能否详细说明您在哪里看到这种情况?我找不到您在操作代码中描述的更改。据我所知,sx 是由cx 切换的。从cos(x) 更改为sin(x) (在我看来)与交换无关?如果您指的是问题 2,这些是不可交换的矩阵。
    • [ cycz, cxsz + cxczsy, sxsz - czsxsy, 0] 和 cycz, cxsz + czsxsy, sxsz - cxczsy, 0]
    • 我在这里仍然看不到任何只有乘法顺序发生变化的术语。它们要么相同,要么至少有一个罪已变为 cos。
    • 第一个公式来自android.opengl.matrix,第二个是用matlab符号工具箱计算的。我看不出哪一个是错的,所以这个问题。
    • 可能是由于 gui 中的左手系统?
    猜你喜欢
    • 2020-02-15
    • 2019-01-04
    • 1970-01-01
    • 2012-05-04
    • 2021-02-15
    • 2021-09-21
    • 2012-08-23
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多