这个东西不理解也就算了,每次还都不会使用,烦死了,这次记录一下。
Quaternion.AngleAxis(角度,沿axis轴)方法
返回一个旋转,意义是绕axis轴旋转angle
Quaterion*Quaternion
在lq的旋转状态下进行rq的旋转意义
Unity当中的旋转方向(世界坐标系是左手坐标系)
y: 正是往右边旋转
x: 正是下面旋转
z: 正是往左边旋转
速度*时间=某时移动矢量
为了确保同时按下w和d移动速度不变(因为两个方向的速度矢量肯定最后向量长度会变成根号2),可以把移动向量Normalize化
Vector3.Normalize()
静态方法:使向量的长度为1
Quaternion*Vector3
返回Vector3,意义是让Vector3旋转一个q的角度然后返回新的向量。
Quaternion.FromToRotation(v1,v2)
创建一个从v1到v2的旋转
Mathf.Acos(cos值)
返回弧度
Quaternion.AngleAxis(角度,axis)
绕axis轴旋转angle,创建一个旋转,角度是矢量
q1.RotationTo(q2)
返回一个旋转,目标是让原始旋转q1 能够转向 q2。
q.Right() 以及 q.Foward()
意义跟v.Right(),v.Forward() 是一样的,代表物体当前旋转的right,forward局部方向向量。
q.Inverse()
返回反向的旋转。 沿y正45,反着就是负45了。
transform.right
在想想transform.方向这种东西,代表的是物体的局部right轴或者up轴,在物体什么旋转都没有的时候,当然就代表跟世界的是一样的,例如Vector3.right,当然经过一个矩阵的旋转之后,例如绕y旋转,right轴也会受到影响,自然Vector3.right*旋转矩阵计算出来的新的right轴就是物体的局部right轴。
测试代码。
float angle = Vector3.Angle(Vector3.right, transform.right);
// 假设angle 是30度
angle = 30;
//Vector3 newV = Quaternion.AngleAxis(angle,Vector3.up) *Vector3.right;
//Debug.LogError($"newV:{newV}");
//transform.right = newV;
//Vector3 newV = Quaternion.AngleAxis(angle, Vector3.right) * Vector3.right;
Vector3 newV = Quaternion.AngleAxis(angle, Vector3.right) * Vector3.up;
Debug.LogError($"newV:{newV}");
transform.up = newV;
所以其实我想说的是一个代表旋转的最终的旋转四元数*世界轴向量得出来的就是局部轴向量
Vector3 lRight = transform.rotation.Right();
Vector3 lForward = transform.rotation.Forward();
Debug.LogError($"qlRight: {lRight}");
Debug.LogError($"qlForward: {lForward}");
lRight = transform.right;
lForward = transform.forward;
Debug.LogError($"lRight:{lRight}");
Debug.LogError($"lForward:{lForward}");
lRight = transform.rotation * Vector3.right;
lForward = transform.rotation * Vector3.forward;
Debug.LogError($"lRight:{lRight}");
Debug.LogError($"lForward:{lForward}");
速度:每秒xx的单位
帧速:速度/每秒多少帧
Input.GetAxis()的值范围
鼠标的话范围也许在1-20之间。
左上 正
右下 负
Mouse1 的话按下时1,松开是0
推荐学习文章:
复数是怎么代表角度的:https://www.shuxuele.com/algebra/complex-number-multiply.html , 转化成极坐标,在极坐标数学规律上寻找几何意义
四元数与旋转矩阵 https://openhome.cc/Gossip/WebGL/Quaternion.html