トップページ > 過去ログ > 記事閲覧
カメラを基準にキャラを動かすには
名前:ぱらりら 日時: 2011/07/23 17:42

カメラの位置とカメラの注視点(=キャラ)のベクトルを基準に キャラを動かすプログラムを考えています。 上を押せばそのベクトルと同じ方向に、下なら反対方向、 左ならそのベクトルに対し直角でその向きに対し左側に、右ならその逆と言う感じです。 しかしなかなか上手くいきません。どこに問題があるのでしょうか? #include "DxLib.h" #include <math.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, ModelComp ; VECTOR CameraPos ; VECTOR CharaPos ; VECTOR vCamDir ; float x=100.0f,y=-400.0f,z=200.0f,x2=100.0f,y2=0.0f,z2=200.0f; float Roll=0.0f; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } ChangeWindowMode(TRUE); // モデルの読み込み ModelHandle = MV1LoadModel( "キャラ.pmd" ) ; ModelComp = MV1LoadModel( "比較用モデル.mqo" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 3Dモデルのスケールを均等に50倍にする MV1SetScale( ModelHandle, VGet( 50.0f, 50.0f, 50.0f ) ) ; // カメラの座標を初期化 CameraPos.x = x2 + 900 * sin(Roll); CameraPos.y = y2; CameraPos.z = z2 - 900 * cos(Roll); // キャラの位置を初期化 CharaPos.x = x; CharaPos.y = y; CharaPos.z = z; //カメラ移動方向ベクトルを正規化してスケーリング→vCamDirは速度ベクトルとして利用 vCamDir = VGet(x-x2,0,z-z2); vCamDir = VNorm(vCamDir); vCamDir = VScale(vCamDir,20.0f/3.0f); // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; //AorDキーでカメラ位置変更 if( CheckHitKey( KEY_INPUT_A ) == 1) { Roll += PHI_F / 60.0f; CameraPos.x = x2 + 900 * sin(Roll); CameraPos.z = z2 - 900 * cos(Roll); } if( CheckHitKey( KEY_INPUT_D ) == 1) { Roll -= PHI_F / 60.0f; CameraPos.x = x2 + 900 * sin(Roll); CameraPos.z = z2 - 900 * cos(Roll); } // 方向キーでキャラの座標を移動 if( CheckHitKey( KEY_INPUT_UP ) == 1 ) { //キャラ位置の設定(キャラ位置=キャラ位置+速度ベクトル) MV1SetPosition(ModelHandle,(CharaPos=VAdd(CharaPos,vCamDir)) ); } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) { //同上 MV1SetPosition(ModelHandle,(CharaPos=VSub(CharaPos,vCamDir)) ); } // カメラの位置と注視点をセット、注視点はキャラ位置よりy軸+方向に400上の点 SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( x, 0.0f, z ) ) ; // モデルの描画 MV1DrawModel( ModelHandle) ; // 比較用モデルを描画 MV1DrawModel(ModelComp); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 今のところこのようなプログラムになっています。正直かなり滅茶苦茶です…

Page: 1 |

Re: カメラを基準にキャラを動かすには ( No.1 )
名前:ぱらりら 日時:2011/07/23 18:59

上記のコードは忘れてください。 キャラの位置ベクトル Chara = (a,b,c) カメラ位置(ベクトルCamPos):(a,b,c)を中心とする球(x-a)^2 + (y-b)^2 + (z-c)^2 = 900^2 の境界部分(ただし上下は60°以内) カメラ方向ベクトル CamDir = Chara - CamPos CamDirを正規化し、何らかの定数を掛けた(スケーリングした)ベクトルを Vel とする キャラクターの移動後の位置は(a+Vel.x, b+Vel.y, c+Vel.z)となるようにしたい 特にカメラ位置を決めるのが難しいです。
Re: カメラを基準にキャラを動かすには ( No.2 )
名前:管理人 日時:2011/07/23 21:29

カメラの方向を基準にしたキャラクターの移動を3Dアクション基本のサンプルで行っていますので、 よろしければこちらのプログラムをご覧になってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DAction.html
Re: カメラを基準にキャラを動かすには ( No.3 )
名前:ぱらりら 日時:2011/07/24 17:29

ご紹介してくださりありがとうございます。 かなり長いサンプルコードなので読むのも一苦労ですが、勉強させていただきます。 1つ確認しておきたいのですが、カメラ情報構造体の水平角度、垂直角度は何を表しているのでしょうか? 恐らく水平角度はカメラ方向ベクトルとxz平面の角度、 垂直角度はカメラ方向ベクトルとxy平面の角度だとは思うのですが、 すると垂直角度は90°より大きくならないので180°というのは 一体何だということで躓いてます…
Re: カメラを基準にキャラを動かすには ( No.4 )
名前:いっち 日時:2011/07/24 18:43

AngleV は (-PHI_F / 2.0f + 0.6f) から (PHI_F / 2.0f - 0.6f) の範囲にしかならないと思います。
Re: カメラを基準にキャラを動かすには ( No.5 )
名前:ぱらりら 日時:2011/07/24 19:34

水平が180度、垂直が0度でした。
Re: カメラを基準にキャラを動かすには ( No.6 )
名前:いっち 日時:2011/07/24 21:09

水平角度は別に何度になろうとも問題ないと思うのですが、解決ということで良いのでしょうか?
Re: カメラを基準にキャラを動かすには ( No.7 )
名前:ぱらりら 日時:2011/07/24 22:12

うーん、何が何に対して水平で、何が何に対して垂直なのかが分からないので、まだ解決ではないですね…
Re: カメラを基準にキャラを動かすには ( No.8 )
名前:いっち 日時:2011/07/24 23:08

AngleV は Z軸回転(XY平面上)の回転角、AngleH は Y軸回転(XZ平面上)の回転角として利用されています。 >// カメラの座標を算出 >// X軸にカメラとプレイヤーとの距離分だけ伸びたベクトルを >// 垂直方向回転( Z軸回転 )させたあと水平方向回転( Y軸回転 )して更に >// 注視点の座標を足したものがカメラの座標 >cam.Eye = VAdd( VTransform( VTransform( VGet( -Camera_Player_Length, 0.0f, 0.0f ), RotZ ), RotY ), cam.Target ) ; 上記コードでカメラのだいたいの位置が決められます。 その中で VGet( -Camera_Player_Length, 0.0f, 0.0f ) がカメラのデフォルト(AngleV と AngleH が共に 0)の座標になります。
Re: カメラを基準にキャラを動かすには ( No.9 )
名前:ぱらりら(解決) 日時:2011/07/25 01:21

なるほど、分かりました。 長くお付き合いくださりありがとうございました。

Page: 1 |