// 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; } } }
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 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); }
// 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()); } } }