ホームへ戻る

 3d.02 カメラを回転してみよう

 前節からの続きです。
先ほどのモデルを360度好きな方向から見られるように十字キーで回転できるようにしてみましょう。

実行結果


今回これを実現するには、ある点を軸に座標を回転させる必要があります。

座標の回転はこちらの説明にある通りの計算式で計算できます。
これを計算できる関数をrotate関数として以下の通り作ってみます。

また、3D座標空間は以下のような軸から成っています。



今回Y軸を基準に回転するので、平面はX-Z平面になります。
それを踏まえて以下のプログラムをご覧ください。


/***** main.cpp *****/

#include <math.h>
#include <DxLib.h>

static const float ROTATE_SPEED = DX_PI_F/90;//回転スピード

// (x,y)の点を(mx,my)を中心にang角回転する
void rotate(float *x, float *y, const float ang, const float mx, const float my){
    const float ox = *x-mx, oy = *y-my;
    *x =  ox * cos(ang) + oy * sin(ang);
    *y = -ox * sin(ang) + oy * cos(ang);
    *x += mx;
    *y += my;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

    float cameraX=0, cameraZ=-20;    //カメラの座標
    const float targetX=0, targetZ=0;//カメラの視線の先ターゲットの座標

    //3Dモデルの読み込み
    int ModelHandle = MV1LoadModel( "dat/Lat式ミク/Lat式ミクVer2.3_Normal.pmd" ) ;

    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;

    while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){

        if( CheckHitKey(KEY_INPUT_LEFT) > 0 ){//左キーが押されていたら
            rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転
        }
        if( CheckHitKey(KEY_INPUT_RIGHT) > 0 ){//右キーが押されていたら
            rotate(&cameraX, &cameraZ, -ROTATE_SPEED, targetX, targetZ);//回転
        }

        //第一引数の視点から第二引数のターゲットを見る角度にカメラを設置
        SetCameraPositionAndTarget_UpVecY( VGet( cameraX, 10, cameraZ ), VGet( targetX, 10.0f, targetZ ) ) ;

        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;

    }

    DxLib_End();
    return 0;
}  


左キー、右キーが押されているとrotate関数をコールし、カメラ位置の座標を表すcameraX,cameraZを更新するようになっています。

→分からないことがあれば掲示板で質問して下さい


- Remical Soft -