石家庄网站开发工程师招聘网秦皇岛乾兴建设招聘

当前位置: 首页 > news >正文

石家庄网站开发工程师招聘网,秦皇岛乾兴建设招聘,网站开发项目进度完成表,网站首页被k怎么办前言#xff1a;欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角#xff0c; 我们将Inspector面板设置成Debug模式#xff0c;此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转#xff0c;一组欧拉旋转过程中…前言欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角 我们将Inspector面板设置成Debug模式此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转一组欧拉旋转过程中相对的轴向不会发生变化。 Transform.Rotate(new Vector3(30,60,30))它代表执行了一组欧拉旋转它相对的是旋转前的局部坐标朝向。正是这种顺规和轴向的定义导致了万向节死锁的自然形成。 举个例子就是在世界空间下按照X-Y-Z去拖拽旋转轴当拖拽到Z轴旋转时X和Y轴的欧拉角都会改变如果按照Z-X-Y去按顺序拖拽则轴与轴之间的数值不会影响。 代码表示:方式1和方式3的旋转结果相同 //方式一 transform.Rotate(30,60,30,Space.World);//方式二X-Y-Z transform.Rotate(30,0,0,Space.World); transform.Rotate(0,60,0,Space.World); transform.Rotate(0,0,30,Space.World);//方式三Z-X-Y transform.Rotate(0,0,30,Space.World); transform.Rotate(30,0,0,Space.World); transform.Rotate(0,60,0,Space.World); 欧拉角和四元数的相互转换 // 欧拉角表示旋转 Vector3 eulerRotation new Vector3(30f, 60f, 30f); // 将欧拉角转换为四元数 Quaternion quaternionRotation Quaternion.Euler(eulerRotation); // 将四元数转换为欧拉角 Vector3 convertedEulerAngles quaternionRotation.eulerAngles; 局部坐标系和世界坐标系的转换 transform.up transform.rotation * Vector3.up; transform.right transform.rotation * Vector3.right; transform.forward transform.rotation * Vector3.forward; 1.Transform旋转系列 (1)transform.Rotate有万向锁 public void Rotate (Vector3 eulers, Space relativeTo Space.Self); public void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo Space.Self); 描述这两种方式的旋转结果相同应用一个围绕 Z 轴旋转 zAngle 度、围绕 X 轴旋转 xAngle度、围绕 Y 轴旋转 yAngle 度按此顺序的旋转。Space.Self代表局部坐标系Space.World代表世界坐标系。 public void Rotate (Vector3 axis, float angle, Space relativeTo Space.Self); 描述用给定角度定义的度数围绕给定轴旋转该对象。 我们可以看个这样的例子 transform.Rotate(Vector3.up, 30, Space.Self); transform.Rotate(transform.up, 30, Space.World); 这两种旋转方式的结果是一致的。 (2)transform.RotateAround有万向锁 public void RotateAround (Vector3 axis, float angle); public void RotateAround (Vector3 point, Vector3 axis, float angle); 描述第一个参数为围绕的中心点第二个参数为物体围绕转动的轴方式1和方式2的区别在于方式1围绕的中心点就是自己。 transform.RotateAround和transform.Rotate的区别就好比地球公转和自转的区别。 (3)transform.LookAt无万向锁 public void LookAt (Transform target, Vector3 worldUp Vector3.up); public void LookAt (Vector3 worldPosition, Vector3 worldUp Vector3.up); 描述旋转变换使向前矢量指向 target 的当前位置。 主要是这句话的理解 “随后它会旋转变换以将其向上方向矢量指向 worldUp 矢量暗示的方向。 如果省略 worldUp 参数则该函数会使用世界空间 y 轴。如果向前方向垂直于 worldUp则旋转的向上矢量将仅匹配 worldUp 矢量。” 什么意思呢就是LookAt的第一个参数决定了forward轴蓝轴的朝向但是怎么旋转到目标位置还需要再确定一个轴但是第二个参数并不等价于up轴绿轴指向worldUp,只是在保证forward轴蓝轴指向物体时会尽量保证在旋转的过程中up轴指向worldUp大致的方向且不管怎么旋转up轴和worldUp夹角都不会超过90°。 2.Quaternion旋转系列无万向锁 创建旋转: (1)Quaternion.LookRotation public Quaternion LookRotation (Vector3 forward, Vector3 upwards Vector3.up); 描述物体的Z 轴指向forwardX 轴指向 forward 和 upwards 的差积Y 轴指向 Z 和 X 之间的差积对齐。确定轴的顺序是Z-X-Y的顺序。 与LookAt的区别 LookAt()与LookRotation()的参数都相似但前者是将游戏对象的z轴指向参数所表示的那个点而后者是将游戏对象的z轴指向参数所表示的向量的方向。 transform.LookAt(targetCube.transform); transform.rotation Quaternion.LookRotation(targetCube.transform.position-transform.position); 这两行代码的效果是等价的。 (2)Quaternion.FromToRotation public static Quaternion FromToRotation (Vector3 fromDirection, Vector3 toDirection); 描述创建一个从 fromDirection 旋转到 toDirection 的旋转。 通常情况下您使用该方法对变换进行旋转使其的一个轴例如 Y 轴跟随世界空间中的目标方向 /toDirection/。 效果等价于Quaternion.SetFromToRotation (3)Quaternion.AngleAxis public static Quaternion AngleAxis (float angle, Vector3 axis); 描述创建一个围绕 axis 旋转 angle 度的旋转。 下面是实现绕着世界Y轴自转的小案例 private void Update(){transform.rotationQuaternion.AngleAxis(Time.deltaTime*60,Vector3.up);} 效果预览 操作旋转: (4)Quaternion.Slerp public static Quaternion Slerp (Quaternion a, Quaternion b, float t); 描述在四元数 a 与 b 之间按比率 t 进行球形插值。参数 t 限制在范围 [0, 1] 内。 (5)Quaternion.RotateTowards public static Quaternion RotateTowards (Quaternion from, Quaternion to, float maxDegreesDelta); 描述将 from 四元数朝 to 旋转 maxDegreesDelta 的角度步长但请注意 该旋转不会过冲。 如果 maxDegreesDelta 为负值则向远离 to 的方向旋转直到旋转 恰好为相反的方向。 与Quaternion.FromToRotation的区别 RotateTowards是操作旋转就是一点点的把from插值到to。而FromToRotation它代表的是一个完整的旋转过程你需要提供一个起始旋转和目标旋转方法将返回一个表示从起始方向到目标方向的旋转。 3.刚体旋转系列 (1)Rigidbody.MoveRotation public void MoveRotation (Quaternion rot); 刚体插值在渲染的任意中间帧中的两个旋转之间平滑过渡方法必须写在FixedUpdate,参数是四元数。相比于其他所有的旋转方式他可以实现带动在平台上的物体一起旋转。 实现带动效果旋转物的刚体必须要勾选isKinematic切记。 代码如下 public float speed;private float angle;private Rigidbody rb;private void Start(){rb GetComponentRigidbody();}private void FixedUpdate(){angle Time.fixedDeltaTime * speed;rb.MoveRotation(rb.rotation*Quaternion.Euler(Vector3.up*angle));} (2)Rigidbody角速度angularVelocity 描述表示刚体的角速度即物体绕其自身轴旋转的速度。它是一个三维矢量每个分量分别表示绕相应轴的旋转速度。 private void Update(){//绕y轴匀速运动rb.angularVelocity new Vector3(0, 3, 0);} 它也可以带动平台上的物体一起跟着旋转。 使用角速度需要注意的是不能勾选isKinematic。 官方说不建议直接修改angularVelocity会造成失真。但我没遇到过什么问题我的理解是直接修改内部属性不太符合编程习惯会破坏完整性。 参考链接学习笔记3 - 简书