0

私は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);
}

問題はまだそこにあります....

イニシャル

円のパスに沿ってマウスを数回動かした後.....

最後の

4

1 に答える 1

1

カメラは 2 軸を中心に回転する必要があります。アップ ベクトルと機銃掃射ベクトル。アップ ベクトルを中心に回転すると左右の「外観」が得られ、機銃掃射ベクトルを中心に回転すると上下の「外観」が得られます。

回転を実行するときは、方向を変換するだけでなく、アップ ベクトルとストレイフ ベクトルも変換する必要があります。あなたはここでそれをしていないようです。3 つのベクトルはすべて互いに直交している必要があるため、変換後に少なくとも 2 つのベクトルを変更する必要があります。

以下を疑似コードとして見てください。

public static void MouseLook(float x, float y)
{
     Matrix xRot = Matrix.CreateFromAxisAngle(Vector3.Up, x * rotationSpeed);
     Matrix yRot = Matrix.CreateFromAxisAngle(Vector3.Right, y * rotationSpeed);

     viewMatrix = viewMatrix * yRot * xRot;

     // Orthogonalize the matrix
     OrthoNormalize();
 }

 private static void OrthoNormalize()
 {
     Vector3 zAxis = viewMatrix.Forward;
     zAxis.Normalize();

     Vector3 xAxis = Vector3.Cross(Vector3.Up,zAxis); 
     xAxis.Normalize();



     Vector3 yAxis = Vector3.Cross(xAxis,zAxis);  
     yAxis.Normalize();

     viewMatrix.Forward = zAxis;
     viewMatrix.Up = yAxis;
     viewMatrix.Right = xAxis;
}

探しているものに対する答えがあるので、次の質問をチェックしてください:カメラの回転

于 2013-08-05T07:33:27.703 に答える