私はGLMが初めてで、fpsスタイルのカメラクラスを書こうとしています
マウスを動かしたときにアップ ベクトルを再計算する必要がありますか?
ただし、アップベクターを変更すると、すべてが奇妙に見えます
それでも、アップベクターを維持すると、私のプログラムはバグがあるように見えます
ファイル: fpscamera.cpp
void FPSCamera::rotateScreen(float dx, float dy){
auto oldDirection=getTarget()-getPosition();
setTarget(getPosition()+rotate(oldDirection, -dx*5, getUp()));
auto oldHoro=rotate(cross(oldDirection,getUp()), -dx*5, getUp());
setTarget(getPosition()+rotate(getTarget()-getPosition(),dy*5, oldHoro));
////////////////HERE////////////////////////
//setUp(normalize(cross(oldHoro,getTarget()-getPosition())));
}
ソースコードとバイナリはこちらからダウンロードできます
https://docs.google.com/file/d/0B9givuJvSet8ekRReWtRM29ldzg/edit?usp=sharing
mingw-built64 g++4.8(C++11) glfw3 GLM(MathHelper Library)が必要
g++ -std=c++0x -Wall main.cpp mesh.cpp fpscamera.cpp -lglfw3 -lopengl32 -lglu32 -lgdi32
ターゲットに向かって移動... W
左/右に曲がる.... Q/E
左/右に移動.... A/D
=====================2013/8/6 edit カメラクラスを編集してヨーピッチロール機能を追加
void Camera::roll(float among){
if(isChange) resetCacheAxis();
upVec=glm::rotate(upVec, among, cacheY);
isChange=true;
}
void Camera::pitch(float among){
if(isChange) resetCacheAxis();
targetVec=posVec+glm::rotate(targetVec-posVec, among, cacheX);
upVec=glm::normalize(glm::cross(cacheX, targetVec-posVec));
isChange=true;
}
void Camera::yaw(float among){
if(isChange) resetCacheAxis();
targetVec=posVec+glm::rotate(targetVec-posVec, among, cacheZ);
isChange=true;
}
void Camera::resetCacheAxis(){
cacheY=glm::normalize(targetVec-posVec);
cacheZ=glm::normalize(upVec);
cacheX=glm::cross(cacheY, cacheZ);
}
ヨーとピッチでマウスカメラコントロールを実装します
void FPSCamera::rotateScreen(float dx, float dy){
yaw(-dx);
pitch(dy);
}
問題はまだそこにあります....
円のパスに沿ってマウスを数回動かした後.....