テキスト (text)

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

作成

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

描画

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

public void DrawSubset(
    int attributeID
);

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

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

作成

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

描画

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

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

DrawTextFormat 列挙体 (WindowsMobile.DirectX.Direct3D) - MSDN

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 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
    );