差分
編集の要約なし
public class Model3D { public static Dictionary<string, Model> ModelsCache ===ビュー===ビューとはビューモデルに装飾して実際の[[UI]]を貼付ける部分をいう。new Dictionary<string, Model>();
/// <summary> /// 位置 /// </summary> public Vector3 Position; public Model3D(Game game, string modelName) { // game this.Game = game; // model if (!ModelsCache.ContainsKey(modelName)) {stub var model = game.Content.Load<Model>(modelName); ModelsCache.Add(modelName, model); } this.Model = ModelsCache[modelName]; // boneを抽出しておく。 this.Bones = new Matrix[this.Model.Bones.Count]; this.Model.CopyAbsoluteBoneTransformsTo(this.Bones); // BasicEffectの基本設定をDrawメソッドの中で毎回やるのは非常に無駄なので事前に設定しておく。 // Androidでは実質的にGeometry Instancingの様な技法が使えないのでDrawコールの軽量化は重要になる。 // (ジオメトリシェーダーに対応したOpenGL ES 3.2対応端末が広く普及するのは10年後だろう) // これだけでもショボいAndroid(F-04G)では300モデルでフレームレートが20%くらい違ってくる。 foreach (var mesh in this.Model.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.LightingEnabled = true; effect.PreferPerPixelLighting = true; } } } // Camera引数は「MonoGameのカメラを作る」を参照 public void Draw(Camera camera) { var meshes = this.Model.Meshes; var bones = this.Bones; // 回転をMatrixに変換 var yaw = MathHelper.ToRadians(this.Rotation.Y); var pitch = MathHelper.ToRadians(this.Rotation.X); var roll = MathHelper.ToRadians(this.Rotation.Z); var rotation = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll); // 位置をMatrixに変換 var postion = Matrix.CreateTranslation(this.Position); // この手の定番計算はCameraクラスを作っておくと捗る。 var view = camera.View; var projection = camera.Projection; foreach (var mesh in meshes) { // 一般的な四則演算と異なり、行列の乗算除算は順番が重要。 // そのため「rotation」と「position」を入れ替えると残念な結果になる。 var world = bones[mesh.ParentBone.Index] * rotation * postion; foreach (BasicEffect effect in mesh.Effects) { effect.World = world; effect.View = view; effect.Projection = projection; } mesh.Draw(); } } }</source> == 関連項目 ==* [[MonoGameのカメラを作る]] * [[Geometry Instancing]]* [[MonoGameで使う3DモデルをFusion360で作成する]]* [[MacOS版のMonoGameのPipeline.appで3Dモデルをビルドできない]]* [[MonoGameで外部のXNBファイルを読み込む]] [[category: MonoGame]]