首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用System.Numerics.Quaternion进行3D旋转

使用System.Numerics.Quaternion进行3D旋转
EN

Stack Overflow用户
提问于 2019-07-24 22:40:44
回答 3查看 1.7K关注 0票数 0

这里有人知道如何使用.net(4.6或更高版本) System.Numerics.Quaternion旋转vector3吗?

虽然我的数学很差,但我的理解只限于:四元数是4d“结构”,可以在3d中产生平移、缩放和旋转。

所以我有一个游戏,不能得到任何轮换。做看起来很明显的事情:改变四元数的W分量。(角度)然后读取向量产生缩放?!?有没有人可以帮我或者给我指个方向来寻求帮助?

我的当前旋转(非四元数)代码(X轴示例)

代码语言:javascript
复制
Private Sub Xaxis_rotation(ByVal angle As Double)
        Dim Cangle As Double = Cos(angle)
        Dim Sangle As Double = Sin(angle)
        Parallel.For(1, vertcount, Sub(f As Int32)
                                       Verts(f) -= modelcenter
                                       Verts(f).Y = (Verts(f).Y * Cangle) + (Verts(f).Z * Sangle)
                                       Verts(f).Z = (Verts(f).Z / Cangle) - (Verts(f).Y * Sangle)
                                       Verts(f) += modelcenter
                                   End Sub)
    End Sub

编辑

代码语言:javascript
复制
    Dim rotAxis As Vector3 = Vector3.UnitX
    Dim rotangle As Single =  0.785398 '45 degrees as radians
    Dim q As Quaternion = Quaternion.CreateFromAxisAngle(rotAxis, rotangle)
    Dim aVector As Vector3 = *vector to be rotated*

    'rotate
    Dim resultQ As Quaternion = q * Quaternion.CreateFromAxisAngle(aVector, 0) / q

    aVector.X = resultQ.X
    aVector.Y = resultQ.Y
    aVector.Z = resultQ.Z

q*Quaternion.CreateFromAxisAngle(aVector,0) /Q是我最好的猜测,但它不会产生旋转。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-29 22:34:05

这是最后的更新:

下面的代码使用Vector3.Transform比前面的方法更快,看起来也更准确,它定义了resultq四元数。

代码语言:javascript
复制
Public Shared Sub Rotate_point(ByRef Vect As Vector3, CentPoint As Vector3, angles As Vector3)
    Dim Rotator As Quaternion = Quaternion.CreateFromYawPitchRoll(angles.Y, angles.X, angles.Z) 'rotation in radians
    Vect -= CentPoint '---------The point to rotate around.
    Vect = Vector3.Transform(Vect, Rotator)
    Vect += CentPoint
 End Sub
票数 0
EN

Stack Overflow用户

发布于 2019-07-25 02:36:37

首先,四元数主要用于旋转,而不是缩放,当然也不是平移。

四元数类似乎不是一个非常用户友好的类。我可以根据文档推断如何使用,但我认为它不打算用作旋转的主要工具。

下面是一个用法示例(未测试):

代码语言:javascript
复制
Vector3 rotAxis = Vector3.UnitX;
Single rotAngle = 1.5; // in radians
Quaternion q = Quaternion.CreateFromAxisAngle(rotAxis, 
rotAngle);
Vector3 aVector = Vector3.One; //(1,1,1)

// rotate
Quaternion resultQ = q * (new Quaternion(aVector,0)) / q;

aVector.X = resultQ.X;
aVector.Y = resultQ.Y;
aVector.Z = resultQ.Z;

更有效的版本是:

代码语言:javascript
复制
// rotate
Quaternion resultQ = q * (new Quaternion(aVector,0)) * Quaternion.Conjugate(q);

因为共轭只是Q的向量部分的否定,而逆也需要计算Q的平方范数。

票数 0
EN

Stack Overflow用户

发布于 2019-07-26 09:14:34

作为一个脚注,这是我最终得到的一个很好的统一版本:

代码语言:javascript
复制
  Private Sub Nu_rotate(ByVal anglex As Double, ByVal angley As Double, ByVal anglez As Double, ByRef vec0 As Vector3)
    anglex = anglex / 180 * PI
    angley = angley / 180 * PI
    anglez = anglez / 180 * PI
    vec0 -= modelcenter 
    Dim q As Quaternion = Quaternion.CreateFromYawPitchRoll(angley, anglex, anglez)
    Dim resultQ As Quaternion = (q * New Quaternion(vec0, 0)) * Quaternion.Conjugate(q) ' rotation
    vec0.X = resultQ.X
    vec0.Y = resultQ.Y
    vec0.Z = resultQ.Z
    vec0 += modelcenter 
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57185542

复制
相关文章

相似问题

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