// 指定名称を持つ表示枠に指定ボーン名を入れる void AddBoneNameInDisp(string bone_name, string disp_name) { PMD_DispGroup found_group = null; // 指定名称を持つ表示枠を検索する foreach (PMD_DispGroup group in boneDispGroups) { if (group.name == disp_name) { found_group = group; break; } } // なければ追加する if (found_group == null) { found_group = new PMD_DispGroup(); found_group.name = disp_name; boneDispGroups.Add(found_group); } // 表示枠にボーン名を追加する // すでに同じ名前が入っているなら追加しない PMD_BoneDisp found_disp = null; foreach (PMD_BoneDisp disp in found_group.disps) { if (disp.bone_name == bone_name) { found_disp = disp; break; } } if (found_disp == null) { PMD_BoneDisp disp = new PMD_BoneDisp(); disp.bone_name = bone_name; found_group.disps.Add(disp); } }
public CorrespondTable() { boneDispGroups = new List <PMD_DispGroup>(); { PMD_DispGroup disp_group = new PMD_DispGroup(); disp_group.name = "Root"; disp_group.name_en = "Root"; disp_group.spec = 1; boneDispGroups.Add(disp_group); } { PMD_DispGroup disp_group = new PMD_DispGroup(); disp_group.name = "表情"; disp_group.name_en = "Exp"; disp_group.spec = 1; boneDispGroups.Add(disp_group); } }
/// Figureを元にPmdFileを更新します。 /// ボーンは人型です。 public void UpdatePmdFromFigureWithHumanBone() { int mod_type = 0; if (fig.Tmo.nodes.Length == 227) { mod_type = 0; } else if (fig.Tmo.nodes.Length == 75) { mod_type = 1; } else { throw new FormatException("未対応のボーン構造です。\n人型以外を変換する場合は、\n出力ボーンに\"1ボーン\"を指定してください。"); } CorrespondTable cortable; if (mod_type == 0) { cortable = cortable_list.GetCorrespondTable(); } else { cortable_list.BoneKind = CorrespondTableListBoneKind.man; cortable = cortable_list.GetCorrespondTable(); } // ----------------------------------------------------- // ボーン情報 // ----------------------------------------------------- List <PMD_Bone> nodes = new List <PMD_Bone>(); foreach (KeyValuePair <string, PMD_Bone> bone_kvp in cortable.boneStructure) { PMD_Bone bone = bone_kvp.Value; PMD_Bone pmd_b = new PMD_Bone(); pmd_b.name = bone.name; pmd_b.name_en = bone.name_en; pmd_b.Kind = bone.Kind; pmd_b.ParentName = bone.ParentName; pmd_b.TailName = bone.TailName; pmd_b.TargetName = bone.TargetName; string bone_name = null; cortable.bonePositions.TryGetValue(pmd_b.name, out bone_name); if (bone_name != null) { pmd_b.position = Trans.CopyMat2Pos(fig.Tmo.FindNodeByName(bone_name).combined_matrix); // モデル原点からの位置 } nodes.Add(pmd_b); } SortNodes(nodes); // ----------------------------------------------------- // リストを配列に代入し直す pmd.nodes = nodes.ToArray(); UpdateRootBonePosition(); if (mod_type == 0) { UpdateEyesBonePosition(); } UpdateIKTailBonePosition(); // ----------------------------------------------------- // 予め、情報をコピーするmeshを選定し、並び替えておく // ----------------------------------------------------- SelectMeshes(); // ----------------------------------------------------- // 頂点 // ----------------------------------------------------- MakePMDVertices(cortable, mod_type); // ----------------------------------------------------- // 表情 // ----------------------------------------------------- if (mod_type == 0) { InitializePMDFaces(); MakePMDFaces(); } else { InitializePMDFaces(); pmd.skins = new PMD_Skin[0]; } // ----------------------------------------------------- // IK配列 // ----------------------------------------------------- pmd.iks = cortable.iks.ToArray(); // ----------------------------------------------------- // 表示枠 // ----------------------------------------------------- pmd.disp_groups = cortable.boneDispGroups; if (mod_type == 0) { PMD_DispGroup disp_group = pmd.disp_groups[1];//表情枠 for (int i = 0; i < pmd.skins.Length; i++) { PMD_SkinDisp skin_disp = new PMD_SkinDisp(); skin_disp.skin_id = (sbyte)i; disp_group.disps.Add(skin_disp); } } if (mod_type == 0) { T2PPhysObjectList physOb_list = new T2PPhysObjectList(nodes); template_list.PhysObExecute(ref physOb_list); pmd.bodies = physOb_list.bodies.ToArray(); pmd.joints = physOb_list.joints.ToArray(); } else { pmd.bodies = new PMD_RBody[0]; pmd.joints = new PMD_Joint[0]; } }
/// Figureを元にPmdFileを更新します。 /// ボーンはセンターのみです。 public void UpdatePmdFromFigureWithOneBone() { CorrespondTable cortable; cortable_list.BoneKind = CorrespondTableListBoneKind.one; cortable = cortable_list.GetCorrespondTable(); PMD_DispGroup disp_group = cortable.boneDispGroups[0];//Root枠 { PMD_BoneDisp disp = new PMD_BoneDisp(); disp.bone_name = "センター"; disp_group.disps.Add(disp); } // ----------------------------------------------------- // ボーン情報 // ----------------------------------------------------- pmd.nodes = new PMD_Bone[2]; // センター pmd.nodes[0] = new PMD_Bone(); pmd.nodes[0].name = "センター"; pmd.nodes[0].Kind = 1; // 1:回転と移動 pmd.nodes[0].ParentName = null; pmd.nodes[0].TailName = "センター先"; pmd.nodes[0].TargetName = null; pmd.nodes[0].position = new Vector3(0.0f, 5.0f, 0.0f); // センター先 pmd.nodes[1] = new PMD_Bone(); pmd.nodes[1].name = "センター先"; pmd.nodes[1].Kind = 7; // 7:非表示 pmd.nodes[1].ParentName = "センター"; pmd.nodes[1].TailName = null; pmd.nodes[1].TargetName = null; pmd.nodes[1].position = new Vector3(0.0f, 0.0f, 0.0f); // ----------------------------------------------------- // 予め、情報をコピーするmeshを選定し、並び替えておく // ----------------------------------------------------- SelectMeshes(); // ----------------------------------------------------- // 頂点&マテリアル // ----------------------------------------------------- MakePMDVertices(null, 2); // ----------------------------------------------------- // 表情 // ----------------------------------------------------- pmd.skins = new PMD_Skin[0]; // ----------------------------------------------------- // IK配列 // ----------------------------------------------------- pmd.iks = new PMD_IK[0]; // ----------------------------------------------------- // 表示枠 // ----------------------------------------------------- pmd.disp_groups = cortable.boneDispGroups; pmd.bodies = new PMD_RBody[0]; pmd.joints = new PMD_Joint[0]; }