簡體   English   中英

第一人稱視角相機運動問題

[英]First Person Camera movement issues

我正在使用GLM庫實現第一人稱相機,該庫為我提供了一些有用的功能,這些功能可以計算透視圖和“ lookAt”矩陣。 我也在使用OpenGL,但這在代碼中沒有什么不同。

基本上,我所經歷的是我可以環顧四周,就像在常規FPS中那樣四處移動。 但是運動被限制在三個軸上,如果我旋轉相機,我仍然會像沒有旋轉一樣朝着相同的方向移動...讓我舉例說明(以2D簡化)。 在此處輸入圖片說明

在此圖像中,您可以看到四個相機位置。 標有“ 1”的標記是在移動之前,標有“ 2”的標記是在移動之后。 紅色三角形代表沿z軸筆直定向的攝像機。 藍色三角形代表已旋轉以沿x軸(向左)向后看的攝像機。 當我按下“向前移動鍵”時,兩種情況下相機都會沿z軸向前移動,而無需考慮相機的方向。

我想要的是一種更加類似於FPS的行為,向前推動會使我朝着相機所面對的方向移動。 我認為,通過傳遞給glm::lookAt的參數,可以實現這一點。 顯然不是。

我的計算有什么問題?

// Calculate the camera's orientation
float angleHori = -mMouseSpeed * Mouse::x; // Note that (0, 0) is the center of the screen
float angleVert = -mMouseSpeed * Mouse::y;

glm::vec3 dir(
    cos(angleVert) * sin(angleHori),
    sin(angleVert),
    cos(angleVert) * cos(angleHori)
);

glm::vec3 right(
    sin(angleHori - M_PI / 2.0f),
    0.0f,
    cos(angleHori - M_PI / 2.0f)
);

glm::vec3 up = glm::cross(right, dir);

// Calculate projection and view matrix
glm::mat4 projMatrix = glm::perspective(mFOV, mViewPortSizeX / (float)mViewPortSizeY, mZNear, mZFar);
glm::mat4 viewMatrix = glm::lookAt(mPosition, mPosition + dir, up);

gluLookAt具有3個參數:eye,center和up。 前兩個是位置,最后一個是向量。 如果您打算使用此功能,最好只保持這三個參數不變。

談到計算問題。 我看到position變量在整個代碼中都沒有改變。 所發生的所有變化僅是在Ie centre 正確的做法是首先執行position += dir ,這將使攝像機(位置)沿dir指向的方向移動。 現在要更新centre ,第二個參數可以保持不變: position + dir ; 這將起作用,因為該位置已經更新到新位置,並且從那里我們在dir方向上有一個更遠的地方可以查看。

問題實際上是另一種方法。 移動相機時,我需要這樣做:

void Camera::moveX(char s)
{
    mPosition += s * mSpeed * mRight;
}

void Camera::moveY(char s)
{
    mPosition += s * mSpeed * mUp;
}

void Camera::moveZ(chars)
{
    mPosition += s * mSpeed * mDirection;
}

使攝像機沿正確的軸移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM