查看: 2356|回复: 0
打印 上一主题 下一主题

Unity3d 四元数 Quaterion

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-8-28 16:37:28 |只看该作者 |倒序浏览
Quaterion
四元数可理解为一个旋转轴向量和一个旋转角度。注意:这里不是点绕轴旋转,而是一个矢量绕轴旋转。旋转后得到的也是一个矢量。因此,如果想要计算某个点P绕着某个固定的轴旋转一个角度后的点的坐标,那么首先需要在轴上固定一点S, 连接SP组成矢量。用四元数计算旋转后的矢量,再加上S点坐标,就得到了旋转后的坐标。
例:计算某点绕某一轴旋转一定的角度后的点的坐标
static function RotateAroundPoint(point : Vector3, pivot : Vector3, angle : Quaternion) : Vector3
{
     var finalPos : Vector3 = point - pivot;
     //Center the point around the origin
     finalPos = angle * finalPos;
     //Rotate the point.
     finalPos += pivot;
     //Move the point back to its original offset.
     return finalPos;
}
var newPos = SomeClass.RotateAroundPoint(Vector3.forward, Vector3.zero, Quaternion.Euler(0, 90, 0) );
Debug.Log(newPos);
//Prints (1, 0, 0) or is it (-1, 0, 0 )?  Something like 2.html
四元数其他网址
http://hi.baidu.com/czx_main/blog/item/71468e3690f438390a55a992.html
http://oulehui.blog.163.com/blog/static/796146982011273184592/
http://www.cnblogs.com/softimagewht/archive/2010/11/16.html
一般来说,三维空间上没有顺时针或者逆时针的概念。只有当我们确定了一个视线方向时,才区分顺时针和逆时针。大部分四元数规定都是,从旋转轴的反方向看过去,逆时针的角度为正。比如你的旋转轴为z轴正方向(例如从屏幕伸出来的那个轴),那么我向屏幕望去(也就是z轴反方向)看去,逆时针旋转的角度为正,顺时针为负。除非你用的四元数做了特殊规定,否则大部分都是这样的。
2,Gimbal Lock万向锁和EulerAngle欧拉角
Gimbal Lock 视频:http://www.cnblogs.com/mavaL/articles/1860354.html

2011-03-24
Transform
1,.transform.forward 物体在世界坐标系下z轴的方向,如下图所示
transform.forward = (1,0,0)而Vector3.forward则表示世界坐标系z轴的方向,即:(0,0,1)
测试实例:
transform.Translate(transform.forward*Time.deltaTime);//
物体每秒钟将相对自身坐标系移动(1,0,0)个单位,即:向下移动。
transform.Translate(Vector3.forward*Time.deltaTime);//
物体每秒钟将相对自身坐标系移动(0,0,1)个单位,即:向右移动。
2,transform. Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self)
       注意eulerAngle的旋转是有顺序的。Unity中是按照z-x-y的顺序旋转的。
3,transform.RoateAround (point : Vector3, axis : Vector3, angle : float)
可以实现一个物体绕另一个物体旋转. 例:
transform.RotateAround(_target.transform.position,Vector3.up,Time.deltaTime*_speed);// 绕_target物体旋转,旋转轴为y轴
(Vector3.up, Time.deltaTime*_speed);//绕y轴旋转,注意区分:
transform.RotateAround(transform.up, Time.deltaTime*_speed);
4,function TransformDirection (direction : Vector3) : Vector3
//将局部坐标转换为世界坐标,例:
Vector3 vecRet = transform.TransformDirection(Vector3.right);//将局部坐标系下(1,0,0)点转换为世界坐标系下的点。vecRet的值为(0,0,-1).该值和transform.right的值等价,
5,InverseTransformDirection(Vector3.right)返回值为(0,0,-1),如下图所示:
例:
relativePosition = cameraTransform.InverseTransformDirection(transform.position - cameraTransform.position);
6,transform.TransformPoint(2,0,0);//
Let's say that if you hold your right arm straight out to the side, the local-space coordinate (2, 0, 0) is at the tips of your fingers. No matter where you go or how you orient yourself, as long as you keep your arm straight out, the tips of your fingers will still be at exactly the same location in local space.
However, as you move and re-orient yourself, the world-space position of the tips of your fingers is constantly changing. This is what TransformPoint() does; it takes the local-space coordinate ((2, 0, 0) in this case) and converts it to a world-space coordinate based on the current transform for the object (the object being you in our example).
例:在距离当前物体的右侧2个单位的距离的位置处创建一个_target物体。
Instantiate(_target, transform.TransformPoint(Vector3.right*2), transform.rotation);
.InverseTransformPoint()将世界坐标系下的点转化成相对坐标系下的点,如:在Inspector面板上显示的物体的坐标为世界坐标系下的点,如果调用该函数的话,则返回值为(0,0,0)
transform.InverseTransformPoint(new Vector3(2630.192f, 763.5179f,1161.068f));
7, static function FromToRotation (fromDirection : Vector3, toDirection : Vector3)
将物体的fromDirection方向旋转到toDirection方向,例:将物体x、z的角平分线的方向(1,0,1)旋转至世纪坐标系z轴的方向。
public Vector3 _fromDir;
public Vector3 _toDir;
Quaternion q = Quaternion.identity;
q.SetFromToRotation(_fromDir, _toDir);
//等价于 q = Quaternion.FromToRotation(_fromDir, _toDir);
transform.rotation = q;
print(transform.right.ToString());
旋 转 前
旋 转 后
8,Quaternion.()
         建立一个旋转使z轴朝向view  y轴朝向up.其功能与LookRotation一样
9,Quaternion.AngleAxis(angle : float, axis:Vector3)
Create a rotation which rotates angle degrees around axis
创建一个绕着axis旋转angle度的旋转,例:
transform.rotation = Quaternion.AngleAxis(30.0f, Vector3.up);//将物体的旋转角度设置成绕Y轴旋转30度。无论物体以前的旋转如何,最终的旋转就是上面代码所设置的旋转。如图所示:
转 前
旋 转 后
10,Quaternion.Angle()
计算两个旋转之间的夹角。跟Vector3.Angle(a : Quaternion, b : Quaternion) 作用一样。
参考网址:http://www.cnblogs.com/softimagewht/archive/2010/11/16.html

11,unity3d 使用的是左手坐标系,即:Z轴方向),握向右方(X轴方向),
大拇指的方向即为Y轴方向。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-13 20:29 , Processed in 0.137145 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部