将一个对象的旋转与另一个对象的相对旋转相匹配

本文关键字:旋转 一个对象 相对 | 更新日期: 2023-09-27 18:36:43

我尝试在 Unity 论坛上发布此内容,但它一直处于等待审核状态,所以我将其发布在这里,希望能获得更即时的反馈。

我有 4 个对象,两个平面和两个箭头。一个箭头指向其中一个平面,我希望第二个箭头与第一个箭头匹配,但相对于第二个平面。我的意思是,如果第一个箭头相对于第一个平面向右移动 1 个单位,则第二个箭头应相对于第二个平面向右移动 1 个单位。我已经得到了正确计算的位置,但我无法弄清楚如何匹配旋转。某些旋转轴有时可以正常工作,但是一旦其中一个平面旋转,第二个箭头的旋转就会与第一个箭头更加不同步。

这是我用来测试它的代码,我能弄清楚的最好的代码:

[ExecuteInEditMode]
 public class RotationTest : MonoBehaviour
 {
     public GameObject target;
     public GameObject camera;
     public GameObject arrow;
     void OnWillRenderObject()
     {
         if (!target || !camera || !arrow) return;
         arrow.transform.position = target.transform.TransformPoint(transform.InverseTransformPoint(camera.transform.position));
         //arrow.transform.rotation = Quaternion.Inverse(camera.transform.rotation) * transform.rotation * Quaternion.Inverse(target.transform.rotation);
         //arrow.transform.eulerAngles = new Vector3(arrow.transform.eulerAngles.x, -arrow.transform.eulerAngles.y, arrow.transform.eulerAngles.z);
         arrow.transform.eulerAngles = (target.transform.eulerAngles - transform.eulerAngles) + camera.transform.eulerAngles;
     }
 }

我把这个脚本放在第一个平面上,第一个箭头是"相机",第二个平面是"目标",第二个箭头是"箭头"。当两个平面完全对齐时,第二个箭头的位置和旋转应与第一个箭头完全相同。注释掉的线是我尝试的第一件事,未注释的线是我下一个最接近工作的东西,但它只有在平面绕 Y 轴旋转时才能正常工作,而当平面上的任何其他轴旋转时就会搞砸。

当两个平面朝向同一方向时,只需将第二个箭头的旋转设置为第一个箭头的旋转就可以正常工作,但是一旦第一个平面旋转,这种方法就会分崩离析。

我已经这样做了很长一段时间,尝试了四元数乘法的不同组合和欧拉角的差异,但我似乎无法弄清楚。在这一点上,非常感谢任何帮助。

编辑:这里有一些图片描述了我想发生的事情,以及当前脚本实际发生的事情:https://i.stack.imgur.com/OErjQ.jpg前三张图片显示了当两个平面具有相同旋转时发生的情况(在这种情况下,箭头位置和旋转可以正常工作,如我之前所述)。第 4 张图片显示了当平面绕 Y 轴旋转时会发生什么(以及应该发生什么)。蓝色箭头移动和旋转以查看蓝色平面上的同一点,绿色箭头现在查看绿色平面的同一点。最后两张图片显示了蓝色箭头应该做什么,但可以看出,它正在向奇怪的方向旋转。我纯粹在编辑器中对此进行测试,因此当我移动或旋转任何对象时,蓝色箭头将立即响应。

将一个对象的旋转与另一个对象的相对旋转相匹配

您始终可以将箭头的旋转设置为彼此相等,只要两者都不是其他任何东西的父级,只要模型本身是使用相同的轴点和初始旋转创作的,它们将始终完全相同。

public GameObject arrow1;
public GameObject arrow2;
void Update(){
    arrow2.transform.rotation = arrow1.transform.rotation;
}

编辑:如果这不起作用,您如何旋转第一个箭头?是使用转换吗?看?

当我遇到轮换问题时,这通常是局部与全局问题。也许尝试:

void Update(){
    arrow2.transform.localRotation = arrow1.transform.localRotation;
}

或者,也许我不明白您实际上想要实现的目标,图表可以帮助澄清。