对Unity3D 中Quaternion一些整理

这篇博客主要整理了Unity3D中的Quaternion四元数概念及其应用,包括使用Quaternion.AngleAxis进行角轴旋转,使用Quaternion.Lerp进行插值运算,以及如何通过Quaternion.Slerp平滑旋转物体,同时介绍了Quaternion.LookRotation实现自由视角调整的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quaternion 中文是四元数。记得计算机图形学中,在X,Y,Z的基础上添加了新的一个W。这样算是所谓的四元数。具体的解释可以参考,百科等。

Quaternion.AngleAxis ,AngleAxis角轴

  绕Axis轴,旋转Angle角度。例如:绕Y轴旋转30度。

transform.rotation = Quaternion.AngleAxis(30,Vector3.up);//Vector3.up代表的是Y轴正方向。

Quaternion.Angle  返回的是 a 和 b 之间的角度。

float angle = Quaternion.Angle(transform.rotation,target.rotation);//返回的是transform和target两个之间的角度

Quaternion.Dot 两个旋转之间的点乘。点乘即所谓的内积,学过数学的都知道内积。简单点就是对应坐标相乘在相加。
print(Quaternion.Dot((transform.rotation,target.rotation));

Quaternion.eularAngle 返回表示旋转的欧拉角度。绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度。这样的顺序,就是绕轴旋转的角度
 var rotation = Quaternion.identity;
        rotation.eulerAngles = new Vector3(0,30,0) ;

Quaternion.Eular 返回表示旋转的欧拉角度。绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度。这样的顺序,可以
### 实现 Unity3D 中机械臂的模拟与控制 #### 使用 CCDIK 插件实现四轴机械臂运动 为了使四轴机械臂能够移动至指定位置,在 Unity3D 中可以采用 CCIDK(Cyclic Coordinate Descent Inverse Kinematics)插件来简化开发过程。通过该工具,开发者无需手动编写复杂的逆向动力学算法即可让机械臂末端执行器到达目标点[^1]。 ```csharp using UnityEngine; public class ArmController : MonoBehaviour { public Transform targetPosition; // 设定的目标位置 private CCDIKSolver solver; void Start() { solver = GetComponent<CCDIKSolver>(); } void Update() { if (targetPosition != null && Input.GetKeyDown(KeyCode.Space)) { solver.Solve(targetPosition.position); } } } ``` 此脚本展示了如何初始化并调用 `CCDIKSolver` 来解决给定路径下的关节角度问题,从而驱动机械臂达到特定坐标。 #### 控制单个关节的方法 对于更精细的操作需求,则可以通过自定义类如 `JxbPoint` 对各个关节实施单独管理。此类允许设定不同类型的旋转方式以及调整所需时间参数,并提供回调函数以便完成动作后的进一步操作[^2]: ```csharp // 定义旋转类型枚举 public enum RotateType { Vertical, Horizontal }; // 关节控制器组件 public class JointControl : MonoBehaviour { public RotateType rotateType; public float duration = 0.5f; private float currentAngle; /// <summary> /// 设置新的角度值 /// </summary> /// <param name="angle">新角度</param> /// <param name="callback">完成后触发的动作</param> public void SetJointAngle(float angle, System.Action callback) { StartCoroutine(MoveToAngle(angle, callback)); } IEnumerator MoveToAngle(float endAngle, System.Action onComplete){ while(Math.Abs(endAngle - currentAngle)> Mathf.Epsilon){ yield return null; var t = Time.deltaTime / duration; currentAngle = Mathf.Lerp(currentAngle,endAngle,t); switch(rotateType){ case RotateType.Vertical: transform.localRotation = Quaternion.Euler(new Vector3(currentAngle,0,0)); break; default://Horizontal transform.localRotation = Quaternion.Euler(new Vector3(0,currentAngle,0)); break; } } onComplete?.Invoke(); } } ``` 上述代码实现了基于协程机制逐步改变对象姿态的功能,使得动画更加流畅自然。 #### 处理初始模型结构关系 当导入外部 CAD 数据作为基础资产时,通常会遇到各部件之间缺乏层次关联的情况。此时应当先整理好父子级联关系,确保每一个连接处都存在有效的父-子链接,这样才能正确应用前述提到的各种控制逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值