Esempio n. 1
0
            public static BoneStruct ImportFromUDK(UDKExplorer.UDK.Classes.SkeletalMesh.BoneStruct udkBone, UDKExplorer.UDK.UDKObject udkPackage, ME3Explorer.Packages.MEPackage mePackage)
            {
                BoneStruct result = new BoneStruct(0, udkBone.Flags, udkBone.Unk1, udkBone.Orientation, udkBone.Position, udkBone.NumChildren, udkBone.Parent, udkBone.BoneColor);
                string     name   = udkPackage.GetName(udkBone.Name);

                result.Name = mePackage.FindNameOrAdd(name);
                return(result);
            }
        public BoneStruct(GameObject go)
        {
            gameObject       = go;
            originalPosition = gameObject.transform.position;
            localRotation    = gameObject.transform.localRotation;

            Transform child = null;

            foreach (Transform ch in go.transform)
            {
                child = ch;
            }
            if (child != null)
            {
                boneAxis   = (child.transform.position - go.transform.position).normalized;
                boneLength = Vector3.Distance(go.transform.position, child.position);
            }
        }
Esempio n. 3
0
        private TreeNode BonesToTree()
        {
            TreeNode res = new TreeNode("Bones (" + Bones.Count + ") Depth : " + SkeletonDepth);

            for (int i = 0; i < Bones.Count; i++)
            {
                BoneStruct b = Bones[i];
                string     s = i + " : Name : \"" + Owner.GetName(b.Name) + "\" ";
                s += "Flags : 0x" + b.Flags.ToString("X8") + " ";
                s += "Unk1 : 0x" + b.Unk1.ToString("X8") + " ";
                s += "Orientation : X(" + b.Orientation.X + ") Y(" + b.Orientation.X + ") Z(" + b.Orientation.Z + ") W(" + b.Orientation.W + ")";
                s += "Position : X(" + b.Position.X + ") Y(" + b.Position.X + ") Z(" + b.Position.Z + ")";
                s += "NumChildren : " + b.NumChildren + " ";
                s += "Parent : " + b.Parent + " ";
                s += "Color : 0x" + b.BoneColor.ToString("X8");
                res.Nodes.Add(s);
            }
            return(res);
        }
    private void LateUpdate()
    {
        vertices = cloth.vertices;
        // 頂点コピー(メッシュ頂点⇒ボーン座標)
        for (int i = 0; i < boneStructs.Count; i++)
        {
            int     vertexIndex = boneStructs[i].meshIndex;
            Vector3 v           = vertices[vertexIndex];
            boneStructs[i].calcClothPosition = skirtRoot.transform.TransformPoint(v);
        }
        //return;
        // ボーン座標から姿勢計算(親から子へ辿る)
        for (int i = 0; i < boneStructs.Count; i++)
        {
            //if (i > 2*2) continue;
            //if (i % 3 == 0) continue;
            //if (i % 3 == 1) continue;

            BoneStruct self         = boneStructs[i];
            BoneStruct child        = boneStructs[i].child;
            Vector3    selfPosition = self.gameObject.transform.position;
            if (child == null)
            {
                continue;
            }

            // 姿勢を初期化
            self.gameObject.transform.localRotation = boneStructs[i].localRotation;


            // 正規化(元のボーンの長さにする)
            if (self.boneLength != 0)
            {
                child.tempPosition = ((child.calcClothPosition - selfPosition).normalized * self.boneLength) + self.calcClothPosition;// selfPosition;
            }

            // 位置から回転を求める
            Vector3    aimVector   = self.gameObject.transform.TransformDirection(self.boneAxis);
            Quaternion aimRotation = Quaternion.FromToRotation(aimVector, child.tempPosition - selfPosition);
            self.gameObject.transform.rotation = aimRotation * self.gameObject.transform.rotation;
        }
    }
        private void SerializeBones(SerializingContainer Container)
        {
            int count = 0;

            if (!Container.isLoading)
            {
                count = Bones.Count();
            }
            count = Container + count;
            if (Container.isLoading)
            {
                Bones = new List <BoneStruct>();
                for (int i = 0; i < count; i++)
                {
                    Bones.Add(new BoneStruct());
                }
            }
            for (int i = 0; i < count; i++)
            {
                BoneStruct b = Bones[i];
                b.Name          = Container + b.Name;
                b.Flags         = Container + b.Flags;
                b.Unk1          = Container + b.Unk1;
                b.Orientation.X = Container + b.Orientation.X;
                b.Orientation.Y = Container + b.Orientation.Y;
                b.Orientation.Z = Container + b.Orientation.Z;
                b.Orientation.W = Container + b.Orientation.W;
                b.Position.X    = Container + b.Position.X;
                b.Position.Y    = Container + b.Position.Y;
                b.Position.Z    = Container + b.Position.Z;
                b.NumChildren   = Container + b.NumChildren;
                b.Parent        = Container + b.Parent;
                if (Owner is ME3Package)
                {
                    b.BoneColor = Container + b.BoneColor;
                }

                b.BoneName = Owner.isName(b.Name) ? Owner.Names[b.Name] : "bone_" + b.Name;
                Bones[i]   = b;
            }
            SkeletonDepth = Container + SkeletonDepth;
        }
    private void GetChildren(GameObject go, BoneStruct parent, ref List <BoneStruct> boneStructs)
    {
        Transform children = go.GetComponentInChildren <Transform>();

        if (children.childCount == 0)
        {
            return;
        }
        foreach (Transform tf in children)
        {
            BoneStruct bs = null;
            if (tf.name.Contains("P_Cos_") == true)
            {
                bs = new BoneStruct(tf.gameObject);
                if (parent != null)
                {
                    parent.child = bs;
                }
                boneStructs.Add(bs);
                GetChildren(tf.gameObject, bs, ref boneStructs);
            }
        }
    }
    void OnDrawGizmosSelected()
    {
        {
            Vector3 v0 = vertices[SelectMeshIndex];
            Vector3 v1 = skirtRoot.transform.TransformPoint(v0);
            Gizmos.color = Color.yellow;
            Gizmos.DrawSphere(v1 + offset * 3, 0.01f);
        }

        // ボーンの位置表示
        for (int i = 0; i < boneStructs.Count; i++)
        {
            if (i % 3 == 0)
            {
                continue;
            }
            Gizmos.color = Color.white;
            if (boneStructs[i].child != null)
            {
                // オリジナルボーン
                Gizmos.color = Color.white;
                Vector3 pos0 = boneStructs[i].gameObject.transform.position;
                Vector3 pos1 = boneStructs[i].gameObject.transform.position + boneStructs[i].boneAxis * boneStructs[i].boneLength;
                Gizmos.DrawLine(pos0, pos1);
                Gizmos.color = Color.black;
                // parent
                Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f);
                // parent original
                //Gizmos.DrawSphere(boneStructs[i].originalPosition - offset, 0.01f);
                // child
                Gizmos.DrawSphere(boneStructs[i].child.gameObject.transform.position, 0.01f);
                // child original
                //Gizmos.DrawSphere(boneStructs[i].child.originalPosition, 0.01f);
                // child 計算結果(正規化)
                Gizmos.color = Color.grey;
                Gizmos.DrawSphere(boneStructs[i].child.tempPosition + offset * 2, 0.01f);
                // child mesh vertex
                Gizmos.color = Color.green;
                Gizmos.DrawSphere(boneStructs[i].child.calcClothPosition + offset * 2, 0.01f);
            }
        }


        return;

        // そもそも頂点とボーンの繋がりあっている?
        for (int i = 0; i < boneStructs.Count; i++)
        {
            if (i != 0)
            {
                continue;
            }
            int     vertexIndex = boneStructs[i].meshIndex;
            Vector3 v0          = vertices[vertexIndex];
            Vector3 v1          = skirtRoot.transform.TransformPoint(v0);
            boneStructs[i].calcClothPosition = v1;
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(v0, 0.01f);
            Gizmos.color = Color.blue;
            Gizmos.DrawSphere(v1 + offset, 0.01f);
            Gizmos.color = Color.white;
            Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f);
            Gizmos.color = Color.cyan;
            Gizmos.DrawSphere(boneStructs[i].child.gameObject.transform.position, 0.01f);
        }

        return;



        // Cloth計算結果表示
        vertices = cloth.vertices;
        for (int i = 0; i < vertices.Length; i++)
        {
            Gizmos.color = Color.yellow;
            Gizmos.DrawSphere(vertices[i], 0.01f);
        }
        // Hipsの姿勢でWorldに変換
        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 v  = vertices[i];
            Vector3 v1 = skirtRoot.transform.TransformPoint(v);
            Gizmos.color = Color.blue;
            //Gizmos.DrawSphere(v1, 0.01f);
        }

        for (int i = 0; i < boneStructs.Count; i++)
        {
            //if (i != 1) continue;

            BoneStruct self  = boneStructs[i];
            BoneStruct child = boneStructs[i].child;
            Vector3    v0    = self.gameObject.transform.position;
            //Vector3 v1 = skirtRoot.transform.TransformPoint(v0);

            Gizmos.color = Color.blue;
            Gizmos.DrawSphere(v0, 0.01f);
            //Gizmos.DrawSphere(child.calcClothPosition, 0.01f);
        }


        return;

        for (int i = 0; i < boneStructs.Count; i++)
        {
            if (i != 1)
            {
                continue;
            }

            //Gizmos.DrawSphere(boneStructs[i].calcPosition, 0.01f);
            if (boneStructs[i].child == null)
            {
                Gizmos.color = Color.cyan;
                Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position, 0.01f);
            }
            else
            {
                Gizmos.color = Color.green;
                Gizmos.DrawSphere(boneStructs[i].gameObject.transform.position + offset, 0.01f);
                Gizmos.color = Color.blue;
                Gizmos.DrawSphere(boneStructs[i].calcPosition + offset, 0.01f);
                Gizmos.color = Color.white;
                Gizmos.DrawSphere(boneStructs[i].calcClothPosition + offset, 0.01f);
                Gizmos.color = Color.cyan;
                Gizmos.DrawSphere(boneStructs[i].child.calcClothPosition + offset, 0.01f);
            }
        }
    }