コード例 #1
0
ファイル: PmdIK.cs プロジェクト: nyatla/nymmd
        public PmdIK(PMD_IK pPMDIKData, PmdBone[] i_ref_bone_array)
        {
            // IKターゲットボーン
            this.m_pTargetBone = i_ref_bone_array[pPMDIKData.nTargetNo];

            // IK先端ボーン
            this.m_pEffBone = i_ref_bone_array[pPMDIKData.nEffNo];

            this.m_unCount  = pPMDIKData.unCount;
            this.m_fFact    = pPMDIKData.fFact * Math.PI;
            this.m_nSortVal = pPMDIKData.punLinkNo[0];

            // IKリンク配列の作成
            int number_of_ik_link = pPMDIKData.cbNumLink;

            this.m_ppBoneList = new PmdBone[number_of_ik_link];//参照
            for (int i = 0; i < number_of_ik_link; i++)
            {
                this.m_ppBoneList[i] = i_ref_bone_array[pPMDIKData.punLinkNo[i]];       // ボーン番号は降順で格納されている
                if (this.m_ppBoneList[i].getName().Equals("左ひざ") || this.m_ppBoneList[i].getName().Equals("右ひざ"))
                {
                    this.m_ppBoneList[i].setIKLimitAngle(true);
                }
            }
        }
コード例 #2
0
        private static PmdIK[] createIKArray(DataReader i_reader, PmdBone[] i_ref_bone_array)
        {
            int    number_of_ik = i_reader.readShort();
            PMD_IK tmp_pmd_ik   = new PMD_IK();

            PmdIK[] result = new PmdIK[number_of_ik];
            // IK配列を作成
            if (number_of_ik > 0)
            {
                for (int i = 0; i < number_of_ik; i++)
                {
                    tmp_pmd_ik.read(i_reader);
                    result[i] = new PmdIK(tmp_pmd_ik, i_ref_bone_array);
                }
                System.Array.Sort <PmdIK>(result, new DataComparator());
            }
            return(result);
        }
コード例 #3
0
        public CorrespondTable(string path)
        {
            System.IO.StreamReader sr;

            //内容を一行ずつ読み込む
            sr = new System.IO.StreamReader(
                Path.Combine(path, @"skinning.txt"),
                System.Text.Encoding.GetEncoding("shift_jis"));
            while (sr.Peek() > -1)
            {
                string   line = sr.ReadLine();
                string[] data = line.Split(',');
                skinning.Add(data[0].Trim(), data[1].Trim());
            }
            sr.Close();

            //内容を一行ずつ読み込む
            sr = new System.IO.StreamReader(
                Path.Combine(path, @"bonePosition.txt"),
                System.Text.Encoding.GetEncoding("shift_jis"));
            while (sr.Peek() > -1)
            {
                string   line = sr.ReadLine();
                string[] data = line.Split(',');
                bonePosition.Add(data[1].Trim(), data[0].Trim());
            }
            sr.Close();

            //内容を一行ずつ読み込む
            sr = new System.IO.StreamReader(
                Path.Combine(path, @"boneStructure.txt"),
                System.Text.Encoding.GetEncoding("shift_jis"));
            while (sr.Peek() > -1)
            {
                string   line = sr.ReadLine();
                string[] data = line.Split(',');

                // PMD_Boneデータを生成
                PMD_Bone pmd_b = new PMD_Bone();

                pmd_b.szName = data[0].Trim();
                pmd_b.cbKind = int.Parse(data[1].Trim()); // ボーンの種類 0:回転 1:回転と移動 2:IK 3:不明 4:IK影響下 5:回転影響下 6:IK接続先 7:非表示 8:捻り 9:回転運動
                if (data[2] == "")
                {
                    pmd_b.ParentName = null;
                }
                else
                {
                    pmd_b.ParentName = data[2].Trim();
                }
                if (data[3] == "")
                {
                    pmd_b.ChildName = null;
                }
                else
                {
                    pmd_b.ChildName = data[3].Trim();
                }
                if (data[4] == "")
                {
                    pmd_b.IKTargetName = null;
                }
                else
                {
                    pmd_b.IKTargetName = data[4].Trim();
                }

                boneStructure.Add(pmd_b.szName, pmd_b);

                // 枠に表示するボーン名の設定
                if (data[5].Trim() != "")
                {
                    bool flag = false;
                    foreach (DispBoneGroup dbg in dispBoneGroup)
                    {
                        if (dbg.group_name == data[5].Trim())
                        {
                            dbg.bone_name_list.Add(data[0].Trim());
                            flag = true;
                        }
                    }

                    if (flag == false)
                    {
                        DispBoneGroup dbg = new DispBoneGroup();
                        dbg.group_name     = data[5].Trim();
                        dbg.bone_name_list = new List <string>();
                        dbg.bone_name_list.Add(data[0].Trim());
                        dispBoneGroup.Add(dbg);
                    }
                }
            }
            sr.Close();

            //内容を一行ずつ読み込む
            sr = new System.IO.StreamReader(
                Path.Combine(path, @"IKBone.txt"),
                System.Text.Encoding.GetEncoding("shift_jis"));
            while (sr.Peek() > -1)
            {
                string   line = sr.ReadLine();
                string[] data = line.Split(',');

                PMD_IK pmd_ik = new PMD_IK();

                pmd_ik.nTargetName = data[0].Trim();              // IKボーン番号
                pmd_ik.nEffName    = data[1].Trim();              // IKターゲットボーン番号 // IKボーンが最初に接続するボーン
                pmd_ik.cbNumLink   = int.Parse(data[2].Trim());   // IKチェーンの長さ(子の数)
                pmd_ik.unCount     = int.Parse(data[3].Trim());   // 再帰演算回数 // IK値1
                pmd_ik.fFact       = float.Parse(data[4].Trim()); // IKの影響度 // IK値2

                List <string> tem_list = new List <string>();
                for (int i = 5; i < data.Length; i++)
                {
                    tem_list.Add(data[i].Trim());
                }
                pmd_ik.punLinkName = (string[])tem_list.ToArray();

                IKBone.Add(pmd_ik);
            }
            sr.Close();
        }
