サンプル

投影法

投影法 - MascotCapsule eruption

ここでは投影法について解説します。




※ 開発環境によってダウンロードするサンプルデータが異なります。

目次




画面を描画する際に使用する投影法として、透視投影と平行投影の 2 種類が用意されています。使用する投影法の切り替えは mceCamera クラスの関数で行います。


1. 透視投影

透視投影は描画するオブジェクトとカメラ間の距離を元に、オブジェクトの描画サイズに補正を加える投影法です。透視投影を用いると、カメラから近くにあるものは大きく、遠くにあるものは小さく描画され、遠近感のある描画結果になります。
投影法を透視投影に設定するには、mceCamera_setPerspectiveFov( This, aspect, angle, z_near, z_far ) を使用します。

#define ANGLE        (360)         /* 角度 */

typedef struct tagWork
{
    (中略)

    mceCamera *Camera;             /* Camera */

    hi_coord AspectRate;           /* アスペクト比   */
    hi_coord ViewAngle;            /* 視野角         */
    hi_coord NearClip;             /* ニアクリップ   */
    hi_coord FarClip;              /* ファークリップ */

    (中略)
} WORK;
work->AspectRate = MCE_DIV ((hi_coord)work->WindowWidth,
                            (hi_coord)work->WindowHeight);
work->ViewAngle  = MCE_F2C ( 45.0f);
work->NearClip   = MCE_F2C (  0.1f);
work->FarClip    = MCE_F2C (100.0f);

    (中略)

hi_exception exception;

    (中略)

/* 透視投影の設定 */
exception = mceCamera_setPerspectiveFov (work->Camera,
                                         work->AspectRate,
                                         work->ViewAngle / ANGLE,
                                         work->NearClip, work->FarClip);
if (exception != hi_NoException)
{
    return 1;
}

この方法以外に、mceCamera_setFrustum( This, left, right, bottom, top, z_near, z_far ) や mceCamera_setPerspectiveFov_op( This, aspect, angle, z_near, z_far, opcx, opcy ) を使用して透視投影を設定することもできます。



2. 平行投影

平行投影は描画するオブジェクトとカメラ間の距離によるサイズの補正を行わず、オブジェクトをそのままのサイズで描画する投影法です。
投影法を平行投影に設定するには、mceCamera_setParallel( This, width, height, z_near, z_far ) を使用します。

work->NearClip = MCE_F2C (  0.1f);
work->FarClip  = MCE_F2C (100.0f);

    (中略)

hi_exception exception;

    (中略)

hi_coord diff;

    (中略)

/* diffはサイズ補正に使用 */
diff = MCE_F2C (22.0f);
/* 平行投影の設定 */
exception = mceCamera_setParallel (work->Camera,
            (hi_sint32)(MCE_DIV ((hi_coord)work->WindowWidth, diff)),
            (hi_sint32)(MCE_DIV ((hi_coord)work->WindowHeight, diff)),
            work->NearClip, work->FarClip);
if (exception != hi_NoException)
{
    return 1;
}

描画結果 透視投影 描画結果 平行投影
透視投影 平行投影
描画結果


このページの先頭へ戻る