Unity中Quaternion四元数的使用

Quaternion又称四元数,由x,y,z和w这四个分量组成,四元数的乘法不符合交换律。从明确角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间。

一、欧拉角

A、B为transform属性,rotations为Quaternion属性。

//第一种方式:将Quaternion实例对象赋值给transform的rotation

    rotations.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);
    A.rotation = rotations;

//第二种方式:将三位向量代表的欧拉角直接赋值给transform的eulerAngle

    B.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);

二、SetFromToRotation方法-创建rotation实例

   Quaternion q = Quaternion.identity;
    q.SetFromToRotation(v1,v2);
    transform.rotation = q;

创建实例后可在各个transform上引用。

三、SetLookRotation方法-设置Quaternion实例的朝向

Quaternion q = Quaternion.identity;
q.SetLookRotation(v1,v2);
transform.rotation = q;

例:

Quaternion newrotation = Quaternion.LookRotation(targetdir, Vector3.up);
            transform.rotation = Quaternion.Lerp(transform.rotation, newrotation, dirspeed*Time.deltaTime);

这几天刚好做了一个镜头跟随:

Vector3 targetpos=player.position - offset;
Vector3 zdpos = player.position + offset.magnitude * Vector3.up;

Vector3 pos1 = Vector3.Lerp(targetpos, zdpos, 0.25f);
Vector3 pos2 = Vector3.Lerp(targetpos, zdpos, 0.5f);
Vector3 pos3 = Vector3.Lerp(targetpos, zdpos, 0.75f);

Vector3[] posarray = { targetpos, pos1, pos2, pos3, zdpos };

for (int i = 0; i < 5;i++)
        {
            RaycastHit hitinfo;
             if( Physics.Raycast(posarray[i],player.position-posarray[i],out hitinfo))
            {
                if(hitinfo.collider.gameObject.tag!="Player")
                {
                    continue;
                }
                else
                {
                    targetpos = posarray[i];
                    break;
                }
            }
            else
            {
                targetpos = posarray[i];
                break;
            }
        }
        this.gameObject.transform.position =Vector3.Lerp(transform.position, targetpos, Time.deltaTime * 1);
        
Quaternion newrotation = transform.rotation;
transform.LookAt(player.position);
transform.rotation = Quaternion.Lerp(transform.rotation, newrotation,Time.deltaTime*3);

实测中,由于人物走动,镜头跟随略有抖动(加入lerp已经好了很多),但是还是有,无论怎样改变lerp变化速度始终无法解决,正在查找优化办法。

哇,哭了,真的看不懂,仔细仔细看了看API中关于四元数的所有概念方法,肝不动的。希望以后找一个大神能解决下我的问题。

有两篇好的文章推荐。
1:这个小姐姐好厉害,可惜我数学不好,不能一点一点的看明白。
2:这个是方法概念总结。

2020.2.5 ---- 23:06
无聊翻了翻,突然发现原来自己曾经崇拜的小姐姐就是现在读书的作者。。
冯乐乐我爱了。

你可能感兴趣的:(Unity,案列学习总结)