トップページ > 過去ログ > 記事閲覧
マウスでカメラの回転
名前:baru 日時: 2012/04/07 14:00

下に書いてあるプログラムを実行したところ マウスで視点を回転させようとしたんですが その仕方がわかりません 下に書いてあるプログラムのどこを改良すれば いいでしょうか? また回転の仕方は球からカメラが一定の距離をはなれていて カメラが球の周りを注視点が球のまま回転するというものです #include "DxLib.h" #include <Math.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } int Rc=0,Jump=0,Jc=0;//Rcループカウンター,Jumpジャンプフラッグ,Jcジャンプカウンター // Zバッファを有効にする SetUseZBuffer3D( TRUE ) ; // Zバッファへの書き込みを有効にする SetWriteZBuffer3D( TRUE ) ; float MYX=320,MYY=240,MYZ=0; float Range, Atten0, Atten1, Atten2 ; int FrameNo=0; int i; int j; Range = 2000.0f ; Atten0 = 0.0f ; Atten1 = 0.0006f ; Atten2 = 0.0f ; int MouseX=0,MouseY=0; int KakudoX=0; int KakudoY=0; // ライトのアンビエントカラーを赤色に変更 SetLightAmbColor( GetColorF( 0.4f, 0.0f, 0.0f, 0.0f ) ) ; MATERIALPARAM MatParam ; MatParam.Diffuse = GetColorF( 1.0f, 1.0f, 1.0f, 1.0f ) ; // ディフューズカラーは白 MatParam.Ambient = GetColorF( 1.0f, 1.0f, 1.0f, 1.0f ) ; // アンビエントカラーは白( ライトのアンビエントカラーをそのまま反映する ) MatParam.Specular = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ; // スペキュラカラーは無し MatParam.Emissive = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ; // エミッシブカラー( 自己発光 )もなし MatParam.Power = 0.0f ; // スペキュラはないので0 // マテリアルのパラメータをセット SetMaterialParam( MatParam ) ; ChangeLightTypePoint( VGet( 320.0f, 1000.0f, 200.0f ), Range, Atten0, Atten1, Atten2 ) ; float CameraX,CameraY,CameraZ; // カメラの座標を初期化 CameraX = 0.0f ; CameraY = 0.0f ; CameraZ = -800.0f ; while(1){ if(CheckHitKey(KEY_INPUT_LEFT)==1)MYX-=8; if(CheckHitKey(KEY_INPUT_RIGHT)==1)MYX+=8; if(CheckHitKey(KEY_INPUT_UP)==1)MYZ+=8; if(CheckHitKey(KEY_INPUT_DOWN)==1)MYZ-=8; if(CheckHitKey(KEY_INPUT_SPACE)==1){ if(Jump==0){Jump++; Jc=Rc; }} if(Jc+20>=Rc){ if(Jump==1){ MYY+=3;}} else{ if(Jump==1){ Jump++; } } if(Jump==2){ MYY--; if(MYY<240){ Jump-=2; } } if(MYY>240)MYY--; for(i=0;i<100;i++){ // 3D空間上に円錐を描画 DrawCone3D( VGet( 320.0f, -100.0f,i*800.0f ), VGet( 320.0f, 160.0f, i*800.0f ), 400.0f, 16, GetColor( 0,0,255 ), GetColor( 255,255,255 ), TRUE ) ; } //マウスカーソルの初期化 SetMousePoint( 320 , 240 ) ; //マウスが動いた後の場所 GetMousePoint( &MouseX , &MouseY ) ; CameraX=CameraX-MouseX+320; //カメラの視点をマウスが動いた数だけ移動させようとしている(ここがわからない) SetCameraPositionAndTarget_UpVecY( VGet(CameraX+320,360,MYZ-480), VGet( MYX, MYY, MYZ ) ) ; //マウスの値の初期化 MouseX=320; MouseY=240; // 3D空間上に球を描画する DrawSphere3D( VGet( MYX, MYY, MYZ ), 80.0f, 32, GetColor( 10,24,231 ), GetColor( 100, 40, 100 ), TRUE ); // Windows システムからくる情報を処理する if( ProcessMessage() == -1 ) break ; // ESCキーが押されたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ; WaitTimer(20); ClearDrawScreen(); Rc++; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Page: 1 |

Re: マウスでカメラの回転 ( No.1 )
名前:いっち 日時:2012/04/07 15:08

私が以前書いたコードですが参考にはなるかと思います。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2145
Re: マウスでカメラの回転 ( No.2 )
名前:baru 日時:2012/04/07 21:01

いっちさんが以前かいたコードをみたんですが 意味がわからなかったので詳しくおしえてくれませんか?
Re: マウスでカメラの回転 ( No.3 )
名前:獅子 日時:2012/04/07 23:08

