查看Frustum剔除四方

时间:2017-10-06 14:22:36

标签: webgl frustum

我试图将视锥体剔除应用到我的场景中。 我基本上有这个设置:

  • 渲染显示为四叉树
  • 的四个四边形
  • 例如,如果深度为1,那么四边形会分成4个较小的四边形
  • 每个四边形都有纹理
  • 我有一个第一人称相机,这意味着我只能环顾四周而不能移动(我的相机的orogin总是在(0,0,0)

depth 1处的四元组如下所示:

1 --- 2

3 --- 4

其中quad 1代表四叉树的nw quadrantquad 2代表四叉树的ne quadrant,依此类推。 我的目标是(例如depth 1)每当我移动相机时,例如quad 13不再可见,它们就不应再渲染了。

但是我当前的实现并不正确。我正在提取这样的frustumplanes,我认为这是错误。

createFrustumPlanes(vp) {

    let leftPlane = vec4.fromValues(vp[0] + vp[3], vp[4] + vp[7], vp[8] + vp[11], vp[12] + vp[15]);
    vec4.normalize(leftPlane, leftPlane);
    let rightPlane = vec4.fromValues(-vp[0] + vp[3], -vp[4] + vp[7], -vp[8] + vp[11], -vp[12] + vp[15]);
    vec4.normalize(rightPlane, rightPlane);
    let bottomPlane = vec4.fromValues(vp[1] + vp[3], vp[5] + vp[7], vp[9] + vp[11], vp[13] + vp[15]);
    vec4.normalize(bottomPlane, bottomPlane);
    let topPlane = vec4.fromValues(-vp[1] + vp[3], -vp[5] + vp[7], -vp[9] + vp[11], -vp[13] + vp[15]);
    vec4.normalize(topPlane, topPlane);
    let nearPlane = vec4.fromValues(vp[2] + vp[3], vp[6] + vp[7], vp[10] + vp[11], vp[14] + vp[15]);
    vec4.normalize(nearPlane, nearPlane);
    let farPlane = vec4.fromValues(-vp[2] + vp[3], -vp[6] + vp[7], -vp[10] + vp[11], -vp[14] + vp[15]);
    vec4.normalize(farPlane, farPlane);
    return [
      leftPlane,
      rightPlane,
      bottomPlane,
      topPlane,
      nearPlane,
      farPlane
    ];
}

其中vp是以下this._vpMatrix

   this._lookAtMatrix = mat4.create();
   mat4.lookAt(this._lookAtMatrix, vec3.fromValues(0, 0, 0), this._lookAtVector, vec3.fromValues(0, 1, 0));
   this._projectionMatrix = mat4.create();
   mat4.perspective(this._projectionMatrix, this._FOV * Math.PI / 180.0, this._width / this._height, 0.001, 50);
   this._vpMatrix = mat4.create();
   mat4.multiply(this._vpMatrix, this._projectionMatrix, this._lookAtMatrix);

如何从frustum planes中提取matrix以及从哪个{{1}}创建平面?

0 个答案:

没有答案