2020-07-06【Math】局部坐标转换为世界坐标

2020-07-06  本文已影响0人  持刀的要迟到了

局部坐标依赖父物体的旋转方向,确定自己的坐标轴。
因此局部坐标转世界坐标需要依赖父物体的旋转量。
关键代码:

Vector3 child1Pos = parentPos + parentRot * child1LocalPos;
 child1LocalPos = Quaternion.Inverse(parentRot) * (child1Pos - parentPos);

实例:清空父物体旋转量,子物体世界坐标和旋转不变。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{

    public Transform parent;
    public Transform child1;

    public Transform targetR;


    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(targetR.rotation);

        Vector3 parentPos = parent.position;
        Quaternion parentRot = parent.rotation;

        Vector3 child1LocalPos = child1.localPosition;      //获得子节点的局部坐标,计算它相对于父物体的世界坐标
        Quaternion child1LocalRot = child1.localRotation;   //旋转同理

        // 计算它应该存在的世界坐标&旋转
        Vector3 child1Pos = parentPos + parentRot * child1LocalPos;
        Quaternion child1Rot = parentRot * child1LocalRot;

        // 旋转父物体,重新获得父物体的世界坐标和旋转
        parent.rotation= targetR.rotation;
        // parentPos = parentPos;
        parentRot = parent.rotation;

        // 重新计算子物体想要的位置相对于父物体的局部坐标&旋转
        child1LocalPos = Quaternion.Inverse(parentRot) * (child1Pos - parentPos);
        child1LocalRot = child1Rot * Quaternion.Inverse(parentRot);

        // 通过设置局部坐标的方式重新设置子物体
        child1.localPosition = child1LocalPos;
        child1.localRotation = child1LocalRot;

    }
}

image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读