簡體   English   中英

向上或向下看時剔除截頭錐體變窄

[英]Culling frustum becoming narrow when looking up or down

我在 OpenGL 中實現截錐體剔除時遇到問題。 我在世界空間中實現了平面提取,使用這個Lighthouse3d教程(引擎的 rest 來自 learnopengl.com)。 它工作得很好,但只有當相機指向地平線時。 如果相機指向上方或下方,截錐體會逐漸變窄。

事實上,當指向地平線時,遠截頭體平面大小為 1023 * 828,但在指向上或下時僅為 17 * 14。 近平截頭體平面也會出現同樣的問題。

這是每幀更新截錐體的代碼(C++):

  tang = (float) tan(glm::radians(45.0f) * 0.5f);
  ratio = SCR_WIDTH * 1.0 / SCR_HEIGHT;

  // Direction vectors
  cameraZ = cameraFront * -1.0f;
  cameraRight = glm::cross(glm::vec3(0.0f, 1.0f,  0.0f), cameraZ);
  cameraUp = glm::cross(cameraZ, cameraRight);

  // Dimensions of near and far frustum planes
  Hnear = nearDist * tang; // Hnear = near plane height
  Wnear = Hnear * ratio; // Wnear = near plane width
  Hfar = farDist  * tang; // Hfar = far plane height
  Wfar = Hfar * ratio; // Wfar = far plane width

  // Distance of near and far planes
  fc = cameraPos - cameraZ * farDist; // fc = far center
  nc = cameraPos - cameraZ * nearDist; // nc = near center

  // Extraction of frustum points
  ntl = nc + (cameraUp * Hnear) - (cameraRight * Wnear);
  ntr = nc + (cameraUp * Hnear) + (cameraRight * Wnear);
  nbl = nc - (cameraUp * Hnear) - (cameraRight * Wnear);
  nbr = nc - (cameraUp * Hnear) + (cameraRight * Wnear);

  ftl = fc + (cameraUp * Hfar) - (cameraRight * Wfar);
  ftr = fc + (cameraUp * Hfar) + (cameraRight * Wfar);
  fbl = fc - (cameraUp * Hfar) - (cameraRight * Wfar);
  fbr = fc - (cameraUp * Hfar) + (cameraRight * Wfar);

  // Computation of the 6 frustum planes
  topPlane = {ntr,ntl,ftl};
  bottomPlane = {nbl,nbr,fbr};
  leftPlane = {ntl,nbl,fbl};
  rightPlane = {nbr,ntr,fbr};
  nearPlane = {ntl,ntr,nbr};
  farPlane = {ftr,ftl,fbl};

結果如下:

截錐體剔除錯誤

問題是由於 cameraUp 和 cameraRight 值未標准化。

暫無
暫無

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

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