管理者さまより、こちらに誘導されて参りました。
3Dのフライトシミュレータ的なゲームを作っており
DxLib掲示板の方でsoft屋さんのアドバイスによりとりあえず動くようにはなりました。
現段階のゲーム画面を貼っておきます。
今回質問したい事は題名にもある通りカメラの件です。ゲーム画像だと機体の後ろにカメラがあります。DxLib基本アクションから少しお借りしてきているので、現在カメラ関数はSetCameraPositionAndTarget_UpVecYを使用しています。
私はカメラを機体のコックピットに置き、機体と一緒に回転移動をさせたいと思っています。
この場合soft屋さん曰く、「SetCameraViewMatrix()を使うといい、機体と同じマトリックスが使える」と教えてくれました。
そこで、SetCameraViewMatrix()に機体で使われているであろうMATRIXを入れてみたのですが、変な方向を向いていたり、回転と動きがおかしかったり、真っ暗になったりするのです。
もしかすると私が機体と同じマトリックスの部分を勘違いしているかもしれないので、コードを見ていただきたくここに参上しました。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ↓省略されているが、ボタンを押すとrollなどに値が入り回転
//ロール
zAxis = VGet(mat.m[2][0], mat.m[2][1], mat.m[2][2]);
Quaternion = Quaternion * CreateRotationQuaternion(roll, zAxis);
//ピッチ
xAxis = VGet(mat.m[0][0], mat.m[0][1], mat.m[0][2]);
Quaternion = Quaternion * CreateRotationQuaternion(pitch, xAxis);
//ヨー
yAxis = VGet(mat.m[1][0], mat.m[1][1], mat.m[1][2]);
Quaternion = Quaternion * CreateRotationQuaternion(yaw, yAxis);
//回転 の掛け算
matRot = QuaternionToMatrix(Quaternion);
mat = MMult( mat, matRot );
//方向ベクトル だと思っている。
mat1 = VTransform(pl.AnglePosition,matRot);
//移動 違う場所で計算されている。
matTrans = MGetTranslate( VGet(JETMOVE.x,JETMOVE.y,JETMOVE.z) );
mat = MMult( mat, matTrans );
//ワールド座標に変換
MV1SetMatrix( pl.ModelHandle, mat );
// 画面をクリア
ClearDrawScreen() ;
// プレイヤーの処理
Player_Process() ;
// カメラの処理
Camera_Process() ; //←Dxlib基本アクションのサンプルそのもの。
//SetCameraViewMatrix(mat); //←matを入れていみたが、画面真っ暗。
//SetCameraViewMatrix(MMult(matTrans,matRot)); //←ちょっと変えてみたが回転と移動がおかしい。真っ暗ではない。
// 描画処理
Render_Process() ;
~~~~~~~~~~~~~~~~~~~~~~~~~~
コードの中にも書きましたが、matとMMult(matTrans,matRot)どちらも機体の動きと同じように動きません。
matに関して真っ暗と書きましたが、機体を少し回転させ動かすと一瞬白いもの(おそらく機体の一部)が画面をちらつくので完全に真っ暗というわけではないんですけどね。
どなたかSetCameraViewMatrixの使い方や,フライトゲーのカメラについてわかることあったりアドバイスくれる方お願いしますm(_ _)m。