Quaternion是如何用Vector3改变方向的?

时间:2022-09-05 14:33:51
看刚体的文章,刚体的旋转都是用一个orientation : Quaternion代表方向的。
文章中讲要用angularVelocity : Vector3改变这个方向。
但是在四元数中,没有用向量来改变四元数值的理论啊?这二者是进行运算的?

另外,还有如何用Torque : Vector3和inersiaTensor : Matrix3来求angularAcceleration : Vector3
运算关系式是什么呀?谢谢!

18 个解决方案

#1


三个轴的旋转角度也可以存为一个Vector3

#2


但是一般文章中都只推荐用Quaternion,而不用YawPitchRoll或是AxisAngle
另外的话,因为在RigidBody中,改变方向的是角速度anglurVelocity : Vector3
是一个向量,如果用YawPitchRoll的话二者之间的运算可能就很麻烦了吧。。。

#3


我觉得应该是一个vec4向量。XYZ存有旋转轴,W存有旋转角度

#4


楼主把你现在在看的书名发出来吧

#5


就是那个GAME PHYSICS ENGINE DEVELOPMENT,而且是带源代码的。
另外Quaternion在数据结构上讲就是Vector4吧。
但是按武林外传中的说法:菜刀是不值那么多钱的,关键是入了菜刀门之后的待遇。。。
也就是说Quaternion的数据结构是很简单的,关键是建立在其上的数学理论和运算比较难懂。

#6


数学!线代!

#7


引用 6 楼 gamemagic 的回复:
数学!线代!

是的啊,但是书上貌似没有Quaternion与Vector3运算的相关方法吧。。。

#8


四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i + y*j + z*k + w)*(x*i + y*j + z*k + w)根据普通分配率展开合并后的结果,直接用directx的四元数乘法也可以

真对你说的solver中的角速度与四元数的转换时这样的:

假如角速度为w, 那么dt时间角度为 L =w*dt, 
那么根据这个L构造一个四元数, 四元数的角度旋转角为L向量的长度,就是a=|L|,
四元数的旋转轴为 u = L/|L|, 就是L的单位向量

构造的四元数为 q = ( u*sin(a/2), cos(a/2), 跟前面一样

最后把这个叠加到原来的旋转上 q0 = q*q0; 其中q0是原来物体的旋转四元数。

#9


引用 8 楼 xingzhe2001 的回复:
四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i……

谢谢前辈啊,有些看明白啦。
只是那个L = w * dt还是有些糊涂,怎么就可以从那个L求出轴与角哩。
那个L = w * dt在几何上是如何理解的哩。

#10


引用 8 楼 xingzhe2001 的回复:
四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i……

看样子您是自己实现过物理引擎的哩?您是自己既写图形又做物理的高人前辈吗。

#11


行者从2001年就在CSDN混啊?

#12


既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt

#13


引用 12 楼 xingzhe2001 的回复:
既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt


那个从L这得到轴是因为三维空间中角速度向量就是那么定义的, 方向为轴的方向,向量的长度为旋转的角度。


引用 11 楼 gamemagic 的回复:
行者从2001年就在CSDN混啊?


前几年潜水,现在才敢回答问题哈。

#14


引用 12 楼 xingzhe2001 的回复:
既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt

那就太谢谢前辈啦,只是有最后一个小问题哈。
就是u = L / |L| 为什么是旋转轴呀,怎么也想不通。

#15


参考百度百科关于三维角速度
http://baike.baidu.com/view/84858.htm

参考wiki关于三维角速度
http://en.wikipedia.org/wiki/Angular_velocity

The magnitude is the angular speed, and the direction describes the axis of rotation. 

#16


引用 14 楼 csharp_xinbing 的回复:
那就太谢谢前辈啦,只是有最后一个小问题哈。
就是u = L / |L| 为什么是旋转轴呀,怎么也想不通。



因为就是这么定义的... 这种定义挺方便,既有方向,又有旋转角度。至于为什么这么定义以及推导,得找当初发明时的论文了

#17


你潜水时我小学还没读到一半…55555

#18


旋转的角度是弧度,当角速度为1度美秒的时候,角速度 w 就是旋转轴, w = u.
这样如果角速度是3度每秒, 那么 w = 3u, 可以看出 w/|w| = u, |w|=3

#1


三个轴的旋转角度也可以存为一个Vector3

#2


但是一般文章中都只推荐用Quaternion,而不用YawPitchRoll或是AxisAngle
另外的话,因为在RigidBody中,改变方向的是角速度anglurVelocity : Vector3
是一个向量,如果用YawPitchRoll的话二者之间的运算可能就很麻烦了吧。。。

#3


我觉得应该是一个vec4向量。XYZ存有旋转轴,W存有旋转角度

#4


楼主把你现在在看的书名发出来吧

#5


就是那个GAME PHYSICS ENGINE DEVELOPMENT,而且是带源代码的。
另外Quaternion在数据结构上讲就是Vector4吧。
但是按武林外传中的说法:菜刀是不值那么多钱的,关键是入了菜刀门之后的待遇。。。
也就是说Quaternion的数据结构是很简单的,关键是建立在其上的数学理论和运算比较难懂。

#6


数学!线代!

#7


引用 6 楼 gamemagic 的回复:
数学!线代!

是的啊,但是书上貌似没有Quaternion与Vector3运算的相关方法吧。。。

#8


四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i + y*j + z*k + w)*(x*i + y*j + z*k + w)根据普通分配率展开合并后的结果,直接用directx的四元数乘法也可以

