private static PmdBone[] createBoneArray(DataReader i_reader) { int number_of_bone = i_reader.readShort(); PMD_Bone tmp_pmd_bone = new PMD_Bone(); PmdBone[] result = new PmdBone[number_of_bone]; for (int i = 0; i < number_of_bone; i++) { tmp_pmd_bone.read(i_reader); //ボーンの親子関係を一緒に読みだすので。 result[i] = new PmdBone(tmp_pmd_bone, result); } for (int i = 0; i < number_of_bone; i++) { result[i].recalcOffset(); } return(result); }
public PmdBone(PMD_Bone pPMDBoneData, PmdBone[] pBoneArray) { // ボーン名のコピー this._name = pPMDBoneData.szName; // 位置のコピー this._pmd_bone_position.setValue(pPMDBoneData.vec3Position); // 親ボーンの設定 if (pPMDBoneData.nParentNo != -1) { this._parent_bone = pBoneArray[pPMDBoneData.nParentNo]; m_vec3Offset.Vector3Sub(this._pmd_bone_position, this._parent_bone._pmd_bone_position); } else { // 親なし this._parent_bone = null; this.m_vec3Offset.setValue(this._pmd_bone_position); } // 子ボーンの設定 if (pPMDBoneData.nChildNo != -1) { this.m_pChildBone = pBoneArray[pPMDBoneData.nChildNo]; } this.m_matInvTransform.MatrixIdentity(); this.m_matInvTransform.m[3, 0] = -this._pmd_bone_position.x; this.m_matInvTransform.m[3, 1] = -this._pmd_bone_position.y; this.m_matInvTransform.m[3, 2] = -this._pmd_bone_position.z; this.m_bIKLimitAngle = false; // 各変数の初期値を設定 reset(); }
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(); }
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; }