예제 #1
0
    // -- Sprオブジェクトの構築を行う
    public override ObjectIf Build()
    {
        PH1DJointIf jo = null;

        PHJointBehaviour b = (jointObject ? jointObject : gameObject).GetComponent <PHHingeJointBehaviour>();

        if (!b)
        {
            b = (jointObject ? jointObject : gameObject).GetComponent <PHSliderJointBehavior>();
            if (!b)
            {
                return(null);
            }
        }

        jo = b.sprObject as PH1DJointIf;
        if (jo == null)
        {
            return(null);
        }

        PH1DJointLimitIf lim = jo.CreateLimit((PH1DJointLimitDesc)desc);

        return(lim);
    }
예제 #2
0
    // ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
    // SprBehaviourの派生クラスで実装するメソッド

    // -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど
    public override void Link()
    {
        // まず、このIKActuatorに付随する関節を探す。同じGameObjectに付いているはず
        PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>();

        if (jo != null && jo.sprObject != null && sprObject != null)
        {
            // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す
            // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節)
            PHJointBehaviour joParent = null;
            var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>();
            foreach (var j in jos)
            {
                if (j.plug == jo.socket)
                {
                    joParent = j; break;
                }
            }

            if (joParent != null && jo != joParent)
            {
                // 親関節に付随するIKActuatorを親Actuatorとして登録する
                PHIKActuatorBehaviour act = joParent.GetComponent <PHIKActuatorBehaviour>();
                if (act != null && act.sprObject != null && sprObject != act.sprObject)
                {
                    act.sprObject.AddChildObject(sprObject);
                }
            }
        }
    }
예제 #3
0
    // ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
    // SprBehaviourの派生クラスで実装するメソッド

    // -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど
    public override void Link()
    {
        // まず、このIKActuatorに付随する関節を探す。同じGameObjectに付いているはず
        PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>();

        if (jo != null && jo.sprObject != null && sprObject != null)
        {
            // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す
            // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節)
            // 親関節にIKActuatorが付属していない場合は、親IKActuatorが見つかるまで関節ツリーをさかのぼって探す
            while (true)
            {
                PHJointBehaviour joParent = null;
                var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>();
                foreach (var j in jos)
                {
                    if (j.plug == jo.socket)
                    {
                        joParent = j; break;
                    }
                }

                if (joParent != null && jo != joParent)
                {
                    // 親関節に付随するIKActuatorを親Actuatorとして登録する
                    PHIKActuatorBehaviour act = joParent.GetComponent <PHIKActuatorBehaviour>();
                    if (act != null && act.sprObject != null && sprObject != act.sprObject && act.isActiveAndEnabled)
                    {
                        act.sprObject.AddChildObject(sprObject);
                        break;
                    }
                    if (act == null)
                    {
                        jo = joParent;
                        continue;
                    }
                    if (act.sprObject == null)
                    {
                        Debug.LogWarning("sprObject of " + act.name + " is null.");
                        break;
                    }
                    if (sprObject == act.sprObject)
                    {
                        Debug.LogWarning("this IKObject is same with parent actuator");
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
        }
    }
예제 #4
0
    public void OnSceneGUI()
    {
        PHJointBehaviour phJointBehaviour = (PHJointBehaviour)target;

        // ----- ----- ----- ----- -----
        // Target Position Handle
        if (phJointBehaviour.showJointPoseHandle)
        {
            Tools.current = Tool.None;
            // <!!> この方式だと微小変化が常に発生してあまりUndoなどが機能しない
            Posed      objectPose   = phJointBehaviour.gameObject.transform.ToPosed();
            Vector3    currJointPos = (objectPose * phJointBehaviour.jointPosition.ToVec3d()).ToVector3();
            Quaternion currJointRot = phJointBehaviour.gameObject.transform.rotation * phJointBehaviour.jointOrientation;
            EditorGUI.BeginChangeCheck();
            Vector3    handlePos = Handles.PositionHandle(currJointPos, phJointBehaviour.gameObject.transform.rotation);
            Quaternion handleRot = Handles.RotationHandle(currJointRot, currJointPos);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(phJointBehaviour, "Joint Pos/Rot Change");
                phJointBehaviour.jointPosition    = Quaternion.Inverse(phJointBehaviour.gameObject.transform.rotation) * (handlePos - phJointBehaviour.gameObject.transform.position);
                phJointBehaviour.jointOrientation = Quaternion.Inverse(phJointBehaviour.gameObject.transform.rotation) * handleRot;
            }
        }
    }
예제 #5
0
    // -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど
    public override void Link()
    {
        // まず、このTreeNodeに付随する関節を探す。同じGameObjectに付いているはず
        PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>();

        if (jo != null && jo.sprObject != null)
        {
            // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す
            // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節)
            PHJointBehaviour joParent = null;
            var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>();
            foreach (var j in jos)
            {
                if (j.plug == jo.socket)
                {
                    joParent = j; break;
                }
            }

            PHTreeNodeBehaviour parentTreeNode = null;
            PHRootNodeBehaviour parentRootNode = null;

            if (joParent != null && jo != joParent)
            {
                // -- 親関節があった場合
                parentTreeNode = joParent.GetComponent <PHTreeNodeBehaviour>();
                parentRootNode = joParent.GetComponent <PHRootNodeBehaviour>();

                if (parentTreeNode != null && parentTreeNode.isActiveAndEnabled)
                {
                    // 親ノードを先に構築する
                    if (parentTreeNode.sprObject == null)
                    {
                        parentTreeNode.Link();
                    }

                    // その後、親TreeNodeに接続する形で自分のTreeNodeを作成する
                    if (sprObject == null)
                    {
                        sprObject = phScene.CreateTreeNode(parentTreeNode.phTreeNode,
                                                           jo.plug.GetComponent <PHSolidBehaviour>().phSolid);
                        Debug.Log("CreateTreeNode[" + this.name + "] = Tree(" + parentTreeNode.name + ") <= Solid(" + jo.plug.name + ")");

                        phTreeNode.Enable();
                    }
                }
                else if (parentRootNode != null && parentRootNode.isActiveAndEnabled)
                {
                    // 親ノードを先に構築する
                    if (parentRootNode.sprObject == null)
                    {
                        parentRootNode.Link();
                    }

                    // その後、親RootNodeに接続する形で自分のTreeNodeを作成する
                    if (sprObject == null)
                    {
                        sprObject = phScene.CreateTreeNode(parentRootNode.phRootNode,
                                                           jo.plug.GetComponent <PHSolidBehaviour>().phSolid);
                        Debug.Log("CreateTreeNode[" + this.name + "] = Root(" + parentRootNode.name + ") <= Solid(" + jo.plug.name + ")");

                        phTreeNode.Enable();
                    }
                }
                else
                {
                    Debug.LogError("No Parent Node for " + this.name);
                }
            }
            else
            {
                // -- 親関節がない場合:この関節のsocketにRootNodeがくっついているはず
                parentRootNode = jo.socket.GetComponent <PHRootNodeBehaviour>();

                // 親ノードを先に構築する
                if (parentRootNode.sprObject == null)
                {
                    parentRootNode.Link();
                }

                // その後、親RootNodeに接続する形で自分のTreeNodeを作成する
                if (sprObject == null)
                {
                    sprObject = phScene.CreateTreeNode(parentRootNode.phRootNode,
                                                       jo.plug.GetComponent <PHSolidBehaviour>().phSolid);
                    Debug.Log("CreateTreeNode[" + this.name + "] = Root(" + parentRootNode.name + ") <= Solid(" + jo.plug.name + ")");

                    phTreeNode.Enable();
                }
            }
        }
    }