Unity 模拟父子关系

准备

  1. Transform.TransformPoint方法
    本地空间的点转换为世界空间的点
  2. Transform.InverseTransformPoint
    世界空间的点转换到相对于变换本地空间的点
  3. 四元数 q1 * q2 得到一个四元数,表示先旋转q2,再旋转q1。
  4. Quaternion.Inverse得到一个四元数,表示相反方向的旋转。
    例如,如果有一个旋转四元数表示绕Y轴旋转30度,那么它的逆就是绕Y轴旋转-30度

思路

子对象和父对象不存在真实的父子关系,使用脚本模拟。

位置

获取相对点:获取子对象在世界空间的点,使用InverseTransformPoint方法将该点转换为相对于父对象本地空间的点;

更新位置:父对象位置改变,使用TransformPoint方法,将相对于父对象本地空间的点转换到世界空间,更新子对象位置。

旋转

获取相对旋转:使用Quaternion.Inverse得到父对象的逆四元数,父对象的逆四元数与子对象的四元数相乘,得到相对旋转;

更新旋转:父对象角度改变,将父对象四元数与相对四元数相乘得到相对于父对象的旋转,更新子对象旋转。

示例

csharp 复制代码
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    public Transform parent;
    public Transform[] children;

    Vector3[] relativePosition;

    Quaternion[] relativeAngle;

    void Start()
    {
        relativePosition = new Vector3[children.Length];
        relativeAngle = new Quaternion[children.Length];

        for (int i = 0; i < children.Length; i++)
        {
            relativePosition[i] = parent.InverseTransformPoint(children[i].position);
            relativeAngle[i] = Quaternion.Inverse(parent.rotation) * children[i].rotation;
        }
    }

    void Update()
    {
        for (int i = 0; i < children.Length; i++)
        {
            var position = parent.TransformPoint(relativePosition[i]);
            var angle = parent.rotation * relativeAngle[i];
            children[i].SetPositionAndRotation(position, angle);
        }
    }
}
相关推荐
唔665 分钟前
原生 Android(Kotlin)仅串口「继承架构」完整案例二
android·开发语言·kotlin
一直都在57217 分钟前
MySQL索引优化
android·数据库·mysql
代码s贝多芬的音符2 小时前
android mlkit 实现仰卧起坐和俯卧撑识别
android
榮華2 小时前
DOTA全图透视辅助下载DOTA全图科技辅助下载DOTA外挂下载魔兽争霸WAR3全图下载
数据库·科技·游戏·游戏引擎·游戏程序·ai编程·腾讯云ai代码助手
jwn9992 小时前
Laravel9.x核心特性全解析
android
今天又在写代码3 小时前
数据智能分析平台部署服务器
android·服务器·adb
梦里花开知多少4 小时前
深入谈谈Launcher的启动流程
android·架构
jwn9994 小时前
Laravel11.x新特性全解析
android·开发语言·php·laravel
我就是马云飞4 小时前
停更5年后,我为什么重新开始写技术内容了
android·前端·程序员
stevenzqzq5 小时前
Kotlin 协程:withContext 与 async 核心区别与使用场景
android·开发语言·kotlin