真对你说的solver中的角速度与四元数的转换时这样的:

假如角速度为w, 那么dt时间角度为 L =w*dt, 
那么根据这个L构造一个四元数, 四元数的角度旋转角为L向量的长度,就是a=|L|,
四元数的旋转轴为 u = L/|L|, 就是L的单位向量

构造的四元数为 q = ( u*sin(a/2), cos(a/2), 跟前面一样

最后把这个叠加到原来的旋转上 q0 = q*q0; 其中q0是原来物体的旋转四元数。

#9


引用 8 楼 xingzhe2001 的回复:
四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i……

谢谢前辈啊,有些看明白啦。
只是那个L = w * dt还是有些糊涂,怎么就可以从那个L求出轴与角哩。
那个L = w * dt在几何上是如何理解的哩。

#10


引用 8 楼 xingzhe2001 的回复:
四元数的定义是 x*i + y*j + z*k + w, 就是一个3维的虚数。 i,j,k互相垂直。在表示旋转的时候,加入旋转轴u = (ux,uy,uz), 旋转角度 a, 那么四元数为
q = ( sin(a/2)*u, a) = ( sin(a/2)*ux, sin(a/2)*uy, sin(a/2)*uz, cos(a/2))

四元数的乘法表示两个旋转先后发生。 乘法就是 (x*i……

看样子您是自己实现过物理引擎的哩?您是自己既写图形又做物理的高人前辈吗。

#11


行者从2001年就在CSDN混啊?

#12


既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt

#13


引用 12 楼 xingzhe2001 的回复:
既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt


那个从L这得到轴是因为三维空间中角速度向量就是那么定义的, 方向为轴的方向,向量的长度为旋转的角度。


引用 11 楼 gamemagic 的回复:
行者从2001年就在CSDN混啊?


前几年潜水,现在才敢回答问题哈。

#14


引用 12 楼 xingzhe2001 的回复:
既写图形又作物理的参考这两个人
http://www.cnblogs.com/jiangwei
http://www.cnblogs.com/fishboy82

L = w*dt很容易理解, w是角速度, 路程等于速度*时间,那么dt时间后转过的角度就是w*dt

那就太谢谢前辈啦,只是有最后一个小问题哈。
就是u = L / |L| 为什么是旋转轴呀,怎么也想不通。

#15


参考百度百科关于三维角速度
http://baike.baidu.com/view/84858.htm

参考wiki关于三维角速度
http://en.wikipedia.org/wiki/Angular_velocity

The magnitude is the angular speed, and the direction describes the axis of rotation. 

#16


引用 14 楼 csharp_xinbing 的回复:
那就太谢谢前辈啦,只是有最后一个小问题哈。
就是u = L / |L| 为什么是旋转轴呀,怎么也想不通。



因为就是这么定义的... 这种定义挺方便,既有方向,又有旋转角度。至于为什么这么定义以及推导,得找当初发明时的论文了

#17


你潜水时我小学还没读到一半…55555

#18


旋转的角度是弧度,当角速度为1度美秒的时候,角速度 w 就是旋转轴, w = u.
这样如果角速度是3度每秒, 那么 w = 3u, 可以看出 w/|w| = u, |w|=3