トップページ > 過去ログ > 記事閲覧
指定した座標を中心に回転
名前:ぎる 日時: 2010/07/23 18:55

指定した座標を中心に3Dモデルやフレームを 回転させるにはどうすればいいのでしょうか?

Page: 1 |

Re: 指定した座標を中心に回転 ( No.1 )
名前:いっち 日時:2010/07/24 01:51

用途によってやり方は色々とあると思うので、質問を具体的にすると回答を頂きやすいのではないかと思います。 おそらく MGetRot 系の関数で回転行列を得て VTransform で座標を計算するのが基本だと思います。 ※追記 書き忘れましたが、座標の回転は常に原点中心にみたてて計算する必要があります(たぶん)。 //- 以下、サンプル -// #include "DxLib.h" const VECTOR REVOLVE_AXIS_G = { 0.0f, 1.0f, 0.0f }; const VECTOR REVOLVE_AXIS_B = { 1.0f, 0.0f, 0.0f }; const float REVOLVE_RATE_G = TWO_PHI_F / 360.0f; const float REVOLVE_RATE_B = TWO_PHI_F / 360.0f * 4.0f; const VECTOR LOCAL_POS_R = { 0.0f, 0.0f, 0.0f }; const VECTOR LOCAL_POS_G = { 300.0f, 0.0f, 0.0f }; const VECTOR LOCAL_POS_B = { 0.0f, 50.0f, 0.0f }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int StrColor = GetColor( 255, 255, 255 ); SetUseZBuffer3D( TRUE ); SetWriteZBuffer3D( TRUE ); SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 0.0f, -800.0f ), VGet( 0.0f, 0.0f, 0.0f ) ); VECTOR pos_r = LOCAL_POS_R, pos_g = LOCAL_POS_G, pos_b = LOCAL_POS_B; MATRIX rev_mat_g = MGetRotAxis( REVOLVE_AXIS_G, REVOLVE_RATE_G ); MATRIX rev_mat_b = MGetRotAxis( REVOLVE_AXIS_B, REVOLVE_RATE_B ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { pos_g = VTransform( pos_g, rev_mat_g ); pos_b = VTransform( pos_b, rev_mat_b ); ClearDrawScreen( ); DrawFormatString( 0, 0, StrColor, "test" ); DrawSphere3D( pos_r, 40.0f, 32, GetColor( 255, 0, 0 ), GetColor( 255, 255, 255 ), TRUE ); DrawSphere3D( VAdd( pos_r, pos_g ), 20.0f, 32, GetColor( 0, 255, 0 ), GetColor( 255, 255, 255 ), TRUE ); DrawSphere3D( VAdd( VAdd( pos_r, pos_g ), pos_b ), 10.0f, 32, GetColor( 0, 0, 255 ), GetColor( 255, 255, 255 ), TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 指定した座標を中心に回転 ( No.2 )
名前:ぎる 日時:2010/07/24 17:19

あの、フレームでそれをやるにはどうすればいいのでしょうか?
Re: 指定した座標を中心に回転 ( No.3 )
名前:いっち 日時:2010/07/24 18:31

> あの、フレームでそれをやるにはどうすればいいのでしょうか? MV1SetFrameUserLocalMatrix を使うと良いのではないでしょうか。
Re: 指定した座標を中心に回転 ( No.4 )
名前:ぎる 日時:2010/07/24 20:13

MV1SetFrameUserLocalMatrixをイマイチどう使うのかが、わかりません すみませんが解説していただけませんか?
Re: 指定した座標を中心に回転 ( No.5 )
名前:いっち 日時:2010/07/24 22:32

私も見よう見まねで作っているので、もっと良い方法があるのかもわかりません。 //- 以下、サンプル ("SimpleModel.mqo"を使用) -// #include "DxLib.h" const VECTOR LOCAL_POS = { 200.0f, 0.0f, 0.0f }; const VECTOR REVOLVE_AXIS = { 0.0f, 1.0f, 0.0f }; const float REVOLVE_RATE = TWO_PHI_F / 360.0f; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int StrColor = GetColor( 255, 255, 255 ); int mh = MV1LoadModel( "SimpleModel.mqo" ); MV1SetPosition( mh, VGet( 320.0f, 240.0f, 800.0f ) ); float angle = 0.0f; while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { angle++; if ( angle >= 360.0f ) angle = 0.0f; MV1SetFrameUserLocalMatrix( mh, 2, MGetTranslate( VTransform( LOCAL_POS, MGetRotAxis( REVOLVE_AXIS, REVOLVE_RATE * angle ) ) ) ); ClearDrawScreen( ); DrawFormatString( 0, 0, StrColor, "test" ); MV1DrawModel( mh ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 指定した座標を中心に回転 ( No.6 )
名前:ぎる(解決) 日時:2010/07/29 20:03

ありがとうございます!!! なんとかできそうです

Page: 1 |