【问题标题】:Setting position and rotation of second game object based on first根据第一个设置第二个游戏对象的位置和旋转
【发布时间】: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


【解决方案1】:

如果你想复制一切!!!!

只需将B 设为A 的子级和DC 的子级

那么你只需要使Dtransform局部值等于Update中的B

d.transform.localRotation = b.transform.localRotation;
d.transform.localPosition = b.transform.localPosition ;

这将起作用,因为 BD 的本地空间应该是相同的,因为在本地当父级为 AC时,它们都从 Vector3.zero 开始。

【讨论】:

  • 这就是我要找的。​​span>
  • 只是为了更新,在您的解决方案中,代码中应该是 D 而不是 C?因为当我使用 D 而不是 C 时,它可以工作。
  • 你说的完全正确,我放错地方了,我已经编辑过了
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多