首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从2个Vector3D中检索3个欧拉角

从2个Vector3D中检索3个欧拉角
EN

Stack Overflow用户
提问于 2013-03-25 23:10:26
回答 2查看 1.4K关注 0票数 1

如何从2个vector3D中检索3个欧拉角?

谢谢

塞德雷

代码语言:javascript
复制
dim vector1 = new Vector3D(0, 0, 1);

dim vector2 = new Vector3D(0.33, 0.45, 0.49);


dim myEuler = GetEulerFrom2Vector(vector1,vector2); // ?????

我在直角坐标系中工作,并使用ZYX euler约定

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-26 17:34:38

我使用旋转矩阵:

代码语言:javascript
复制
R11 R12 R13
R21 R22 R23
R31 R32 R33

R= Rz Ry Rx

代码语言:javascript
复制
if (R31 <> ±1)
    y1 = -sin-1(R31)
    y2 = pi + sin-1(R31)

    x1 = atan2 (R32/cos y1,R33/cos y1)
    x2 = atan2 (R32/cos y2,R33/cos y2)

    z1 = atan2( R21/cos y1,R11/cos y1)
    z2 = atan2( R21/cos y2,R11/cos y2)
        Else
    z= anything; can set to 0
    if (R31 = -1)
        y = -pi / 2
        x = z  + atan2(R12,R13)
     Else
         y = -pi / 2
         x  = -z + atan2(-R12,-R13)     
    End If
End If

https://truesculpt.googlecode.com/hg-history/38000e9dfece971460473d5788c235fbbe82f31b/Doc/rotation_matrix_to_euler.pdf

或者一个简单的版本

代码语言:javascript
复制
    result.X = Math.Atan2(R32, R33) * (180.0 / Math.PI)
    result.Y = Math.Atan2(-1 * R31, Math.Sqrt(R32 * R32 + R33 * R33)) * (180.0 / Math.PI)
    result.Z = Math.Atan2(R21, R11) * (180.0 / Math.PI)
票数 0
EN

Stack Overflow用户

发布于 2013-03-26 01:47:17

我们可以假设这两个向量是彼此垂直的vector1.Dot(vector2)==0吗?如果是,则找到第三个向量以形成一个坐标系

代码语言:javascript
复制
vector1 = vector1.Normalized();
vector2 = vector2.Normalized();
vector3 = VectorCross(vector1,vector2).Normalized();

其中VectorCross是3D向量叉积,Normalized()返回单位向量。

现在你的旋转矩阵E

代码语言:javascript
复制
 | vector1.x   vector2.x   vector3.x |
 | vector1.y   vector2.y   vector3.y |
 | vector1.z   vector2.z   vector3.z |

现在,您可以使用instructions here从旋转矩阵转到欧拉角。

PS。如果vector2vector1不垂直,可以在计算vector3后通过vector2 = CrossProduct(vector3, vector1).Normalized()使其垂直。

下面是我用来从两个轴到旋转矩阵的代码:

代码语言:javascript
复制
    public static mat3 AlignZX(vec3 unit_z, vec3 unit_x)
    {
        unit_x=unit_x.Normalized();
        unit_z=unit_z.Normalized();
        vec3 unit_y=unit_z.Cross(unit_x);
        unit_x=unit_y.Cross(unit_z);
        return mat3.Combine(unit_x, unit_y, unit_z);
    }
    public static mat3 AlignXY(vec3 unit_x, vec3 unit_y)
    {
        unit_x=unit_x.Normalized();
        unit_y=unit_y.Normalized();
        vec3 unit_z=unit_x.Cross(unit_y);
        unit_y=unit_z.Cross(unit_x);
        return mat3.Combine(unit_x, unit_y, unit_z);
    }
    public static mat3 AlignYZ(vec3 unit_y, vec3 unit_z)
    {
        unit_y=unit_y.Normalized();
        unit_z=unit_z.Normalized();
        vec3 unit_x=unit_y.Cross(unit_z);
        unit_z=unit_x.Cross(unit_y);
        return mat3.Combine(unit_x, unit_y, unit_z);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15618304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档