テキスト (text)

3Dテキスト (Meshクラス)

作成

public static MeshTextFromFont(
    Device device,   // デバイス
    Font font,       // テキストのフォント
    string text,     // 作成する文字列
    float deviation, // テキストの輪郭の滑らかさ
    float extrusion  // テキストの奥行き
);
Mesh.TextFromFont(Device,Font,String,Single,Single) | MSDN
deviationの値による表示の相違
deviationの値 1.0 0.001
表示イメージ
extrusionの値による表示の相違
extrusionの値 0.1 0.2
表示イメージ

描画

テキストの位置などはDevice.Transform.Worldで、色はマテリアルで指定します。

public void DrawSubset(
    int attributeID
);
BaseMesh.DrawSubset(Int32) | MSDN

3Dテキストの描画はストックオブジェクトの描画と同一です。

2Dテキスト (Fontクラス)

作成

public Font(
    Device device,  // デバイス
    Font font       // テキストのフォント
);
Font.Font(Device,Font) | MSDN

描画

描画位置で指定
public int DrawText(
    Sprite sprite,  // テキストを格納するスプライト
    string text,    // 描画する文字列
    Point pos,      // テキストの位置 (スクリーン座標)
    Color color     // テキストの色
);
Font.DrawText メソッド (Sprite, String, Point, Color) (Microsoft.WindowsMobile.DirectX.Direct3D) | MSDN
描画領域で指定
public int DrawText(
    Sprite sprite,         // テキストを格納するスプライト
    string text,           // 描画する文字列
    Rectangle rect,        // テキストを格納する長方形 (スクリーン座標)
    DrawTextFormat format, // テキストのフォーマット
    Color color            // テキストの色
    );
Font.DrawText メソッド (Sprite, String, Rectangle, DrawTextFormat, Color) (Microsoft.WindowsMobile.DirectX.Direct3D) | MSDN

Direct3D自体のスプライトを使用する場合には、spriteにはnullを指定します。関数が成功した場合には、テキストの高さが返されます。失敗した場合には、0が返されます。

3Dオブジェクトの座標系からスクリーン座標への変換

2Dテキストはスクリーン座標で描画位置を指定する必要があります。よって3Dの座標系上に表示しているオブジェクトの位置に2Dのテキストを重ねるには、3Dの座標系からスクリーン座標を求める必要があります。これにはVector3構造体のProject()メソッドを使用します。(ちなみにXNAでは、このメソッドはViewport構造体のProject()メソッドに相当します)

public static Vector3 Project(
    Vector3 v,         // 3D座標系の位置
    object viewport,   // ビューポート変換行列
    Matrix projection, // 射影変換行列
    Matrix view,       // ビュー変換行列
    Matrix world       // ワールド変換行列
);
Vector3.Project(Vector3,Object,Matrix,Matrix,Matrix) | MSDN

たとえば次のように使用します。

// スクリーン座標での位置を求める
Vector3 textPosition = Vector3.Project(
    targetPosition, // 3Dオブジェクトの座標
    device.Viewport,
    device.Transform.Projection,
    device.Transform.View,
    Matrix.Identity
    );

// 2Dテキストを描画する
font.DrawText(
    null,
    "Text",
    ( int )textPosition.X,
    ( int )textPosition.Y,
    Color.White
    );