2016-05-21 2 views
1

私は最近、LightingOpenGLチュートリアルに続いて、ライティングセクションを含めました。以前はグラフィック指向の数学コースでは、Lunar Landerを物理学のように2Dで作っていましたが、今ではそれを3Dに変換しようとしています。物理学自体がうまくいっている間、私はカメラに苦労しています。最初は、単にオブジェクトの後ろをたどりつくだけの簡単なカメラでしたが、これは非常に簡単でした。しかし、今はマウス入力に基づいてローテーションを実装しようとしています。第三者カメラの位置を計算する

私が望むのは、現代の3Dゲームのような通常の3人目のカメラです。私は現在、yaw(マウス入力によって提供されるxoffset)に基づいてXとZの位置を設定しようとしています。私のビュー行列は次のように計算される:

glm::lookAt(cameraPosition, focusTarget, cameraUp); 

私のフォーカス目標は、単に現在のCameraPositionの親オブジェクト(カメラが追従すべきもの)の位置との間の正規化ベクトルです。アップベクトルは、右ベクトルとターゲットベクトルの正規化された外積であり、右ベクトルはターゲットベクトルとワールドアップベクトル(0.0f、1.0f、0.0f)の正規化された外積です。

私はこのようなカメラの位置を計算する:

glm::vec4 cp; 
cp.x = hoverRadius * sin(glm::radians(yaw)); 
cp.z = hoverRadius * cos(glm::radians(yaw)); 

cameraPosition = glm::vec3(parentPosition->x + cp.x, parentPosition->y + 3.0f, parentPosition->z + cp.z + 20.0f); 

それは角としてヨーを使用して、正弦と余弦のオフx及びz値を基に私には意味を作ったが、結果は終了

https://zippy.gfycat.com/TediousElementaryBarnswallow.webm

明らかに、これは私が欲しいものではありません。私は私のマウスを左右にスワイプするときまで、このように見えます。まず、球からの距離が同じにとどまらず、第2に、球の周りの丸ではなく、球の後ろの省略記号で周回しているためです。

だから、誰でもこれを修正する方法を知っていますか?あるいは、誰かが私に機能的な第三者カメラをプログラムするのに役立つリソース/チュートリアルに向けて私を指摘できますか?私は何時間もこれをグーグルで試してみましたが、自分で何かを見つけられませんでしたが、私は実際にgoogleに何を知っていません。

また、私のコードの詳細が必要な場合は、カメラコード全体を喜んで提供します(これは主にLearnOpenGLカメラクラスに基づいています)。

答えて

0

どこかのように見えますが、カメラの行列はX軸でスケーリングされていますが、glm :: scaleがどこかにない、確かに頂点シェーダーに乗算されているのでしょうか?

はまた、あなたはベクトルにまたは手動で位置の代わりに、コンピューティング余弦と角度にglm::rotateglm::translateを使用することができることを知っていますか? GLMでのオーバーロードされた演算子の多くは、それはあなたのコードをより読みやすくすることができますあまりにも例があります。

glm::vec3 offset(0, 3, 20); 
glm::vec3 cp = glm::rotate(glm::vec3(0, 0, hoverRadius), yaw, glm::vec3(0, 1, 0)); 

cameraPosition = parentPosition + cp + offset; 

(私はこのコードは完全に有効であるかどうかわからないんだけど、私は、それをテストしていないが、メモリから、あなたがしたことを近似的に行うべきです)

関連する問題