横からですみませんがbaruさん、どこがわからないのか具体的に書かないといっちさんがご返答に困ってしまいますよ
Re: マウスでカメラの回転 ( No.4 )
名前:いっち 日時:2012/04/07 23:37

獅子さんも仰っていますが、どの辺りがご不明なのでしょうか?
Re: マウスでカメラの回転 ( No.5 )
名前:baru 日時:2012/04/08 09:31

MinV,MaxV,MinH,MaxH,MinR,MaxRの意味がわかりません そしてどうやってカメラが移したい物体の周りをまわっているかです またどうにかして自分のプログラムといっちさんがつくったプログラムを合わせようとしたんですが できなかったんです
Re: マウスでカメラの回転 ( No.6 )
名前:いっち 日時:2012/04/08 19:09

コードを完全に理解するためには、ラジアン、三角関数、回転行列といった要素に対する若干の知識が必要です。 これらに関しては専門に解説するサイトや書籍がありますのでそちらをご覧下さい。 また、以下のURLに2D上での座標の回転のサンプルがありますのでこちらも参考になると思います。 > ttp://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N28 > MinV,MaxV,MinH,MaxH,MinR,MaxRの意味がわかりません これらの定数はすべて CamV、CamH、CamR が意図する範囲内の値しか取らないようにするために使用しています。 それぞれの"意図する範囲"は以下の通りです。 CamV・・・カメラの座標をX軸を原点にYZ平面で回転(つまり縦方向)する角度。 範囲は度数で言うと-72.5度〜72.5度に限定しています。 何故こんなに半端な値なのかは忘れてしまいましたが、SetCameraPositionAndTarget_UpVecY を使用する場合、 カメラの位置がY軸に近づき過ぎる(-90度、90度付近)とカメラの上方向が不安定になるので制限しています。 CamH・・・カメラの座標をY軸を原点にXZ平面で回転(つまり横方向)する角度。 範囲は一応 0度〜360度になるように調整していますが、CamVほどの必要性はありません。 横方向に回転させ続けて無限に小さく(大きく)しても実質的に問題が出ることはほとんど無いですが、 理論的には浮動小数点の精度に問題が出てくる可能性があるので調整しています。 CamR・・・視点からの距離です。この距離を半径とした球面上をカメラは移動します。 範囲は 200〜2000 に限定していますが、最小最大ともに特に意図のある値ではありません。 最小値は「小さすぎるとカメラがモデルの中に埋まってしまいそうなのでこの程度にしておこうかな」ぐらいの意識です。 > そしてどうやってカメラが移したい物体の周りをまわっているかです カメラは視点(0,0,0)を中心とする半径 CamR の球面上を移動します。 実際にカメラの位置座標を決定しているのは以下の部分です。 > RotV = MGetRotX( CamV ); ・・・X軸を中心に座標を回転する行列を取得 > RotH = MGetRotY( CamH ); ・・・Y軸を中心に座標を回転する行列を取得 > CamPos = VTransform( VTransform( VGet( 0.0f, 0.0f, -CamR ), RotV ), RotH ); 最後の行を分解するとまず VGet( 0.0f, 0.0f, -CamR ) でカメラの回転させる前の初期位置を決定します。 つぎに VTransform( 初期位置座標, RotV ) で座標を縦方向に移動させます。 最後に VTransform( 縦方向移動済み座標, RotH ); で横方向に移動させます。 初期位置の座標と回転させる軸、回転させる順番は非常に重要でこれらの兼ね合いがおかしいと意図通りに動作しません。 たとえば初期位置座標を VGet( -CamR, 0.0f, 0.0f ) のようにするとカメラが縦方向に移動しなくなります。 これはX軸上に存在する座標をX軸を中心に回転しても影響が無いためです。 補足として DrawLine3D と MV1DrawModel の描画結果の順序が若干おかしいのは以下のコードを追加することで解決します。 > SetUseZBuffer3D( TRUE ); > SetWriteZBuffer3D( TRUE ); 説明の拙さは理解していますので、不明な点があれば遠慮なく仰ってください。
Re: マウスでカメラの回転 ( No.7 )
名前:baru 日時:2012/04/08 20:28

原点以外の点の周りをカメラを回らせるときはどうすればいいんですか? リファレンスページに指定の軸を回転させる関数があったんですが、 その関数をつかってどうやって指定のじくを回転させるかがわからなくてその関数の名前はMGetRotAxisです
Re: マウスでカメラの回転 ( No.8 )
名前:baru 日時:2012/04/08 21:31

