- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
形象解说四元数
By daode1212 2016-03-16
前言:
四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton,1805-1865)在1843年发明的数学概念。四元数四元数的乘法不符合交换律(commutative law)
四元数理论创立人:William Rowan Hamilton,1805-1865
一,四元数的几种表示形式:
OpenTK中,为建立四元数提供了多种方式:
public Quaternion(float x, float y, float z, float w);
public Quaternion(OpenTK.Vector3 v, float w);
例如用Quaternion(float x, float y, float z, float w):
OpenTK.Quaternion q = new OpenTK.Quaternion(0.51f, -0.71f, 0.31f, 0.7071f);
1, 四元数建构方式一:
?? ?i^2=j^2=k^2=-1?? ?ij=-ji=k,jk=-kj=i,ki=-ik=j
q=w+ix+jy+kz,i,j,k分别对应轴向量X(1,0,0),Y(0,1,0),Z(0,0,1)
2, 四元数建构方式二:转动角之半+轴向量的方向余弦:
3, 四元数建构方式三:转动角之半+单位球面上的点:
二,四元数的OpenTK中有:
1, q.Length;
返回值是:
2, q.LengthSquared;
返回值是:,与点积(内积)q·q是一致的。
三,四元数的
四元数建构方式二、方式三在这方面有明显优势。
四,四元数的S=(q+q*)/2;
2、四元数的向量部:V=(q-q*)/2;
五,四元数的四元数的bool b = q2.Equals(q1);
七,四元数的 Multiply( q,*)
加法的定义:
public static OpenTK.Quaternion Add(OpenTK.Quaternion left, OpenTK.Quaternion right)
减法的定义:
public static OpenTK.Quaternion Sub(OpenTK.Quaternion left, OpenTK.Quaternion right)
乘法有二种:
public static OpenTK.Quaternion Multiply(OpenTK.Quaternion quaternion, float scale)
public static OpenTK.Quaternion Multiply(OpenTK.Quaternion left, OpenTK.Quaternion right)
注意,乘法没有交换律:q2*q1 != q1*q2
乘法的定义和数学算法如下:
例如:
四元数与标量相乘,是对原四元数在正方向或反方向进行伸缩:
OpenTK.Quaterniond q2 = OpenTK.Quaterniond.Multiply(q1, 0.5f); //q1*0.5
四元数与四元数相乘,是两种旋转的叠加作用:
OpenTK.Quaterniond q3 = OpenTK.Quaterniond.Multiply(q2, q1); //q2*q1
q3 = q1·q2 =
(a1a2-b1b2-c1c2-d1d2) +????? i(a1b2+b1a2+c1d2-d1c2) +????? j(a1c2+a2c1+b2d1-d2b1) +????? k(a1d2+d1a2+b1c2-c1b2)
四元数与四元数相乘是不容易心算的游戏,就方向的变化也很难摸准,见下例:
//向量连乘效果图:
private void QuatMults() //向量连乘效果图
{
qs[0] = new OpenTK.Quaternion(.5f, -.6f, -.7f, .4f);
DwQuat(qs[0], Color.FromArgb(255, 255, 0), 4f);
qs[1] = new OpenTK.Quaternion(-.6f, -.5f, .4f, .6f);
DwQuat(qs[1], Color.FromArgb(0, 255, 255), 4f);
for (int i = 0; i 255; i++)
文档评论(0)