我尝试在团结论坛上发布这个帖子,但它一直在等待审核,所以我在这里发帖,希望能得到更多的即时反馈。
我有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轴旋转时会发生(并且应该发生)的情况。蓝色箭头移动并旋转以查看蓝色平面上的绿色箭头正在查看绿色平面的同一点。最后两张图片显示了蓝色箭头应该做什么,但可以看出,它是在奇数方向上旋转。我只是在编辑器中对此进行测试,因此当我移动或旋转任何对象时,蓝色箭头会立即响应。
答案 0 :(得分:0)
你总是可以将箭头的旋转设置为彼此相等,只要它们都不是任何其他物体,它们将始终完全相等,只要模型本身是用相同的轴点和初始值创作的转动。
public GameObject arrow1;
public GameObject arrow2;
void Update(){
arrow2.transform.rotation = arrow1.transform.rotation;
}
编辑: 如果那不起作用,你是如何旋转第一支箭头的?是使用transform.LookAt吗?
当我遇到轮换问题时,通常是本地问题和全球问题。也许试试:
void Update(){
arrow2.transform.localRotation = arrow1.transform.localRotation;
}
或者我可能不明白你实际想要实现的目标,图表可以帮助澄清。