예제 #1
0
        // 指定名称を持つ表示枠に指定ボーン名を入れる
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        /// 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];
            }
        }
예제 #4
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];
        }