【发布时间】:2019-01-25 13:46:01
【问题描述】:
我有四个游戏对象 A、B、C 和 D。
A 是固定的,它的位置和旋转是已知的。 B是围绕A运动的运动物体。B的位置和旋转也是已知的。
C 是固定的(放置在 A 附近的某个地方,但它们之间没有关系)并且它的位置和旋转是已知的。 D是围绕C移动的运动物体。但是,D的位置和旋转是未知的。 D的位置和旋转需要根据B的位置和旋转值推导出来。
所以在运行时,当 B 围绕 A 移动时,D 也将围绕 C 发生类似的移动。 如果 B 离开 A,D 也应该离开 C 相同的距离(在 A 和 B 之间)。 如果 B 以一些旋转值围绕 A 旋转,则 D 也将以相同的旋转值围绕 C 旋转。
对象 B 仅围绕 X 和 Y 轴旋转。不打算绕 Z 轴旋转。
使用下面的代码,我得到了错误的 D 移动。有时它是预期的,有时不是。 我在哪里做错了?
对此的任何指示都会非常有帮助。 谢谢。
private float distance;
private float newDistance;
private Quaternion quaternion;
private Quaternion newQuaternion;
void Update()
{
if (A != null && B != null)
{
this.distance = Vector3.Distance(A.transform.position, B.transform.position);
Vector3 relativePos = A.transform.position - B.transform.position;
this.quaternion = Quaternion.LookRotation(relativePos, Vector3.up);
CalculateValuesForD();
}
}
public void CalculateValuesForD()
{
GameObject tempGameObject = new GameObject();
Vector3 newPos = C.transform.position - C.transform.forward * distance;
tempGameObject.transform.position = newPos;
//tempGameObject.transform.RotateAround(C.transform.position, Vector3.up, this.quaternion.eulerAngles.y);
//tempGameObject.transform.RotateAround(C.transform.position, Vector3.right, this.quaternion.eulerAngles.x);
tempGameObject.transform.RotateAround(C.transform.position, C.transform.up, this.quaternion.eulerAngles.y);
tempGameObject.transform.RotateAround(C.transform.position, C.transform.right, this.quaternion.eulerAngles.x);
D.transform.position = tempGameObject.transform.position;
D.transform.rotation = tempGameObject.transform.rotation;
this.newDistance = Vector3.Distance(C.transform.position, D.transform.position);
Vector3 relativePos = C.transform.position - D.transform.position ;
this.newQuaternion = Quaternion.LookRotation(relativePos, Vector3.up);
GameObject.Destroy(tempGameObject);
}
【问题讨论】:
-
如果可以将相同的计算应用于对象 A 和 C,为什么会出现问题?既然A和C是完全一样的,只是位置不同,那计算不就是被A和C的位置差抵消了吗?
标签: unity3d