У меня есть четыре игровых объекта 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);
}