当AngularMotion锁定时,可配置的关节对象捕捉到旧位置

时间:2015-03-06 14:21:46

标签: c# unity3d

我在Unity3D第4版中工作。

---坚果壳---

  1. 两个对象。
  2. 在它们之间创建ConfigurableJoint,其中Motionx / y / z和angularMotionx / y / z已锁定,因此它们之间的相对位置不会改变。
  3. OnMouseDrag将angularMotionx / y / z更改为“Free”
  4. 用户将一个对象拖动到另一个对象周围。
  5. 当用户释放鼠标时,我只需将ConfigurableJoint的angularMotionx / y / z BACK设置为锁定。
  6. 期望的结果:对象保持在新的位置,并且配置的关节再次被锁定,因此两个对象不会相互移动(停留在用户放置的位置)。

    实际结果:对象快速恢复到关节制作时的原始相对位置。

    ---详情--- 我有两个由可配置关节连接的对象。当对象不与用户交互时,我希望关节将相对的约束限制在彼此之间。我通过将ConfigurableJoint的motionX / Y / Z和angularMotionX / Y / Z设置为“Locked”来实现此目的。

    但是,我还希望用户能够将RELATIVE周围的对象相互拖动。

    我尝试通过在拖动其中一个对象时将ConfigurableJoint的角度运动设置为“Free”,然后在用户停止拖动对象时将其设置为Locked来实现此目的。

    但是当我释放物体并重新锁定角度运动时 - 物体会快速回到原来的位置。

    private ConfigurableJoint MakeConfigurableJoint(Collider other, int end)
    {
        Vector3 myAnchor;
        ConfigurableJoint tempJoint = this.gameObject.AddComponent("ConfigurableJoint") as ConfigurableJoint; // Neg
        tempJoint.autoConfigureConnectedAnchor = false; // Prevent joint from finding it's own position
    
            myAnchor = new Vector3(1f, 0, 0);
            connectedBody1 = other.gameObject;
            connectedBody1Script = connectedBody1.GetComponent<AtomScript>() as AtomScript;
    
        tempJoint.anchor = myAnchor; 
        tempJoint.connectedBody = other.transform.rigidbody;
        tempJoint.connectedAnchor = new Vector3(0, 0, 0);
    
        // PARAMETERS //
        // Motion
        tempJoint.xMotion = ConfigurableJointMotion.Locked;
        tempJoint.yMotion = ConfigurableJointMotion.Locked;
        tempJoint.zMotion = ConfigurableJointMotion.Locked;
        tempJoint.angularXMotion = ConfigurableJointMotion.Locked;
        tempJoint.angularYMotion = ConfigurableJointMotion.Locked;
        tempJoint.angularZMotion = ConfigurableJointMotion.Locked;
    
        tempJoint.axis          = new Vector3(0, 0, 0);
        tempJoint.secondaryAxis = new Vector3(0,0,0);
    
        return tempJoint;
    }//MakeConfigurableJoint
    
    // This DOES successfully allow me to move the object around the other
    public void loosenBonds()
    {
        tempJoint.angularXMotion = ConfigurableJointMotion.Free;
        tempJoint.angularYMotion = ConfigurableJointMotion.Free;
        tempJoint.angularZMotion = ConfigurableJointMotion.Free;
    }// loosenBonds
    
    // This DOES lock the movement again, but first it snaps the object back to the original location (doesn't leave it where I dragged it)
    public void tightenBonds()
    {
        tempJoint.angularXMotion = ConfigurableJointMotion.Locked;
        tempJoint.angularYMotion = ConfigurableJointMotion.Locked;
        tempJoint.angularZMotion = ConfigurableJointMotion.Locked;
    }// tightenBonds
    
    void OnMouseDown(){ loosenBonds() };
    void OnMouseUp()  { tightenBonds(); }
    

0 个答案:

没有答案