コード例 #4
0
        public void ReadPmdFile(BinaryReader i_reader)
        {
            DataReader reader = new DataReader(i_reader);

            // -----------------------------------------------------
            // ヘッダー情報取得
            pmd_header = new PMD_Header();
            pmd_header.read(reader);
            if (!pmd_header.szMagic.Equals("PMD", StringComparison.CurrentCultureIgnoreCase))
            {
                throw new MmdException();
            }

            // -----------------------------------------------------
            // 頂点数取得
            number_of_vertex = reader.readInt();//
            if (number_of_vertex < 0)
            {
                throw new MmdException();
            }

            // 頂点配列取得
            pmd_vertex = new PMD_Vertex[number_of_vertex];

            for (int i = 0; i < number_of_vertex; i++)
            {
                pmd_vertex[i] = new PMD_Vertex();
                pmd_vertex[i].read(reader);
            }

            // -----------------------------------------------------
            // 頂点インデックス数取得
            number_of_indices = reader.readInt();

            // 頂点インデックス配列取得
            indices_array = new short[number_of_indices];
            for (int i = 0; i < number_of_indices; i++)
            {
                indices_array[i] = reader.readShort();
            }

            // -----------------------------------------------------
            // マテリアル数取得
            number_of_materials = reader.readInt();

            // マテリアル配列取得
            pmd_material = new PMD_Material[number_of_materials];
            for (int i = 0; i < number_of_materials; i++)
            {
                pmd_material[i] = new PMD_Material();
                pmd_material[i].read(reader);
            }

            // -----------------------------------------------------
            // Bone数取得
            number_of_bone = reader.readShort();

            // Bone配列取得
            pmd_bone = new PMD_Bone[number_of_bone];
            for (int i = 0; i < number_of_bone; i++)
            {
                pmd_bone[i] = new PMD_Bone();
                pmd_bone[i].read(reader);
            }

            // ボーンIDを名前に置き換え
            // Bone
            foreach (PMD_Bone bone in pmd_bone)
            {
                if (bone.nParentNo <= -1)
                {
                    bone.ParentName = null;
                }
                else
                {
                    bone.ParentName = pmd_bone[bone.nParentNo].szName;
                }
                if (bone.nChildNo <= 0)
                {
                    bone.ChildName = null;
                }
                else
                {
                    bone.ChildName = pmd_bone[bone.nChildNo].szName;
                }
                if (bone.unIKTarget <= 0)
                {
                    bone.IKTargetName = null;
                }
                else
                {
                    bone.IKTargetName = pmd_bone[bone.unIKTarget].szName;
                }
            }
            // Vertex
            foreach (PMD_Vertex vertex in pmd_vertex)
            {
                if (vertex.unBoneNo[0] <= -1)
                {
                    vertex.unBoneName[0] = null;
                }
                else
                {
                    vertex.unBoneName[0] = pmd_bone[vertex.unBoneNo[0]].szName;
                }
                if (vertex.unBoneNo[1] <= -1)
                {
                    vertex.unBoneName[1] = null;
                }
                else
                {
                    vertex.unBoneName[1] = pmd_bone[vertex.unBoneNo[1]].szName;
                }
            }

            // -----------------------------------------------------
            // IK配列数取得
            number_of_ik = reader.readShort();

            // IK配列取得
            pmd_ik = new PMD_IK[number_of_ik];
            if (number_of_ik > 0)
            {
                for (int i = 0; i < number_of_ik; i++)
                {
                    pmd_ik[i] = new PMD_IK();
                    pmd_ik[i].read(reader);
                }
            }
            // ボーンIDを名前に置き換え
            foreach (PMD_IK ik in pmd_ik)
            {
                if (ik.nTargetNo <= -1)
                {
                    ik.nTargetName = null;
                }
                else
                {
                    ik.nTargetName = pmd_bone[ik.nTargetNo].szName;
                }
                if (ik.nEffNo <= -1)
                {
                    ik.nEffName = null;
                }
                else
                {
                    ik.nEffName = pmd_bone[ik.nEffNo].szName;
                }

                for (int i = 0; i < ik.cbNumLink; i++)
                {
                    if (ik.punLinkNo[i] <= -1)
                    {
                        ik.punLinkName[i] = null;
                    }
                    else
                    {
                        ik.punLinkName[i] = pmd_bone[ik.punLinkNo[i]].szName;
                    }
                }
            }

            // -----------------------------------------------------
            // Face数取得
            number_of_face = reader.readShort();

            // Face配列取得
            pmd_face = new PMD_FACE[number_of_face];
            if (number_of_face > 0)
            {
                for (int i = 0; i < number_of_face; i++)
                {
                    pmd_face[i] = new PMD_FACE();
                    pmd_face[i].read(reader);
                }
            }

            // -----------------------------------------------------
            // 表情枠
            // -----------------------------------------------------
            // 表情枠に表示する表情数
            skin_disp_count = reader.readByte();

            // 表情番号
            skin_index = new int[skin_disp_count];
            if (skin_disp_count > 0)
            {
                for (int i = 0; i < skin_disp_count; i++)
                {
                    skin_index[i] = reader.readShort();
                }
            }

            // -----------------------------------------------------
            // ボーン枠
            // -----------------------------------------------------
            // ボーン枠用の枠名数
            bone_disp_name_count = reader.readByte();

            // 枠名(50Bytes/枠)
            disp_name = new string[bone_disp_name_count];
            if (bone_disp_name_count > 0)
            {
                for (int i = 0; i < bone_disp_name_count; i++)
                {
                    disp_name[i] = reader.readAscii(50);
                }
            }

            // -----------------------------------------------------
            // ボーン枠に表示するボーン
            // -----------------------------------------------------
            // ボーン枠に表示するボーン数
            bone_disp_count = reader.readInt();

            // 枠用ボーンデータ (3Bytes/bone)
            bone_disp = new PMD_BoneDisp[bone_disp_count];
            if (bone_disp_count > 0)
            {
                for (int i = 0; i < bone_disp_count; i++)
                {
                    bone_disp[i] = new PMD_BoneDisp();
                    bone_disp[i].read(reader);
                }
            }

            // ボーンIDを名前に置き換え
            for (int i = 0; i < bone_disp.Length; i++)
            {
                bone_disp[i].bone_name = pmd_bone[bone_disp[i].bone_index].szName;
            }

            // -----------------------------------------------------
            // 英名対応(0:英名対応なし, 1:英名対応あり)
            // -----------------------------------------------------
            english_name_compatibility = reader.readByte();

            if (english_name_compatibility == 1)
            {
                model_name_eg = reader.readAscii(20);  // モデル名(英語)
                comment_eg    = reader.readAscii(256); // コメント(英語)

                // -----------------------------------------------------
                // ボーン名(英語)
                // -----------------------------------------------------
                bone_name_eg = new string[number_of_bone];
                if (number_of_bone > 0)
                {
                    for (int i = 0; i < number_of_bone; i++)
                    {
                        bone_name_eg[i] = reader.readAscii(20);
                    }
                }

                // -----------------------------------------------------
                // 表情名(英語)
                // -----------------------------------------------------
                skin_name_eg = new string[number_of_face - 1];
                if (number_of_face - 1 > 0)
                {
                    for (int i = 0; i < number_of_face - 1; i++)
                    {
                        skin_name_eg[i] = reader.readAscii(20);
                    }
                }

                // -----------------------------------------------------
                // 枠名(英語)
                // -----------------------------------------------------
                disp_name_eg = new string[bone_disp_name_count];
                if (bone_disp_name_count > 0)
                {
                    for (int i = 0; i < bone_disp_name_count; i++)
                    {
                        disp_name_eg[i] = reader.readAscii(50);
                    }
                }
            }

            // -----------------------------------------------------
            // トゥーンテクスチャファイル名
            // -----------------------------------------------------
            toon_file_name = new string[10];
            for (int i = 0; i < 10; i++)
            {
                toon_file_name[i] = reader.readAscii(100);
            }

            // -----------------------------------------------------
            // 剛体
            // -----------------------------------------------------
            // 剛体数
            rigidbody_count = reader.readInt();

            // 剛体データ(83Bytes/rigidbody)
            rigidbody = new PMD_RigidBody[rigidbody_count];
            if (rigidbody_count > 0)
            {
                for (int i = 0; i < rigidbody_count; i++)
                {
                    rigidbody[i] = new PMD_RigidBody();
                    rigidbody[i].read(reader);
                }
            }

            // -----------------------------------------------------
            // ジョイント
            // -----------------------------------------------------
            // ジョイント数
            joint_count = reader.readInt();

            // ジョイントデータ(124Bytes/joint)
            joint = new PMD_Joint[joint_count];
            if (joint_count > 0)
            {
                for (int i = 0; i < joint_count; i++)
                {
                    joint[i] = new PMD_Joint();
                    joint[i].read(reader);
                }
            }

            return;
        }