局部坐标依赖父物体的旋转方向,确定自己的坐标轴。
因此局部坐标转世界坐标需要依赖父物体的旋转量。
关键代码:
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
网友评论