/// <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; }
/// <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; }
/// <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; } } }