【发布时间】: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