トップページ > 過去ログ > 記事閲覧
3Dでカメラを球状に動かしたい
名前:あべたらく 日時: 2012/11/03 01:24

左右キー押下でXZ平面にa rad、 上下キー押下でYZ平面にb rad の位置にカメラを動かしたいのですが、カメラ位置を三角関数のみで求める方法と、回転行列による演算で求める方法と両方やってみたのですが、どちらもY座標が0以外の場合に左右キーを押すとY座標が上下してしまいます。 モデルの中心をカメラが見据えたまま、左右キーを押したらy軸方向に動かずに周りをぐるぐる回ってほしいのです。 つまり例えばy=20の面で球を切り、その縁をカメラが移動するようにしたいのですが、どうすればいいのでしょうか。 三角関数での求め方は途中は省きますが(Rは半径です) m = 1/sqrt(1+sin(a)*sin(a)*tan(b)*tan(b)); VGet(R*m*cos(a), R*m*sin(a)*tan(b), R*m*sin(a)) としました。 行列では VTransform(VTransform(VGet(0, 0, -R), MGetRotY(a)), MGetRotX(b)) だったはずです。軸に対して回転させているのになんだか原点をはさんで点対称の位置に向かって動いてるような気がします。

Page: 1 |

Re: 3Dでカメラを球状に動かしたい ( No.1 )
名前:いっち 日時:2012/11/03 23:13

以下のような感じで良いのでしょうか? //- 以下、テストコード ("SimpleModel.mqo"を使用) -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { const float rot_rate = DX_PI_F * 2.0f / 60.0f; const float move_rate = 5.0f; const float limit_rotx = DX_PI_F / 180.0f * 67.5f; const float max_range = 2000.0f; const float min_range = 800.0f; ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); int mh = MV1LoadModel( "SimpleModel.mqo" ); SetDrawScreen( DX_SCREEN_BACK ); float rotx = 0, roty = 0, range = min_range; while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); if ( CheckHitKey( KEY_INPUT_UP ) ) rotx -= rot_rate; if ( CheckHitKey( KEY_INPUT_DOWN ) ) rotx += rot_rate; if ( CheckHitKey( KEY_INPUT_LEFT ) ) roty += rot_rate; if ( CheckHitKey( KEY_INPUT_RIGHT ) ) roty -= rot_rate; if ( CheckHitKey( KEY_INPUT_Z ) ) range -= move_rate; if ( CheckHitKey( KEY_INPUT_X ) ) range += move_rate; if ( rotx > limit_rotx ) rotx = limit_rotx; if ( rotx < -limit_rotx ) rotx = -limit_rotx; if ( range > max_range ) range = max_range; if ( range < min_range ) range = min_range; VECTOR tempvec = VTransform( VGet( 0, 0, range ), MMult( MGetRotX( rotx ), MGetRotY( roty ) ) ); SetCameraPositionAndTarget_UpVecY( tempvec, VGet( 0, 0, 0 ) ); DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 1000.0f, 0.0f, 0.0f ), GetColor( 255, 0, 0 ) ); DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 1000.0f, 0.0f ), GetColor( 0, 255, 0 ) ); DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 0.0f, 1000.0f ), GetColor( 0, 0, 255 ) ); MV1DrawModel( mh ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 3Dでカメラを球状に動かしたい ( No.2 )
名前:あべたらく 日時:2012/11/04 22:05

まさにこれです!ありがとうございます! MMultを使えばよかったのですかね? バイト先の数学科の先輩からちょっとアドバイスを受けて、先ほどRcosbをXZ平面上での半径として計算しても一応できましたが、ベクトルと行列を使うとグラボに任せるのが容易になるとのことでこちらを使おうと思います。 本当にありがとうございました

Page: 1 |