虎のモデルを描画する



C# DirectX のサンプルモデルとして格納されている虎のメッシュ(Tiger.x)を描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. DirectX のサンプルプログラムとして格納されている虎のメッシュ(Tiger.x)を回転しながら描画します。
    メッシュを描画するプログラムは トーラスをライトで照らして描画する を参照して下さい。
    Xファイルを入力して表示するプログラムは コーンのメッシュ(cone.x)を描画する を参照して下さい。
  2. 虎のメッシュ(Tiger.x)が真っ黒になるのは「法線ベクトル」が設定されていないことが原因です。
    そこで、法線ベクトルが設定されていないときは、プログラムで法線ベクトルを設定します。
    Tiger.x を入力する OnResetDevice() です。
    「// 法線情報がなければ計算して作成」以降が法線ベクトルの設定です。
    mesh.Clone() でクローンメッシュを作成します。
    temporaryMesh.ComputeNormals() で法線ベクトルを計算します。
    mesh.Dispose() で元のメッシュを削除して、mesh = temporaryMesh で置き換えます。
            public void OnResetDevice(object sender, EventArgs e)
            {
                Device dev = (Device)sender;
                dev.RenderState.ZBufferEnable = true;
                dev.RenderState.Ambient = System.Drawing.Color.FromArgb(0x202020);
    
                // Load the mesh from the specified file
                ExtendedMaterial[] materials = null;
                Directory.SetCurrentDirectory(@"c:\data\xfile\");
                //mesh = Mesh.FromFile("cone.x", MeshFlags.SystemMemory, device, out materials);
                mesh = Mesh.FromFile("tiger.x", MeshFlags.SystemMemory, device, out materials);
    
                // Allocate a material/texture arrays
                meshMaterials = new Material[materials.Length];
                meshTextures = new Texture[materials.Length];
    
                // Copy the materials and load the textures
                for(int i = 0; i < meshMaterials.Length; i++)
                {
                    meshMaterials[i] = materials[i].Material3D;
                    meshMaterials[i].AmbientColor = meshMaterials[i].DiffuseColor;
    
                    if ( (materials[i].TextureFilename != null) && (materials[i].TextureFilename.Length > 0) )
                    {
                        // Create the texture
                        meshTextures[i] = TextureLoader.FromFile(dev, materials[i].TextureFilename);
                    }
                }
    
                // 法線情報がなければ計算して作成
                if ((mesh.VertexFormat & VertexFormats.Normal) == 0)
                {
                    Mesh temporaryMesh = mesh.Clone(mesh.Options.Value,
                        mesh.VertexFormat | VertexFormats.Normal, device);
                    // 法線を計算
                    temporaryMesh.ComputeNormals();
                    // 古いメッシュを破棄し、置き換える
                    mesh.Dispose();
                    mesh = temporaryMesh;
                }
            }
        
  3. 新しい OS(新しい VC++) でコンパイルすると、エラーが発生するかも知れません。
    詳細は コーンのメッシュ(cone.x)を描画する を参照して下さい。

【課題】

  1. プログラムを完成させて下さい。
  2. 虎のモデルが真っ黒にならないで、正常に描画されることを確かめて下さい。 \(^o^)/

超初心者のプログラム入門(C# Frame Work)