簡體   English   中英

如何使用GLM旋轉3D相機

[英]How to rotate 3D camera with glm

因此,我有一個Camera類,女巫具有向前,向上和定位的向量。 我可以通過更改位置來移動相機,並以此計算其矩陣:

  glm::mat4 view = glm::lookAt(camera->getPos(),
  camera->getTarget(), //Caclates forwards end point, starting from pos
  camera->getUp());  

穆的問題是,如何才能在不獲得萬向節鎖定的情況下旋轉相機。 我尚未找到有關glm四元數甚至3d編程中四元數的任何好信息

glm使四元數相對容易。 您可以使用包含歐拉角的glm :: vec3來啟動四元數,例如glm :: fquat(glm :: vec3(x,y,z))。 您可以通過乘以(r = r1 * r2)來旋轉一個四元數,而這不需要萬向節鎖定。 要使用四元數生成矩陣,請使用glm :: mat_cast(yourQuat)將其轉換為旋轉矩陣。

因此,假設您要制作3D應用程序,請將方向存儲在四元數中,並將位置存儲在vec4中,然后要生成View矩陣,可以使用vec4(0,0,1,1)並將其乘以四元數生成的矩陣,然后將其添加到位置,這將為您提供目標。 向上向量可以通過將四元數矩陣乘以vec4(0,1,0,1)來獲得。 告訴我您是否還有問題。

對於其他兩個問題假設您正在使用opengl,而Z軸為正向軸。 (正X遠離用戶。)

1)。 要變換正向矢量,可以在四元數上繞Y和X軸旋轉。 例如glm :: fquat(glm :: vec3(rotationUpandDown,rotationLeftAndRight,0))。 並將其乘以方向四元數

2)。如果要滾動,請找到前進軸位於哪個組件上。 由於您似乎正在使用openGL,因此該軸很可能是您的正Z軸。 因此,如果要滾動,請使用glm :: quat(glm :: vec3(0,0,rollAmt))。 並將其乘以方向四元數。 方向= rollquat *方向。

注意::這是一個可能對您有幫助的功能,我以前將其用於我的相機。 使quat將1個向量轉換為另一個向量,例如將一個正向向量轉換為另一個向量。

//Creates a quat that turns U to V
glm::quat CreateQuatFromTwoVectors(cvec3 U, cvec3 V)
{
    cvec3 w = glm::cross(U,V);
    glm::quat q = glm::quat(glm::dot(U,V), w.x, w.y, w.z);
    q.w += sqrt(q.x*q.x + q.w*q.w + q.y*q.y + q.z*q.z);
    return glm::normalize(q);
}

暫無
暫無

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

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