[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>メッシュ(2.0)

メッシュ(2.0)

ここに書いてあるソースは1.1の改造版です。まずはそちらをお読み下さい。

まだ書きかけです。とりあえずソースコードは修正済なので試してみたい方はどうぞ。

ソースコード

カメラ、ライトで若干の変化があります。

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace Project2
{
    /// <summary>
    /// md3d2 の概要の説明です。
    /// </summary>
    public class md3d2 : Form
    {

        public md3d2()
            : base()
        {
            //最小サイズを設定
            this.MinimumSize = new Size(80, 60);
            //ウィンドウの名前(かっこいいのを付けてあげてください)
            this.Text = "Direct3D-My";
        }

        private Device device_;
        private PresentParameters presentParam_;


        /// <summary>
        /// 立方体メッシュ
        /// </summary>
        private Mesh boxMesh_;

        /// <summary>
        /// Direct3Dの初期化を行います。
        /// </summary>
        /// <returns>初期化が成功したかどうか</returns>
        public bool DXInitialize()
        {
            try
            {
                presentParam_ = new PresentParameters();

                presentParam_.IsWindowed = true;
                presentParam_.SwapEffect = SwapEffect.Discard;

                device_ = new Device(0, DeviceType.Hardware, this.Handle
                    , CreateFlags.HardwareVertexProcessing, presentParam_);


                //メッシュを作成
                creatMesh();

                return true;
            }
            catch
            {
                return false;
            }

        }


        /// <summary>
        /// メッシュを作成する
        /// </summary>
        private void creatMesh()
        {
            boxMesh_ = Mesh.Box(device_, 2, 2, 2);
        }

        public void Render()
        {
            if (device_ == null) return;
            if (this.WindowState == FormWindowState.Minimized) return;

            //回転を行う
            //device_.Transform.World =
            //  Matrix.RotationY(Environment.TickCount /300f);


            //カメラの設定を行う
            device_.Transform.View = Matrix.LookAtLeftHanded(
                new Vector3(5.0f, 5.0f, 5.0f),
                new Vector3(0.0f, 0.0f, 0.0f),
                new Vector3(0.0f, 1.0f, 0.0f));
            device_.Transform.Projection =
                Matrix.PerspectiveFieldOfViewLeftHanded((float)Math.PI / 4,
                (float)this.ClientSize.Width / (float)this.ClientSize.Height,
                3.0f, 100.0f);

            //device_.RenderState.Lighting =false;

            //ライトの設定
            device_.Lights[0].Direction = Vector3.Normalize(new Vector3(-1, -2, -3));
            device_.Lights[0].LightType = LightType.Directional;

            device_.Lights[0].Diffuse = Color.FromArgb(255, 255, 255);
            device_.Lights[0].Ambient = Color.FromArgb(40, 40, 40);

            device_.Lights[0].Enabled = true;
            device_.Lights[0].Update();



            //マテリアルの設定
            Material mat = new Material();
            mat.AmbientColor = new ColorValue(1.0f, 1.0f, 1.0f);
            mat.DiffuseColor = new ColorValue(1.0f, 1.0f, 1.0f);
            device_.Material = mat;


            device_.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);

            device_.BeginScene();

            boxMesh_.DrawSubset(0);


            device_.EndScene();

            try
            {
                //更新
                device_.Present();
            }
            catch (DeviceLostException)
            {
                resetDevice();
            }

        }

        /// <summary>
        /// デバイスのリセットを行う
        /// </summary>
        private void resetDevice()
        {
            ResultCode result = device_.CheckCooperativeLevelResult();
            if (result == ResultCode.DeviceLost)
            {
                //ちょっと待つ
                System.Threading.Thread.Sleep(10);
            }
            else if (result == ResultCode.DeviceNotReset)
            {
                device_.Reset(presentParam_);
            }
        }
    }

    /// <summary>
    /// エントリクラス
    /// </summary>
    class Program
    {
        public static void Main()
        {
            using (md3d2 dxform = new md3d2())
            {
                if (!dxform.DXInitialize())
                {
                    MessageBox.Show("Diret3Dの初期化に失敗しました。"
                        , "初期化の失敗");
                    return;
                }
                dxform.Show();

                while (dxform.Created)
                {
                    dxform.Render();
                    Application.DoEvents();
                }
            }
        }
    }
}


ページの一番上へ
前のページへ 一覧に戻る 次のページへ

初版2006-3-11
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D(Managed DirectX 2.0)>メッシュ(2.0)