カメラ関数

宣言int SetCameraNearFar( float Near, float Far ) ;

概略カメラの 手前クリップ距離と 奥クリップ距離を設定する

引数 float Near : 手前( Near )クリップ距離( 0.0f より大きく Farより小さな値 )
float Far : 奥( Far )クリップ距離( Nearより大きな値 )
戻り値 0:成功
 -1:エラー発生

解説  3D空間に何かを描画する際に、カメラからどれだけ離れたところ( Near )から、 どこまで( Far )のものを描画するかを設定します。

 この関数の設定値はかなり重要で、Zバッファの精度にも関わってきますので使用する3D空間の範囲に合わせて適切な値を設定する必要があります。
 例えば人間モデル1つの大きさが 200.0f くらいで大体画面奥方向に 10000.0f くらいまで移動して、 背景は画面奥方向に 15000.0f くらいまで存在して、かつカメラから 100.0f より近くに来たら見えないようにしたい場合は
SetCameraNearFar( 100.0f, 15000.0f ) ;
 とします。

 人間モデル一つの大きさがもっと小さく、1.0f くらいで、背景モデルも画面奥方向に 150.0f くらいまで描画できればよい場合は
SetCameraNearFar( 1.0f, 150.0f ) ;
 とします。

 因みに、Zバッファの仕様の関係で Far の設定値も重要ですが Near の設定値はより重要で、 例えば「なるべくカメラに近くても描画したい」という考えから
SetCameraNearFar( 0.00001f, 15000.0f ) ;
 としてしまったりすると大変です、環境によってはカメラから 100.0f 以上離れると描画されなくなったりします。
 なので、Near の値は不都合が無い範囲でなるべく大きな値を、Far の値は描画したい最奥のモノのより少し大きな値を設定するようにしてください。

<注意>なお、この関数の設定はSetDrawScreenSetGraphModeChangeWindowMode のいずれかを使用したときにリセットされます。

サンプル

  モデルファイル SimpleModel.mqo を画面奥方向に座標をずらして8つ描画して、
 方向キーの上下で Far の値を、左右で Near の値を変更できるサンプルプログラムです。
  クリップ値を変更することで描画される範囲が変わるのが分かります。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, i ; float Near, Far ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // Near Far 値の初期化 Near = 100.0f ; Far = 2000.0f ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 上下のキー入力で Far を操作 if( CheckHitKey( KEY_INPUT_UP ) == 1 ) { Far += 20.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) { Far -= 20.0f ; } // 左右のキーで Near を操作 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { Near -= 20.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { Near += 20.0f ; } // Near の値が 0.0f 以下になっていたら補正 if( Near <= 0.0f ) Near = 10.0f ; // Far の値が Near より小さくなっていたら補正 if( Far <= Near ) Far = Near + 10.0f ; // Near, Far クリップの距離を設定 SetCameraNearFar( Near, Far ) ; // モデルを距離を変えて8個描画 for( i = 0 ; i < 8 ; i ++ ) { // モデルの座標を設定 MV1SetPosition( ModelHandle, VGet( 320.0f, 180.0f, 100.0f + i * 400.0f ) ) ; // モデルの描画 MV1DrawModel( ModelHandle ) ; } // 画面左上に Near の値と Far の値を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Near %f Far %f", Near, Far ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCameraPositionAndTarget_UpVecY( VECTOR Position, VECTOR Target ) ;

概略カメラの視点、注視点を設定する( 上方向はY軸から算出 )

引数 VECTOR Position : カメラの位置
VECTOR Target : カメラの注視点( 見ている座標 )
戻り値 0:成功
 -1:エラー発生

解説  3Dソフトと言えば視点がグリグリ変わります、 この関数はその視点の位置と見ているものを指定する関数です。

 カメラの姿勢は、視点、注視点と、あとカメラの上方向があれば決まりますが、 この関数はカメラの上方向をY軸のプラス方向を基本的なカメラの上方向として姿勢を算出します。

 因みに、DXライブラリでは初期状態では視点の位置が x = 320.0f, y = 240.0f, z = ( 画面のサイズによって変化 )、 注視点の位置は x = 320.0f, y = 240.0f, z = 1.0f、カメラの上方向は x = 0.0f, y = 1.0f, z = 0.0f、 つまり画面のXY平面上の中心に居てZ軸のプラス方向を見るようなカメラになっています。

 引数 Position と引数 Target は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、 この3要素を使用して3次元の座標を指定します。
 引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に座標値を代入して・・・と準備が面倒ですが、 引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。

