トップページ > 記事閲覧
カメラ回転について
名前:初心者 N 日時: 2015/11/08 13:51

現在3Dモデルのカメラをマウス操作で回転をさせているのですが、カメラをある程度横移動してしまうと上下が反転してしまいます どのようにすればよいか助言が欲しいですコードは以下になります #include <DxLib.h> #include <math.h> #define PI 3.14159265 static const float ROTATE_SPEED = DX_PI_F/90;//回転スピード const float CoLineLength = 200.0f; // 軸の下のラインの長さ // (x,y)の点を(mx,my)を中心にang角回転する横回転 void rotate(float *x, float *y, const float ang, const float mx, const float my){ const float ox = *x-mx, oy = *y-my; *x = ox * cos(ang) + oy * sin(ang); *y = -ox * sin(ang) + oy * cos(ang); *x += mx; *y += my; } void rotate1(float *x, float *y, const float ang, const float mx, const float my){ const float ox = *x-mx, oy = *y-my; *x = ox * cos(ang) + oy * sin(ang); *y = -ox * sin(ang) + oy * cos(ang); *x += mx; *y += my; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); VECTOR ModelHandleM = VGet(0,10,0); //モデル座標 const float mapx=0,mapy=0,mapz=0; //MAPモデル座標 float angleX = 0.0f,angleY = 0.0f,angleZ = 0.0f; float cameraX=0,cameraY=120, cameraZ=-20; //カメラの座標 const float targetX=0,targetY=20.0f, targetZ=0;//カメラの視線の先ターゲットの座標 int Mouse_x,Mouse_y;//マウスの座標 SetGraphMode(640,480,32);//画面モードの変更 SetMousePoint(320,240);//マウスの初期座標を設定 //3Dモデルの読み込み int ModelHandel = MV1LoadModel( "" ) ; /* //のちのち部分解体をする予定 //砲塔 int ModelHandleHoutou = MV1LoadModel( "dat/tiger1/tiger1_mid_houtou.pmx" ) ; //主砲 int ModelHandleSyuhou = MV1LoadModel( "" ) ; //その他 int ModelHandleSonota = MV1LoadModel( "" ) ; */ //3D MAPモデルの読み込み int MapModelHandel = MV1LoadModel(""); // モデルのコリジョン情報を構築 // ・後始末をする必要がある MV1SetupCollInfo( ModelHandel, // モデルのハンドル -1, // コリジョンの情報を構築するフレームの番号 8, // コリジョン情報のX軸方向の空間分割数 8, // コリジョン情報のY軸方向の空間分割数 8 // コリジョン情報のZ軸方向の空間分割数 ); //奥行0.1〜1000までをカメラの描画範囲とする SetCameraNearFar( 0.1f, 1000.0f ) ; while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){ if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進 ModelHandleM.x += sin( angleY ) * 0.1f; ModelHandleM.z += cos( angleY ) * 0.1f; } if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進 ModelHandleM.x += sin( angleY ) * -0.1f; ModelHandleM.z += cos( angleY ) * -0.1f; } if( CheckHitKey(KEY_INPUT_A) > 0){//Aキーが押されていたら angleY -= ROTATE_SPEED; } if( CheckHitKey(KEY_INPUT_D) > 0){//Dキーが押されていたら angleY += ROTATE_SPEED; } VECTOR cameraUpVec = ModelHandleM; //マウスの座標を取得 GetMousePoint(&Mouse_x,&Mouse_y); if(Mouse_x>400){//座標が右方向に動いたら右回転 rotate(&cameraX,&cameraZ,+ROTATE_SPEED,targetX,targetZ); } if(Mouse_x<240){//座標が左方向に動いたら左回転 rotate(&cameraX,&cameraZ,-ROTATE_SPEED,targetX,targetZ); } if(Mouse_y>320){//座標が上方向に動いたら下回転 rotate1(&cameraY,&cameraZ,+ROTATE_SPEED,targetY,targetZ); } if(Mouse_y<160){//座標が下方向に動いたら上回転 rotate1(&cameraY,&cameraZ,-ROTATE_SPEED,targetY,targetZ); } if(cameraZ <= 0) //マウス操作の真上処理 { cameraUpVec.y *= -1; } /*if( CheckHitKey(KEY_INPUT_LEFT) > 0 ){//左キーが押されていたら rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転 } if( CheckHitKey(KEY_INPUT_RIGHT) > 0 ){//右キーが押されていたら rotate(&cameraX, &cameraZ, -ROTATE_SPEED, targetX, targetZ);//回転 } if( CheckHitKey(KEY_INPUT_UP) > 0 ){//上キーが押されていたら rotate(&cameraY, &cameraZ, +ROTATE_SPEED, targetY, targetZ);//回転 } if( CheckHitKey(KEY_INPUT_DOWN) > 0 ){//下キーが押されていたら rotate(&cameraY, &cameraZ, -ROTATE_SPEED, targetY, targetZ);//回転 } */ //第一引数の視点から第二引数のターゲットを見る角度にカメラを設置 //カメラの上下は成功しているが、左右のカメラ移動をするとカメラ向きが逆転してしまう SetCameraPositionAndTargetAndUpVec( VGet( cameraX + ModelHandleM.x, cameraY + ModelHandleM.y, cameraZ + ModelHandleM.z ) , VGet( targetX + ModelHandleM.x, targetY + ModelHandleM.y, targetZ + ModelHandleM.z ), cameraUpVec ) ; //カメラ移動の上下と左右に移動した後の上下運動が楕円に回ってしまう不具合がある /*SetCameraPositionAndTarget_UpVecY( VGet( cameraX + ModelHandleM.x, cameraY + ModelHandleM.y, cameraZ + ModelHandleM.z), VGet( targetX + ModelHandleM.x, targetY + ModelHandleM.y, targetZ + ModelHandleM.z)); */ //第二引数の回転角度をセット MV1SetRotationXYZ( ModelHandel, VGet( angleX, angleY, angleZ ) ) ; // 指定位置にモデルを配置 MV1SetPosition( ModelHandel, ModelHandleM ) ; // 指定位置にMAPモデルを配置 MV1SetPosition( MapModelHandel, VGet( mapx, mapy, mapz ) ) ; // 3Dモデルの描画 MV1DrawModel(MapModelHandel); //Mapモデルの読み込み MV1DrawModel(ModelHandel) ; //3Dモデルの読み込み // 衝突判定 { VECTOR StartPos, EndPos; StartPos = EndPos = ModelHandleM; EndPos.y -= CoLineLength; MV1_COLL_RESULT_POLY HitPoly; HitPoly = MV1CollCheck_Line( MapModelHandel, // モデルのハンドル -1, // コリジョンの情報を更新するフレームの番号 StartPos, // 当たり判定で使用する線分の始点 EndPos // 当たり判定で使用する線分の終点 ); // 当たった? // ・当たった場合はその位置を描画する線分の終点とする if(HitPoly.HitFlag == 1) { EndPos = HitPoly.HitPosition; } // 線分の描画 DrawLine3D(StartPos, EndPos, GetColor(255,0,0)); // 当たった? // ・当たった場合は当たったポリゴンを表示する if(HitPoly.HitFlag == 1) { int LineColor = GetColor(255,0,0); VECTOR Pos0 = HitPoly.Position[0]; VECTOR Pos1 = HitPoly.Position[1]; VECTOR Pos2 = HitPoly.Position[2]; // ちょっと持ち上げて重ならないようにする VECTOR SlideVec = VScale(HitPoly.Normal, 0.5f); Pos0 = VAdd(Pos0, SlideVec); Pos1 = VAdd(Pos1, SlideVec); Pos2 = VAdd(Pos2, SlideVec); // ワイヤーフレーム描画 DrawLine3D(Pos0, Pos1, LineColor); DrawLine3D(Pos1, Pos2, LineColor); DrawLine3D(Pos2, Pos0, LineColor); //当たり判定がある場合は、y軸を下げていく ModelHandleM.y -= 1; if(ModelHandleM.y <= 0){//当たり判定がされているときは3Dモデルを当たり判定以前に戻す ModelHandleM.y = 0; } } ModelHandleM.y += 1; //当たり判定がない場合はy軸を上げていく } DrawFormatString(0,0,GetColor(255,255,255),"ModelHandleM.x=%.1f ModelHandleM.y=%.1f ModelHandleM.z=%.1f",ModelHandleM.x,ModelHandleM.y,ModelHandleM.z); DrawFormatString(0,15,GetColor(255,255,255),"cameraX = %.1f cameraY = %.1f cameraZ = %.1f",cameraX,cameraY,cameraZ); DrawFormatString(0,30,GetColor(255,255,255),"targetX = %.1f targetY = %.1f targetZ = %.1f",targetX,targetY,targetZ); DrawFormatString(0,45,GetColor(255,255,255),"angleX = %.1f angleY = %.1f angleZ = %.1f",angleX,angleY,angleZ); DrawFormatString(0,60,GetColor(255,255,255),"Mouse_x = %.1f Mouse_y = %.1f",Mouse_x,Mouse_y); DrawFormatString(0,75,GetColor(255,255,255),"HitPoly.HitFlag = %.1f"); } // コリジョン情報の後始末 MV1TerminateCollInfo(MapModelHandel, -1); // モデルの後始末 MV1DeleteModel(ModelHandel); MV1DeleteModel(MapModelHandel); DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: カメラ回転について ( No.1 )
名前:管理人 日時:2015/11/08 21:42

すみません、ちょっと特殊な操作システムのようなので、実際に動いているところを拝見しないと どのような動作を意図していて、それがどうして意図通りになっていないのか理解することが できそうもありません・・・ プログラム中で使用している3Dモデルファイルをいただくことは可能でしょうか?
メンテ
Re: カメラ回転について ( No.2 )
名前:初心者 N 日時:2015/11/09 11:07

こちらに上げていただきました ttp://fast-uploader.com/file/7002590316030/ パスワードは 2784 となります お手数をかけます
メンテ
Re: カメラ回転について ( No.3 )
名前:管理人 日時:2015/11/10 00:48

3Dモデルファイルのアップありがとうございます、現象を確認できました カメラをある程度横移動してしまうと上下が反転してしまう原因はこちらの3行のようです if(cameraZ <= 0) //マウス操作の真上処理 { cameraUpVec.y *= -1; } こちらの3行をコメントアウトしたらカメラを横移動しても上下が反転しなくなりました よろしければお試しください
メンテ
Re: カメラ回転について ( No.4 )
名前:初心者 N 日時:2015/11/10 14:31

コメントアウトしましたら、反転しなくなりました ありがとうございます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存