【发布时间】:2017-10-03 19:47:01
【问题描述】:
我有两个相同的对象和两个相机。我想要实现的目标如下:
1) 捕捉Cube A相对于Camera A的位置和旋转
2) 将其转移到立方体 B,以便在相机 B(我无法移动)中,立方体 B 看起来与立方体 A 在相机 A 中的外观完全相同
我使用以下代码成功地使用了位置:
positionDifference = CubeA.InverseTransformPoint(CameraA.transform.position);
要将它转移到立方体 B,我这样做:
cubeBpos = transform.InverseTransformPoint(CubeB.transform.localPosition);
while ( Mathf.Abs (cubeBpos.x + positionDifference.x) > 0.01f ) {
if (cubeBpos.x + positionDifference.x > 0) {
CubeB.transform.position += new Vector3(-0.01f, 0, 0);
}
else if (cubeBpos.x + positionDifference.x < 0) {
CubeB.transform.position += new Vector3(+0.01f, 0, 0);
}
cubeBpos = transform.InverseTransformPoint(CubeB.transform.position);
}
这很笨重,但很有效。但是,当我尝试转移旋转时,立方体 B 开始围绕原点旋转。有趣的是,当我在世界坐标中移动立方体 A 时,立方体 B 在本地移动,反之亦然。我怀疑本地到世界坐标转换是一个问题,但我也认为我的旋转代码很幼稚。我尝试以两种方式捕获旋转,首先是这样的:
rotationDifference = Quaternion.Inverse(CubeA.transform.rotation) * CameraA.transform.rotation;
CubeB.transform.rotation = Quaternion.Inverse(rotationDifference);
第二次尝试:
rotationDifference = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z);
CubeB.transform.eulerAngles = rotationDifference;
这两种方法都会导致奇怪的旋转偏移。我尝试使用 localPosition 和 localEulerAngles,没有帮助。
我希望有更聪明的方法来做到这一点:)
编辑: 这是项目的 Dropbox link
【问题讨论】:
标签: c# unity3d rotation quaternions