Пример #1
0
    // Springhead剛体とGameObjectの間での位置姿勢の同期: 更新順を制御するためPHSceneからまとめて呼び出す
    public void UpdatePose()
    {
        if (sprObject != null)
        {
            PHSolidIf so = sprObject as PHSolidIf;
            if (fixedSolid)
            {
                // Fixedな剛体はHandleの位置をSpringheadに反映
                so.SetPose(new Posed(fixedSolidPosition.ToVec3d(), fixedSolidRotation.ToQuaterniond()));
                gameObject.transform.position = fixedSolidPosition;
                gameObject.transform.rotation = fixedSolidRotation;
            }
            else
            {
                // Fixedでない剛体の場合

                if (!so.IsDynamical())
                {
                    // Dynamicalでない剛体はUnityの位置をSpringheadに反映(操作可能)
                    so.SetPose(gameObject.transform.ToPosed());
                }
                else
                {
                    // Dynamicalな剛体はSpringheadのシミュレーション結果をUnityに反映
                    gameObject.transform.FromPosed(so.GetPose());
                }

                fixedSolidPosition = gameObject.transform.position;
                fixedSolidRotation = gameObject.transform.rotation;
            }
        }
    }
Пример #2
0
    // ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
    // SprBehaviourの派生クラスで実装するメソッド

    // -- Sprオブジェクトの構築を行う
    public override ObjectIf Build()
    {
        if (!socket)
        {
            socket = gameObject.transform.parent.GetComponentInParent <PHSolidBehaviour>().gameObject;
        }
        if (!plug)
        {
            plug = gameObject.GetComponentInParent <PHSolidBehaviour>().gameObject;
        }

        if (socket == null)
        {
            throw new ObjectNotFoundException("Socket object did not found for Joint", gameObject);
        }
        if (plug == null)
        {
            throw new ObjectNotFoundException("Plug object did not found for Joint", gameObject);
        }

        PHSolidIf soSock = socket.GetComponent <PHSolidBehaviour>().sprObject as PHSolidIf;
        PHSolidIf soPlug = plug.GetComponent <PHSolidBehaviour>().sprObject as PHSolidIf;

        PHJointIf jo = CreateJoint(soSock, soPlug);

        jo.SetName("jo:" + gameObject.name);

        if (autoSetSockPlugPose)
        {
            // priority jointObject > jointPosition/Orientation > gameObject
            Posed jointPose = new Posed();
            if (jointObject == null)
            {
                jointObject = gameObject;
                jointPose   = jointObject.transform.ToPosed() * new Posed(jointPosition.ToVec3d(), jointOrientation.ToQuaterniond());
            }
            else
            {
                jointPose = jointObject.transform.ToPosed();
            }
            jo.SetSocketPose(soSock.GetPose().Inv() * jointPose);
            jo.SetPlugPose(soPlug.GetPose().Inv() * jointPose);
        }

        return(jo);
    }
Пример #3
0
 // Springhead剛体とGameObjectの間での位置姿勢の同期: 更新順を制御するためPHSceneからまとめて呼び出す
 public void UpdatePose()
 {
     if (sprObject != null)
     {
         PHSolidIf so = sprObject as PHSolidIf;
         if (!so.IsDynamical() && !fixedSolid)
         {
             // Dynamicalでない(かつ、fixedでもない)剛体はUnityの位置をSpringheadに反映(操作可能)
             so.SetPose(gameObject.transform.ToPosed());
         }
         else
         {
             // Dynamicalな(もしくはfixedな)剛体はSpringheadのシミュレーション結果をUnityに反映
             gameObject.transform.FromPosed(so.GetPose());
         }
     }
 }