Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配一个对象';s旋转到另一个对象的旋转';相对旋转_C#_Rotation_Quaternions_Unity5_Euler Angles - Fatal编程技术网

C# 匹配一个对象';s旋转到另一个对象的旋转';相对旋转

C# 匹配一个对象';s旋转到另一个对象的旋转';相对旋转,c#,rotation,quaternions,unity5,euler-angles,C#,Rotation,Quaternions,Unity5,Euler Angles,我试着在unity论坛上发布这篇文章,但它一直在等待审核,所以我把它发布在这里,希望能得到一些更直接的反馈 我有4个对象,两个平面和两个箭头。一个箭头指向其中一个平面,我希望第二个箭头与第一个箭头匹配,但相对于第二个平面。我的意思是,如果第一个箭头相对于第一个平面向右移动1个单位,那么第二个箭头相对于第二个平面向右移动1个单位。我已经得到了正确的位置,但我不知道如何匹配旋转。某些旋转轴在某些时间内工作正常,但一旦其中一个平面旋转,第二个箭头的旋转将与第一个箭头的旋转更加不同步 下面是我用来测试这

我试着在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轴旋转时才能正确工作,而当平面上的任何其他轴旋转时它就会出错

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

我已经做了很长一段时间了,尝试了四元数乘法的不同组合和欧拉格朗日的不同,但我似乎没有弄明白。在这一点上的任何帮助都是非常感谢的

编辑:以下几张图片描述了我希望发生的事情,以及当前脚本实际发生的事情:
前三张图片显示了当两个平面具有相同旋转时发生的情况(如我前面所述,在本例中箭头位置和旋转正确工作)。第四幅图显示了当平面绕Y轴旋转时发生的情况(以及应该发生的情况)。蓝色箭头移动并旋转,以查看蓝色平面上绿色箭头现在查看绿色平面的同一点。最后两张图片显示了蓝色箭头应该做什么,但正如我们所看到的,它在奇怪的方向上旋转。我纯粹是在编辑器中测试这一点,因此当我移动或旋转任何对象时,蓝色箭头将立即响应。

您可以始终将箭头的旋转设置为彼此相等,只要两者都不是其他对象的父对象,它们将始终完全相等,只要模型本身是使用相同的轴点和初始旋转编写的

public GameObject arrow1;
public GameObject arrow2;

void Update(){

    arrow2.transform.rotation = arrow1.transform.rotation;
}
编辑: 如果不起作用,如何旋转第一个箭头?它在使用吗

当我遇到轮换问题时,通常是局部和全局的问题。也许可以试试:

void Update(){

    arrow2.transform.localRotation = arrow1.transform.localRotation;
}

或者我不明白你到底想实现什么,一张图表可以帮助你澄清。

你可以将箭头的旋转设置为彼此相等,只要两者都不是其他任何事物的子对象,它们就会一直完全相等,只要模型本身是使用相同的轴点和初始旋转编写的

public GameObject arrow1;
public GameObject arrow2;

void Update(){

    arrow2.transform.rotation = arrow1.transform.rotation;
}
编辑: 如果不起作用,如何旋转第一个箭头?它在使用吗

当我遇到轮换问题时,通常是局部和全局的问题。也许可以试试:

void Update(){

    arrow2.transform.localRotation = arrow1.transform.localRotation;
}

或者也许我不明白您实际上想要实现什么,一张图表可以帮助您澄清。

这是我尝试的第一件事,但只有当两个平面的方向相同时,它才起作用。当一个或两个平面沿Y轴以外的方向旋转时,我的问题就开始了。我只是在这一点上手动移动和旋转箭头,只是为了测试(第二个箭头立即响应),但最终需要模拟的将是主摄像机的旋转,但在这一点上,它只是将逻辑移动到我代码的这一部分。这是我尝试的第一件事情之一,但只有当两个平面的方向相同时,它才起作用。当一个或两个平面沿Y轴以外的方向旋转时,我的问题就开始了。实际上,我只是在这一点上手动移动和旋转箭头,只是为了测试(第二个箭头立即响应),但最终需要模拟的将是主摄像机的旋转,但在这一点上,它只是将逻辑移动到我代码的这一部分。