【问题标题】:Match an object's rotation to that of another object's relative rotation将一个对象的旋转与另一个对象的相对旋转匹配
【发布时间】:2016-06-13 05:27:54
【问题描述】:

我尝试在统一论坛上发布此内容,但它一直在等待审核,因此我将其发布在这里,希望获得更直接的反馈。

我有 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 轴旋转时才能正常工作,而当飞机上的任何其他轴是旋转。

当两个平面朝向相同的方向时,只需将第二个箭头的旋转设置为第一个箭头的旋转即可正常工作,但一旦旋转第一个平面,此方法就会崩溃。

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

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

【问题讨论】:

    标签: c# rotation quaternions unity5 euler-angles


    【解决方案1】:

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

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

    编辑: 如果这不起作用,你如何旋转第一个箭头?是用transform.LookAt吗?

    当我遇到轮换问题时,通常是本地与全球问题。也许试试:

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

    或者我不明白你真正想要达到的目标,一张图表可以帮助澄清。

    【讨论】:

    • 这是我尝试的第一件事,但它只有在两个平面的方向相同时才有效。一旦一个或两个平面沿 Y 轴以外的方向旋转,我的问题就开始了
    • 我已经编辑了我的问题。我实际上只是在这一点上手动移动和旋转箭头只是为了测试(第二个箭头立即响应),但最终需要模仿的是主摄像机的旋转,但此时它只是将逻辑移动到我的那部分代码。
    最近更新 更多