Пример #1
0
        /// <summary>
        /// バインドポーズの作成
        /// </summary>
        /// <returns>レンダラー</returns>
        /// <param name='mesh'>対象メッシュ</param>
        /// <param name='materials'>設定するマテリアル</param>
        /// <param name='bones'>設定するボーン</param>
        SkinnedMeshRenderer[] BuildingBindpose(Mesh[] mesh, Material[][] materials, GameObject[] bones)
        {
            // メッシュルートを生成してルートの子供に付ける
            Transform mesh_root_transform = (new GameObject("Mesh")).transform;
            mesh_root_transform.parent = root_game_object_.transform;

            //モデルルート取得
            Transform model_root_transform = root_game_object_.transform.FindChild("Model");
            //ボーン共通データ
            Matrix4x4[] bindposes = bones.Select(x=>x.transform.worldToLocalMatrix).ToArray();
            Transform[] bones_transform = bones.Select(x=>x.transform).ToArray();

            //レンダー設定
            SkinnedMeshRenderer[] result = new SkinnedMeshRenderer[mesh.Length];
            for (int i = 0, i_max = mesh.Length; i < i_max; ++i) {
                Transform mesh_transform = (new GameObject("Mesh" + i.ToString())).transform;
                mesh_transform.parent = mesh_root_transform;
                SkinnedMeshRenderer smr = mesh_transform.gameObject.AddComponent<SkinnedMeshRenderer>();
                mesh[i].bindposes = bindposes;
                smr.sharedMesh = mesh[i];
                smr.bones = bones_transform;
                smr.materials = materials[i];
                smr.rootBone = model_root_transform;
                smr.receiveShadows = false; //影を受けない

                result[i] = smr;
            }
            return result;
        }
Пример #2
0
        /// <summary>
        /// モーフ作成
        /// </summary>
        /// <param name='mesh'>対象メッシュ</param>
        /// <param name='materials'>対象マテリアル</param>
        /// <param name='bones'>対象ボーン</param>
        /// <param name='renderers'>対象レンダラー</param>
        /// <param name='creation_info'>メッシュ作成情報</param>
        void CreateMorph(Mesh[] mesh, Material[][] materials, GameObject[] bones, SkinnedMeshRenderer[] renderers, MeshCreationInfo[] creation_info)
        {
            //表情ルートを生成してルートの子供に付ける
            GameObject expression_root = new GameObject("Expression");
            Transform expression_root_transform = expression_root.transform;
            expression_root_transform.parent = root_game_object_.transform;

            //表情マネージャー
            MorphManager morph_manager = expression_root.AddComponent<MorphManager>();
            morph_manager.uv_morph = new MorphManager.UvMorphPack[1 + format_.header.additionalUV]; //UVモーフ数設定

            //個別モーフスクリプト作成
            GameObject[] morphs = new GameObject[format_.morph_list.morph_data.Length];
            for (int i = 0, i_max = format_.morph_list.morph_data.Length; i < i_max; ++i) {
                morphs[i] = new GameObject(format_.morph_list.morph_data[i].morph_name);
                // 表情を親ボーンに付ける
                morphs[i].transform.parent = expression_root_transform;
            }

            //グループモーフ作成
            CreateGroupMorph(morph_manager, morphs);
            //ボーンモーフ
            morph_manager.bones = bones.Select(x=>x.transform).ToArray();
            CreateBoneMorph(morph_manager, morphs);
            //頂点モーフ作成
            CreateVertexMorph(morph_manager, morphs, creation_info);
            //UV・追加UVモーフ作成
            CreateUvMorph(morph_manager, morphs, creation_info);
            //材質モーフ作成
            CreateMaterialMorph(morph_manager, morphs, creation_info);
            //モーフ一覧設定(モーフコンポーネントの情報を拾う為、最後に設定する)
            morph_manager.morphs = morphs.Select(x=>x.GetComponent<MorphBase>()).ToArray();

            //メッシュ・マテリアル設定
            morph_manager.renderers = renderers;
            morph_manager.mesh = mesh;
            morph_manager.materials = materials;
        }
Пример #3
0
        /// <summary>
        /// 剛体のグローバル座標化
        /// </summary>
        /// <param name='joints'>ジョイントのゲームオブジェクト</param>
        void GlobalizeRigidbody(GameObject[] joints)
        {
            Transform physics_root_transform = root_game_object_.transform.Find("Physics");
            PhysicsManager physics_manager = physics_root_transform.gameObject.GetComponent<PhysicsManager>();

            if ((null != joints) && (0 < joints.Length)) {
                // PhysicsManagerに移動前の状態を覚えさせる(幾つか重複しているので重複は削除)
                physics_manager.connect_bone_list = joints.Select(x=>x.gameObject)
                                                            .Distinct()
                                                            .Select(x=>new PhysicsManager.ConnectBone(x, x.transform.parent.gameObject))
                                                            .ToArray();

                //isKinematicで無くConfigurableJointを持つ場合はグローバル座標化
                foreach (ConfigurableJoint joint in joints.Where(x=>!x.GetComponent<Rigidbody>().isKinematic)
                                                            .Select(x=>x.GetComponent<ConfigurableJoint>())) {
                    joint.transform.parent = physics_root_transform;
                }
            }
        }