ストック オブジェクト (Stock objects)

単純な形状のMeshが既定で用意されており、これを使用することで簡単に3Dのオブジェクトを表示できます。

なおMeshを使用するには、Direct3D Extensions library (D3DX) を参照に追加する必要があります。

ストック オブジェクトの作成

ボックス (Box)
public static Mesh Box(
    Device device,
    float width,   // X軸方向の大きさ
    float height,  // Y軸方向の大きさ
    float depth    // Z軸方向の大きさ
)
円柱 (Cylinder)
public static Mesh Cylinder(
    Device device,
    float radius1, // 面の半径 (Z軸のの方向側)
    float radius2, // 面の半径 (Z軸のの方向側)
    float length,  // 円柱の長さ (Z軸方向)
    int slices,    // 主軸に平行な方向の分割数
    int stacks     // 主軸に垂直な方向の分割数
)
多角形 (Polygon)
public static Mesh Polygon(
    Device device,
    float length, // 各辺の長さ
    int sides     // 辺の数 (sides角形)
)
(Sphere)
public static Mesh Sphere(
    Device device,
    float radius,  // 球の半径 [0より大きな値]
    int slices,    // 主軸に平行な方向の分割数 [2以上]
    int stacks     // 主軸に垂直な方向の分割数 [2以上]
)
トーラス (Torus)
public static Mesh Torus(
    Device device,
    float innerRadius,  // 環状部の半径
    float outerRadius,  // 全体の半径
    int sides,          // 環状部の円の辺の数
    int rings           // 全体の辺の数
)
ティーポット (Teapot)
public static Mesh Teapot(
    Device device
)
※すべて左手座標系で作成されます。

描画

public void DrawSubset(
    int attributeID
)

サンプルコード

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

public class Form1 : Form
{
    Device device;
    Mesh mesh;

    public Form1()
    {
        PresentParameters presentParameters = new PresentParameters();

        presentParameters.Windowed = true;
        presentParameters.SwapEffect = SwapEffect.Discard;

        this.device = new Device( 0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParameters );

        // メッシュの作成
        this.mesh = Mesh.Teapot( this.device );
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        this.device.Clear( ClearFlags.Target, Color.Black, 1.0f, 0 );
        this.device.BeginScene();


        // 視野錐台
        float fieldOfViewY = ( float )Math.PI / 2.0f;
        float aspectRatio = 1.0f;
        float znearPlane = 0.0f;
        float zfarPlane = 1.0f;

        this.device.Transform.Projection = Matrix.PerspectiveFovLH( fieldOfViewY, aspectRatio, znearPlane, zfarPlane );

        // 視野
        Vector3 cameraPosition = new Vector3( 1.3f, 1.3f, 1.3f );
        Vector3 cameraTarget = new Vector3( 0.0f, 0.0f, 0.0f );
        Vector3 cameraUpVector = new Vector3( 0.0f, 1.0f, 0.0f );

        this.device.Transform.View = Matrix.LookAtLH( cameraPosition, cameraTarget, cameraUpVector );

        // ライト
        this.device.Lights[ 0 ].Direction = new Vector3( 0.0f, -1.0f, -1.0f );
        this.device.Lights[ 0 ].Diffuse = Color.White;
        this.device.Lights[ 0 ].Enabled = true;
        this.device.Lights[ 0 ].Update();

        // マテリアル
        Material material = new Material();
        material.Diffuse = Color.White;
        this.device.Material = material;

        this.device.RenderState.Lighting = true;

        // メッシュの描画
        this.mesh.DrawSubset( 0 );


        this.device.EndScene();
        this.device.Present();
    }


    static void Main()
    {
        Form1 form1 = new Form1();

        form1.Show();

        while( form1.Created )
        {
            Application.DoEvents();
        }
    }
}


実行結果