3dmax中的物体的方向是用一个四元数来记录的

 --如果你创建一个BOX 

--并选择它
--在MAXScript Listener 里输入:
--
aBox=$box01
--$Box:Box01 @ [-23.316830,-24.494915,0.000000]
a.rotation
--(quat 0 0 0 1)
--
--上面返回一个单位化的四元数(quat x y z w)
aBox.rotation.x
--0.0
aBox.rotation.y
--0.0
aBox.rotation.z
--0.0
aBox.rotation.w
--1.0
--
--四元数可以标记为quat(V,a),V是一个向量,a是绕V旋转
--的标量,也可以表示为quat(Vx,Vy,Vz,a),VxVyVz是分量
--但这里的x y z w 与V,a 的关系是:
--Vx*sin(a/2) Vy*sin(a/2) Vz*sin(a/2) cos(a/2)
--    x            y          z          w
--
--单位化的四元数quat  x*x + y*y + z*z + w*w=1
--单位向量V           Vx*Vx + Vy*Vy + Vz*Vz=1
--
--我们可以把问题简单化只考虑绕一个坐标轴的旋转
--假设只绕Z轴旋转V=(0,0,1),即Vx=0;Vy=0
--四元数简化为:quat(0  , 0 ,  sin(a/2), cos(a/2))
--X,Y同理
--这样就可以把四元数转换成绕三个轴的角度表示
--接着上面的输入:
select aBox
--OK
rotate $ (angleaxis 45 [0,0,1])
--OK aBox绕Z轴旋转了45度
abox.rotation
--(quat 0 0 0.382683 0.92388)
--返回新的四元数
--可以简单计算一下
angle_z=2*asin(aBox.rotation.z)
-- 45.0
angle_z=2*acos(aBox.rotation.z)
-- 45.0 返回值相同
--
rotate $ (angleaxis -90 [0,0,1])
--OK (绕Z轴反方向转90度)
angle_z=2*asin(aBox.rotation.z)
-- -45.0
angle_z=2*acos(aBox.rotation.z)
-- 45.0  (我们得到两个不同的值)
--原因很简单我不想解释,需要做的是判断两个值哪个是真
--cos(45)=cos(-45)所以这里要取-45值,这里必须得
--验证这样才能返回我们需要的取值范围[-180,180]
--这样我就得到了一个绕Z轴旋转的角度或者是X Y 轴
--
--如果绕多个轴旋转(其实是绕通过原点的任意轴旋转)
--Vx*sin(a/2) Vy*sin(a/2) Vz*sin(a/2) cos(a/2)
--如果通过上面的方法计算2*acos(a/2)得到的是绕任意轴旋转的角度
--不是绕坐标轴旋转的角度





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供一个四元数解算的实例。 假设我们有两个四元数,分别为: q1 = 0.7071 + 0.0i + 0.0j + 0.7071k q2 = 0.0 + 0.7071i + 0.0j + 0.7071k 现在我们想要求解它们的乘积 q1 * q2。 首先,我们可以使用四元数乘法的公式来计算它们的乘积: q1 * q2 = (0.7071 + 0.0i + 0.0j + 0.7071k) * (0.0 + 0.7071i + 0.0j + 0.7071k) = 0.0 + (0.7071*0.7071)i + 0.0j + (0.7071*0.7071)k = 0.5i + 0.5k 接下来,我们可以将这个结果转换为一个旋转矩阵。为了做到这一点,我们需要将四元数 q1 * q2 转换为一个单位四元数,然后将其转换为一个旋转矩阵。 首先,我们需要计算 q1 * q2 的模长,即: |q1 * q2| = sqrt((0.5)^2 + (0.5)^2) = 0.7071 然后,我们可以将 q1 * q2 除以它的模长,得到一个单位四元数: q = (0.5/0.7071)i + (0.5/0.7071)k = 0.7071i + 0.7071k 最后,我们可以将这个单位四元数转换为一个旋转矩阵。根据四元数到旋转矩阵的转换公式,我们可以得到: R = [1-2(q2^2+q3^2), 2(q1*q2-q0*q3), 2(q1*q3+q0*q2); 2(q1*q2+q0*q3), 1-2(q1^2+q3^2), 2(q2*q3-q0*q1); 2(q1*q3-q0*q2), 2(q2*q3+q0*q1), 1-2(q1^2+q2^2)] 其,q0 = cos(theta/2),q1 = x*sin(theta/2),q2 = y*sin(theta/2),q3 = z*sin(theta/2),theta 是旋转的角度,(x,y,z) 是旋转轴的方向向量。 在这个例子,我们有 q = 0.7071i + 0.7071k,因此: q0 = cos(theta/2) = cos(45/2) = 0.9239 q1 = x*sin(theta/2) = 0 q2 = y*sin(theta/2) = 0.7071*sin(45/2) = 0.3827 q3 = z*sin(theta/2) = 0.7071*sin(45/2) = 0.3827 将这些值代入旋转矩阵公式,我们可以得到: R = [0.5, 0.5, -0.7071; -0.5, 0.5, 0.7071; 0.7071, -0.7071, 0] 因此,q1 * q2 对应的旋转矩阵是: R = [0.5, 0.5, -0.7071; -0.5, 0.5, 0.7071; 0.7071, -0.7071, 0]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值