#include "DxLib.h" #include <Math.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } int Rc=0,Jump=0,Jc=0;//Rcループカウンター,Jumpジャンプフラッグ,Jcジャンプカウンター // Zバッファを有効にする SetUseZBuffer3D( TRUE ) ; // Zバッファへの書き込みを有効にする SetWriteZBuffer3D( TRUE ) ; float MYX=320,MYY=240,MYZ=0; float Range, Atten0, Atten1, Atten2 ; int KabeModel=MV1LoadModel( "Kabe.mqo" ) ; int GrHandle=LoadGraph("KabeTex.bmp"); int FrameNo=0; int i; int j; Range = 2000.0f ; Atten0 = 0.0f ; Atten1 = 0.0006f ; Atten2 = 0.0f ; int MouseX=0,MouseY=0; int KakudoX=0; int KakudoY=0; // ライトのアンビエントカラーを赤色に変更 SetLightAmbColor( GetColorF( 0.4f, 0.0f, 0.0f, 0.0f ) ) ; MATERIALPARAM MatParam ; MatParam.Diffuse = GetColorF( 1.0f, 1.0f, 1.0f, 1.0f ) ; // ディフューズカラーは白 MatParam.Ambient = GetColorF( 1.0f, 1.0f, 1.0f, 1.0f ) ; // アンビエントカラーは白( ライトのアンビエントカラーをそのまま反映する ) MatParam.Specular = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ; // スペキュラカラーは無し MatParam.Emissive = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ; // エミッシブカラー( 自己発光 )もなし MatParam.Power = 0.0f ; // スペキュラはないので0 // マテリアルのパラメータをセット SetMaterialParam( MatParam ) ; ChangeLightTypePoint( VGet( 320.0f, 1000.0f, 200.0f ), Range, Atten0, Atten1, Atten2 ) ; float CameraX,CameraY,CameraZ; // カメラの座標を初期化 CameraX = 0.0f ; CameraY = 0.0f ; CameraZ = -800.0f ; int CameraPos; while(1){ if(CheckHitKey(KEY_INPUT_LEFT)==1)MYX-=8; if(CheckHitKey(KEY_INPUT_RIGHT)==1)MYX+=8; if(CheckHitKey(KEY_INPUT_UP)==1)MYZ+=8; if(CheckHitKey(KEY_INPUT_DOWN)==1)MYZ-=8; if(CheckHitKey(KEY_INPUT_SPACE)==1){ if(Jump==0){Jump++; Jc=Rc; }} if(Jc+20>=Rc){ if(Jump==1){ MYY+=3;}} else{ if(Jump==1){ Jump++; } } if(Jump==2){ MYY--; if(MYY<240){ Jump-=2; } } if(MYY>240)MYY--; // 3D空間上に画像を描画 DrawBillboard3D( VGet( 320.0f, 160.0f, 100.0f ), 0.5f, 0.5f, 120.0f, 0.0f, GrHandle, TRUE ) ; for(i=0;i<100;i++){ // 3D空間上に円錐を描画 DrawCone3D( VGet( 320.0f, -100.0f,i*800.0f ), VGet( 320.0f, 160.0f, i*800.0f ), 400.0f, 16, GetColor( 0,0,255 ), GetColor( 255,255,255 ), TRUE ) ; } //マウスカーソルの初期化 SetMousePoint( 320 , 240 ) ; //マウスが動いた後の場所 GetMousePoint( &MouseX , &MouseY ) ; KakudoY=MGetRotY(MouseX-320); KakudoX=MGetRotZ(MouseY-240); CameraPos = VAdd(VTransform(VTransform(VGet(200.0f,0.0f,0.0f),KakudoX),KakudoY),VGet(MYX,MYY,MYZ)); //カメラをマウスが動いた数だけ移動させようとしている SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( MYX, MYY, MYZ ) ) ; //マウスの値の初期化 MouseX=320; MouseY=240; // 3D空間上に球を描画する DrawSphere3D( VGet( MYX, MYY, MYZ ), 80.0f, 32, GetColor( 10,24,231 ), GetColor( 100, 40, 100 ), TRUE ); // Windows システムからくる情報を処理する if( ProcessMessage() == -1 ) break ; // ESCキーが押されたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ; WaitTimer(20); ClearDrawScreen(); Rc++; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 3Dアクション基本+プレイヤー以外のキャラクター を見て改良しましたが意味が分からないプログラムになってしまいました さらにどのように改良すればいいでしょうか?
Re: マウスでカメラの回転 ( No.9 )
名前:baru(解決) 日時:2012/04/09 19:29

カメラの角度を変えて色々な方向見るという かたちにしたらできました。 みなさんありがとうございます

Page: 1 |