サンプル

  モデルファイル SimpleModel.mqo を原点に描画した状態で、カメラの位置を方向キーで
 操作できるようにしたサンプルプログラムです。
カメラは常に原点を注視点としていますのでモデルは常に画面中心に表示されますが、
 キー入力によって見える角度が変わります。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; VECTOR CameraPos ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの座標を初期化 CameraPos.x = 0.0f ; CameraPos.y = 0.0f ; CameraPos.z = -800.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 方向キーでカメラの座標を移動 if( CheckHitKey( KEY_INPUT_UP ) == 1 ) { CameraPos.y += 20.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) { CameraPos.y -= 20.0f ; } if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { CameraPos.x -= 20.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { CameraPos.x += 20.0f ; } // カメラの位置と注視点をセット、注視点は原点 SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ; // モデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCameraPositionAndTargetAndUpVec( VECTOR Position, VECTOR Target, VECTOR Up ) ;

概略カメラの視点、注視点、上方向を設定する

引数 VECTOR Position : カメラの位置
VECTOR Target : カメラの注視点( 見ている座標 )
VECTOR Up : カメラの上方向
戻り値 0:成功
 -1:エラー発生

解説  3Dソフトと言えば視点がグリグリ変わります、 この関数はその視点の位置と注視点とカメラの上方向を指定する関数です。 ( カメラの姿勢は、視点、注視点と、カメラの上方向があれば決まります )

 因みに、DXライブラリでは初期状態では視点の位置が x = 320.0f, y = 240.0f, z = ( 画面のサイズによって変化 )、注視点の位置は x = 320.0f, y = 240.0f, z = 1.0f、カメラの上方向は x = 0.0f, y = 1.0f, z = 0.0f、 つまり画面のXY平面上の中心に居てZ軸のプラス方向を見るようなカメラになっています。

 引数 Position と引数 Target は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、 この3要素を使用して3次元の座標を指定します。
 引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に座標値を代入して・・・と準備が面倒ですが、 引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。

サンプル

  モデルファイル SimpleModel.mqo を原点に配置して、左右キーでそのモデルを見ている
 カメラの上の方向を回転できるようにしたサンプルプログラムです。

Windows用
#include "DxLib.h" #include <math.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float Roll ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの視線の回転値を初期化 Roll = 0.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 左右キーでカメラの回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { Roll -= DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { Roll += DX_PI_F / 60.0f ; } // カメラの位置と注視点をセット // 視点はZ軸のマイナス800の位置 // 注視点は原点 // 上方向は Roll の値から算出 SetCameraPositionAndTargetAndUpVec( VGet( 0.0f, 0.0f, -800.0f ), VGet( 0.0f, 0.0f, 0.0f ), VGet( sin( Roll ), cos( Roll ), 0.0f ) ) ; // モデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCameraPositionAndAngle( VECTOR Position, float VRotate, float HRotate, float TRotate ) ;

概略カメラの視点、垂直回転角度、水平回転角度、捻り回転角度を設定する

引数 VECTOR Position : カメラの位置
float VRotate : 垂直回転角度( 単位:ラジアン )
float HRotate : 水平回転角度( 単位:ラジアン )
float TRotate : 捻り回転角度( 単位:ラジアン )
戻り値 0:成功
 -1:エラー発生

解説  3Dソフトと言えば視点がグリグリ変わります、 この関数は視点の位置と垂直回転角度、水平回転角度、捻り回転角度でカメラの位置を向きを設定する関数です。

 例えばカメラが見ている方向を上下( 垂直 )方向に変えたい場合は VRotate の値を変化させて、 左右( 水平 )方向に変えたい場合は HRotate の値を変化させて、 見ている方向に捻りを加えたい場合は TRotate の値を変化させて、といった感じです。

 引数 Position は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、 この3要素を使用して3次元の座標を指定します。
 引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に座標値を代入して・・・と準備が面倒ですが、 引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。

サンプル

カメラの向きを上下左右キーで変えられるようにしたサンプルです。
  回転していることを確認できるようにモデルファイル SimpleModel.mqo をカメラを囲むように
 4個描画しています。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float VRotate, HRotate, TRotate ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの回転値を初期化 VRotate = 0.0f ; HRotate = 0.0f ; TRotate = 0.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 左シフトキーを押しているかどうかで処理を分岐 if( CheckHitKey( KEY_INPUT_LSHIFT ) == 1 ) { // 左右キーでカメラの捻り方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { TRotate -= DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { TRotate += DX_PI_F / 60.0f ; } } else { // 左右キーでカメラの水平方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { HRotate -= DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { HRotate += DX_PI_F / 60.0f ; } } // 上下キーでカメラの垂直方向回転値を変更 if( CheckHitKey( KEY_INPUT_UP ) == 1 ) { VRotate += DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) { VRotate -= DX_PI_F / 60.0f ; } // カメラの位置と回転値をセット、カメラの位置は原点 SetCameraPositionAndAngle( VGet( 0.0f, 0.0f, 0.0f ), VRotate, HRotate, TRotate ) ; // モデルをカメラを囲むように4個描画 MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 800.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, -800.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 800.0f, 0.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( -800.0f, 0.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCameraViewMatrix( MATRIX ViewMatrix ) ;

概略ビュー行列を直接設定する

引数 MATRIX ViewMatrix : ビュー行列
戻り値 0:成功
 -1:エラー発生

解説  SetCameraPositionAndTarget_UpVecY などの関数を使用せずに直接ビュー行列を設定したいときに使用する関数です。

 SetCameraPositionAndTarget_UpVecY などの関数を使用する場合は使用しません。

サンプル

カメラの向きを左右キーで変えられるようにしたサンプルです。
  回転していることを確認できるようにモデルファイル SimpleModel.mqo をカメラを囲むように
 4個描画しています。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float Rotate ; MATRIX Matrix ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの回転値を初期化 Rotate = 0.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 左右キーでカメラの回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { Rotate -= DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { Rotate += DX_PI_F / 60.0f ; } // 回転値を使用してY軸の回転行列を作成 Matrix = MGetRotY( Rotate ) ; // 回転行列をビュー行列としてセット SetCameraViewMatrix( Matrix ) ; // モデルをカメラを囲むように4個描画 MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 800.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, -800.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 800.0f, 0.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( -800.0f, 0.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetupCamera_Perspective( float Fov ) ;

概略遠近法カメラをセットアップする

引数 float Fov : 視野角( 単位:ラジアン )
戻り値 0:成功
 -1:エラー発生

解説  カメラを遠近法を使用したものにします。
 遠近法を使用したカメラはカメラから遠い物ほど小さく見えるので、 現実での立体空間の見え方に一番近い表示法です。( DXライブラリの初期設定は遠近法です )

 引数の Fov は視野角で値が大きければ大きいほど視野が広くなります、初期設定では 60度( ラジアンでは約 1.0472 )です。

 尚、この関数と SetupCamera_OrthoSetupCamera_ProjectionMatrix はそれぞれ排他関係にありますので注意してください。

サンプル

カメラの視野角を左右キーで変えられるようにしたサンプルです。
  視野角が変化していることを確認できるようにモデルファイル SimpleModel.mqo をカメラの前方に
 3個描画しています。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float Fov ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 視野角を初期化 Fov = 60.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 左右キーで視野角の値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { Fov -= 2.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { Fov += 2.0f ; } // 視野角が 8.0f 以下になったら補正 if( Fov < 8.0f ) Fov = 8.0f ; // 視野角が 170.0f 以上になったら補正 if( Fov > 170.0f ) Fov = 170.0f ; // 遠近法のセットアップ( ラジアン値に変換しています ) SetupCamera_Perspective( Fov * DX_PI_F / 180.0f ) ; // カメラの前方にモデルを3個描画 MV1SetPosition( ModelHandle, VGet( -1400.0f + 320.0f, 240.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 0.0f + 320.0f, 240.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 1400.0f + 320.0f, 240.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetupCamera_Ortho( float Size ) ;

概略正射影カメラをセットアップする

引数 float Size : 画面垂直方向の表示範囲
戻り値 0:成功
 -1:エラー発生

解説  カメラを正射影法を使用したものにします。
 正射影を使用したカメラはカメラから遠い物ものでも近いものでも同じ大きさに見えます、 現実での立体空間の見え方は遠くの物ほど小さく見えるので、 少し不思議な見え方になります。

 引数の Size は画面の下端から上端の間に表示される空間の範囲です、 値が大きければ大きいほど沢山の範囲が画面内に映ります。

 尚、この関数と SetupCamera_PerspectiveSetupCamera_ProjectionMatrix はそれぞれ排他関係にありますので注意してください。

サンプル

表示方式を正射影に変えてからカメラの前方に奥行き値の違うモデルを3つ描画します。
  正射影なので奥行き的に何処に位置していても同じ大きさで描画されます。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // カメラを正射影に変更 SetupCamera_Ortho( 2000.0f ) ; // カメラの前方に奥行き座標の違うモデルを3個描画 MV1SetPosition( ModelHandle, VGet( -700.0f + 320.0f, 240.0f, 0.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 0.0f + 320.0f, 240.0f, 500.0f ) ) ; MV1DrawModel( ModelHandle ) ; MV1SetPosition( ModelHandle, VGet( 700.0f + 320.0f, 240.0f, 1000.0f ) ) ; MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetupCamera_ProjectionMatrix( MATRIX ProjectionMatrix ) ;

概略射影行列を設定する

引数 MATRIX ProjectionMatrix : 射影行列
戻り値 0:成功
 -1:エラー発生

解説  射影行列を直接設定する場合に使用します。
 SetupCamera_PerspectiveSetupCamera_Ortho を使用する場合は使いません。

サンプル

ありません



宣言int SetCameraDotAspect( float DotAspect ) ;

概略カメラのドットアスペクトを設定する

引数 float DotAspect : ドットアスペクト比( 横 / 縦 )
戻り値 0:成功
 -1:エラー発生

解説  3D描画を使用した際に画面に描画される映像の縦横比を設定します。
 値は 横 / 縦 で指定して、値が 1.0f 以上なら見え方が横長に、 0.0f 以上 1.0f 以下なら縦長になります。

 特殊な演出をしたい場合以外は恐らく使用しない関数です。

サンプル

ドットアスペクト比の設定を縦2倍にしてからモデルを描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // モデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // ドット比を縦に2倍に変更 SetCameraDotAspect( 0.5f ) ; // モデルをカメラの映る位置に移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ; // モデルを描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR ConvWorldPosToScreenPos( VECTOR WorldPos ) ;

概略ワールド座標をスクリーン座標に変換する

引数 VECTOR WorldPos : ワールド( 3D )座標
戻り値スクリーン座標

解説  引数 WorldPos で渡すワールド( 3D )座標をスクリーン座標に変換します。
 3D空間上に存在する物が画面上のどの座標に位置するのかを取得したい場合に使用します。

 尚、指定のワールド座標とカメラの視線方向との距離が SetCameraNearFar で設定した範囲から外れていた場合は戻り値のZが 0.0f以下又は1.0f以上になり、その際のX、Yはスクリーン座標とは無関係の値となります。( なので戻り値のZが 0.0f 以下若しくは 1.0f 以上の場合はX,Yの値は無効だと判断してください )

サンプル

DxChara.x の0番目のモーションを再生しながら、フレーム番号26の座標に2Dの四角形を描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex ; float TotalTime, PlayTime ; VECTOR ScreenPos ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 100.0f ; // 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す if( PlayTime >= TotalTime ) { PlayTime = 0.0f ; } // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // ナンバー26のフレームの画面上での座標を取得する ScreenPos = ConvWorldPosToScreenPos( MV1GetFramePosition( ModelHandle, 26 ) ) ; // 取得したスクリーン座標に四角形を描画 DrawBox( ScreenPos.x - 2, ScreenPos.y - 2, ScreenPos.x + 2, ScreenPos.y + 2, GetColor( 255,0,0 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言VECTOR ConvScreenPosToWorldPos( VECTOR ScreenPos ) ;

概略スクリーン座標をワールド座標に変換する

引数 VECTOR ScreenPos : スクリーン座標
戻り値ワールド座標

解説  引数 ScreenPos で渡すスクリーン座標をワールド座標に変換します。
 マウスでクリックした座標に存在する3D空間上のオブジェクトを検出したりする処理に使用します。

 尚、スクリーン座標には奥行きの情報がありませんので、画面上からどれだけ奥まった3D空間上の座標を取得するのかのを ScreenPos のメンバ変数 z で指定します。 ただ、この z はワールド空間上での距離ではなく、指定できる値の範囲は 0.0f から 1.0f です。
 z が 0.0f の場合は SetCameraNearFar 関数で設定した Near と同じだけカメラ座標から離れた位置、1.0f の場合は Far と同じだけカメラ座標から離れた位置のワールド座標が返ってきます。

サンプル

  画面上に表示されているモデルファイル SimpleModel.mqo のポリゴンとマウスポインタの位置から
 画面奥へ伸びる線分とで当たり判定を行い、線分に接触したポリゴンを黄色で描画します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; VECTOR StartPos, EndPos ; MV1_COLL_RESULT_POLY HitPoly ; int Mx, My ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // マウスカーソルを表示 SetMouseDispFlag( TRUE ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 3Dモデルを見える位置に移動する MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // モデル全体のコリジョン情報を構築 MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // マウスの座標を取得 GetMousePoint( &Mx, &My ) ; // マウスポインタがある画面上の座標に該当する3D空間上の Near 面の座標を取得 StartPos = ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) ; // マウスポインタがある画面上の座標に該当する3D空間上の Far 面の座標を取得 EndPos = ConvScreenPosToWorldPos( VGet( Mx, My, 1.0f ) ) ; // モデルと線分との当たり判定 HitPoly = MV1CollCheck_Line( ModelHandle, -1, StartPos, EndPos ) ; // 当たったかどうかで処理を分岐 if( HitPoly.HitFlag == 1 ) { // 当たった場合は衝突の情報を描画する // 当たったポリゴンを黄色で描画する DrawTriangle3D( HitPoly.Position[ 0 ], HitPoly.Position[ 1 ], HitPoly.Position[ 2 ], GetColor( 255,255,0 ), TRUE ) ; // 交差した座標を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Pos %f %f %f", HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ; // 当たったポリゴンが含まれるフレームの番号を描画 DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Frame %d", HitPoly.FrameIndex ) ; // 当たったポリゴンが使用しているマテリアルの番号を描画 DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Material %d", HitPoly.MaterialIndex ) ; // 当たったポリゴンを形成する三頂点の座標を描画 DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Position %f %f %f", HitPoly.Position[ 0 ].x, HitPoly.Position[ 0 ].y, HitPoly.Position[ 0 ].z ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), " %f %f %f", HitPoly.Position[ 1 ].x, HitPoly.Position[ 1 ].y, HitPoly.Position[ 1 ].z ) ; DrawFormatString( 0, 80, GetColor( 255,255,255 ), " %f %f %f", HitPoly.Position[ 2 ].x, HitPoly.Position[ 2 ].y, HitPoly.Position[ 2 ].z ) ; // 当たったポリゴンの法線を描画 DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Normal %f %f %f", HitPoly.Normal.x, HitPoly.Normal.y, HitPoly.Normal.z ) ; } else { // 当たらなかった場合は衝突しなかった旨だけ描画する DrawString( 0, 0, "NO HIT", GetColor( 255,255,255 ) ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCameraScreenCenter( float x, float y ) ;

概略画面上でのカメラが見ている映像の中心座標を設定する

引数 float x : 3D空間の消失点となるスクリーンX座標
float y : 3D空間の消失点となるスクリーンY座標
戻り値 0:成功
 -1:エラー発生

解説  画面上でのカメラが見ている映像の中心座標( 消失点 )を引数で渡されるスクリーン座標にする関数です。
 主な用途は1プレイヤー用と2プレイヤー用で画面を上下に分けたいときや、画面の一部を3D表現したい場合などです。 ( 消失点は初期状態では常に画面の中心なので、消失点を変更しないまま画面を上下や左右に分けようとすると大変です )

 尚、この関数の設定は SetDrawAreaChangeWindowModeSetDrawScreen の何れかを使用するとリセットされますので注意してください。

サンプル

カメラの消失点を画面右側に変更してから立方体を描画します。

Windows用
#include "DxLib.h" #define X1 100.0f #define X2 540.0f #define Y1 100.0f #define Y2 380.0f #define Z1 0.0f #define Z2 1000.0f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { unsigned int Color ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの注視点の画面上の位置を右寄りにする SetCameraScreenCenter( 480.0f, 240.0f ) ; // 直方体を描画する Color = GetColor( 255,255,255 ) ; DrawLine3D( VGet( X1, Y1, Z1 ), VGet( X2, Y1, Z1 ), Color ) ; DrawLine3D( VGet( X2, Y1, Z1 ), VGet( X2, Y2, Z1 ), Color ) ; DrawLine3D( VGet( X2, Y2, Z1 ), VGet( X1, Y2, Z1 ), Color ) ; DrawLine3D( VGet( X1, Y2, Z1 ), VGet( X1, Y1, Z1 ), Color ) ; DrawLine3D( VGet( X1, Y1, Z2 ), VGet( X2, Y1, Z2 ), Color ) ; DrawLine3D( VGet( X2, Y1, Z2 ), VGet( X2, Y2, Z2 ), Color ) ; DrawLine3D( VGet( X2, Y2, Z2 ), VGet( X1, Y2, Z2 ), Color ) ; DrawLine3D( VGet( X1, Y2, Z2 ), VGet( X1, Y1, Z2 ), Color ) ; DrawLine3D( VGet( X1, Y1, Z1 ), VGet( X1, Y1, Z2 ), Color ) ; DrawLine3D( VGet( X2, Y1, Z1 ), VGet( X2, Y1, Z2 ), Color ) ; DrawLine3D( VGet( X2, Y2, Z1 ), VGet( X2, Y2, Z2 ), Color ) ; DrawLine3D( VGet( X1, Y2, Z1 ), VGet( X1, Y2, Z2 ), Color ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int CheckCameraViewClip( VECTOR CheckPos ) ;

概略指定の座標がカメラの視界に入っていないかどうかを判定する

引数 VECTOR CheckPos : 視界に入っていないかどうかをチェックするワールド座標
戻り値 TRUE:視界に入っていない
 FALSE:視界に入っている

解説  指定のワールド座標が視界に入っていないかどうかをチェックする関数です。
 3Dの描画処理は処理負荷が高いので、この関数で視界に入っていない( 画面内に映っていない )場合は描画処理を行わない、などの処理をする際に使用します。
サンプル

3D空間内を左右に飛び回る点がカメラに入っているかどうかを画面左上に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Position ; float XAdd ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 飛び回る点の座標を初期化 Position = VGet( 320, 240, 0.0f ) ; // 飛び回る点のX軸の移動速度をセット XAdd = 8.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面を初期化 ClearDrawScreen() ; // 点の座標を更新 Position.x += XAdd ; // もし画面内から大きく外れたら方向を反転する if( Position.x < -100.0f || Position.x > 740.0f ) { XAdd = -XAdd ; } // 画面内に座標が入っていないかどうかを描画する if( CheckCameraViewClip( Position ) == TRUE ) { DrawString( 0, 0, "Screen Out:Yes", GetColor( 255,255,255 ) ) ; } else { DrawString( 0, 0, "Screen Out:No", GetColor( 255,255,255 ) ) ; } // 点を描画する DrawPixel3D( Position, GetColor( 255,255,255 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int CheckCameraViewClip_Box( VECTOR BoxPos1, VECTOR BoxPos2 ) ;

概略二つの座標で表されるボックスがカメラの視界に入っていないかどうかを判定する

引数 VECTOR BoxPos1 : ボックスを表すワールド座標1
VECTOR BoxPos2 : ボックスを表すワールド座標2
戻り値 TRUE:視界に入っていない
 FALSE:視界に入っている

解説  二つの座標で表されるボックスが視界に入っていないかどうかをチェックする関数です。
 3Dの描画処理は処理負荷が高いので、この関数で視界に入っていない( 画面内に映っていない )場合は描画処理を行わない、などの処理をする際に使用します。
サンプル

3D空間内を左右に飛び回るボックスがカメラに入っているかどうかを画面左上に表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Position ; VECTOR BoxPos1, BoxPos2 ; float XAdd ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // Zバッファを使用する SetUseZBuffer3D( TRUE ) ; // Zバッファへの書き込みを行う SetWriteZBuffer3D( TRUE ) ; // 飛び回るボックスの座標を初期化 Position = VGet( 320, 240, 0.0f ) ; // 飛び回るボックスのX軸の移動速度をセット XAdd = 8.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面を初期化 ClearDrawScreen() ; // ボックスの座標を更新 Position.x += XAdd ; // もし画面内から大きく外れたら方向を反転する if( Position.x < -200.0f || Position.x > 840.0f ) { XAdd = -XAdd ; } // ボックスを現す2点の座標を準備 BoxPos1 = VSub( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ; BoxPos2 = VAdd( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ; // 画面内にボックスが入っていないかどうかを描画する if( CheckCameraViewClip_Box( BoxPos1, BoxPos2 ) == TRUE ) { DrawString( 0, 0, "Screen Out:Yes", GetColor( 255,255,255 ) ) ; } else { DrawString( 0, 0, "Screen Out:No", GetColor( 255,255,255 ) ) ; } // ボックスを描画する DrawCube3D( BoxPos1, BoxPos2, GetColor( 255,255,255 ), GetColor( 0,0,0 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MATRIX GetCameraViewMatrix( void ) ;

概略カメラのビュー行列を取得する

引数 なし
戻り値 ビュー行列
  

解説  カメラの設定で作られるビュー行列を取得します。

 3D描画の計算では座標はまず3D世界のどこに居るのかを示す「ワールド座標」からカメラからの相対位置である「ビュー座標」に変換して、 そこから座標のスケールが一定で画面の奥行き表現も考慮した「射影座標」に変換され、 さらに具体的にスクリーン上の左から何ピクセル、上から何ピクセルかを示した「スクリーン座標」に変換されてからやっと描画されます。

 この各座標間の変換には主に行列が使用されます。
 この関数はカメラが担当する「ワールド座標」から「ビュー座標」に変換するための行列「ビュー行列」を取得するための関数です。
 頂点シェーダーを使用して自前で「ワールド座標」から「射影座標」まで変換する際に必要になるので、そのときに使用します。

サンプル

  ありません



宣言MATRIX GetCameraProjectionMatrix( void ) ;

概略カメラの射影行列を取得する

引数 なし
戻り値 射影行列
  

解説  カメラの設定で作られる射影行列を取得します。

 3D描画の計算では座標はまず3D世界のどこに居るのかを示す「ワールド座標」からカメラからの相対位置である「ビュー座標」に変換して、 そこから座標のスケールが一定で画面の奥行き表現も考慮した「射影座標」に変換され、 さらに具体的にスクリーン上の左から何ピクセル、上から何ピクセルかを示した「スクリーン座標」に変換されてからやっと描画されます。

 この各座標間の変換には主に行列が使用されます。
 この関数はカメラが担当する「ワールド座標」から「ビュー座標」に変換した次の変換で得られる「射影座標」にするための行列「射影行列」を取得するための関数です。
 頂点シェーダーを使用して自前で「ワールド座標」から「射影座標」まで変換する際に必要になるので、その際に使用します。

サンプル

ありません








戻る