如何统一设置2个游戏对象之间的特定角度

时间:2017-07-13 09:18:11

标签: unity3d leap-motion rigid-bodies

SCENARIO

我正在创建一个应用程序,我必须在原子(游戏对象)之间显示化学键。我正在使用Leap动作手来产卵并使原子碰撞形成分子。现在,原子之间的键合使用圆柱游戏对象。 当正确地产生粘合(圆柱体)时,它也会与原子相连接。使用固定关节的游戏对象。 所有这些事情都按照预期正常运作。

问题:

因为一个原子可以与多个原子形成键,所以我想在每个键合的原子之间保持一定的角度。(例如。在化学中CH4分子的原子相隔约105度)。 因此,我希望通过将分子中的每个原子分开一定角度,在我的应用程序中实现相同的效果。 我目前只能正确地创造分子,但根据角度没有任何东西可以分开。

这就是我目前正在做的事情。

private IEnumerator SetAtomPosition(Transform atomOne, Transform atomTwo, Transform cylinder)
{
    cylinder.gameObject.GetComponent<Rigidbody>().isKinematic = true;
    while (Vector3.Distance(atomOne.position, atomTwo.position) > atomDistance)
    {
        atomTwo.position = Vector3.MoveTowards(atomTwo.position, atomOne.position, Time.deltaTime * 0.1f);
        yield return 0;
    }

    while (Vector3.Distance(atomOne.position, atomTwo.position) < atomDistance)
    {
        atomTwo.position = Vector3.MoveTowards(atomTwo.position, -atomTwo.forward * 1000f, Time.deltaTime * 0.1f);
        yield return 0;
    }

    cylinder.transform.position = (atomTwo.position - atomOne.position) / 2.0f + atomOne.position;
    cylinder.transform.rotation = Quaternion.FromToRotation(Vector3.up, atomTwo.position - atomOne.position);


    #region JoinAtoms

    cylinder.gameObject.AddComponent<FixedJoint>();
    cylinder.gameObject.AddComponent<FixedJoint>();

    var cylinderJoints = cylinder.GetComponents<FixedJoint>();

    cylinderJoints[0].connectedBody = atomOne.GetComponent<Rigidbody>();
    atomOne.GetComponent<Atom>().joint = cylinderJoints[0];

    //cylinderJoints[0].breakForce = breakForce;

    cylinderJoints[1].connectedBody = atomTwo.GetComponent<Rigidbody>();
    atomTwo.GetComponent<Atom>().joint = cylinderJoints[1];
    KinematicToggle(cylinder.gameObject);


    cylinder.GetComponent<Rigidbody>().mass = 10f;

    #endregion

    yield return null;
}

这就是目前的样子

Molecule

我希望这4个白色球体围绕黑色球体(碳原子)排列。

我想要的是与此图像类似的东西。

Methane

0 个答案:

没有答案