【无标题】

在浏览器中渲染大尺寸 3D 模型:Speckle 处理空间抖动的方法

WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理赏析

注: 相机空间视图空间 概念等效混用

1、实现的关键代码
const material = new THREE.RawShaderMaterial({
  uniforms: {
    cameraPostion: { value: null },
    modelViewMatrixRTE: { value: null },
  },
  vertexShader: `
    attribute vec3 position;
    uniform vec3 cameraPostion;
    uniform mat4 modelViewMatrixRTE;
    uniform mat4 projectionMatrix;

    void main() {
      // key1
      vec4 mvPosition = vec4(position.xyz - cameraPostion, 1.);
      gl_Position = projectionMatrix * modelViewMatrixRTE * mvPosition;
    }`,
  fragmentShader: `
    void main() {
      gl_FragColor = vec4(vec3(0.5),1.);
    }`
});

// 模型视图矩阵相对于相机。
const modelViewMatrixRTE = new THREE.Matrix4();
function updateMat(box) {
  camera.updateMatrixWorld();
  modelViewMatrixRTE.multiplyMatrices(camera.matrixWorldInverse, box.matrixWorld);
  // key2
  modelViewMatrixRTE.elements[12] = 0;
  modelViewMatrixRTE.elements[13] = 0;
  modelViewMatrixRTE.elements[14] = 0;

  box.material.uniforms.cameraPostion.value = camera.position;
  box.material.uniforms.modelViewMatrixRTE.value = modelViewMatrixRTE;
}
2、原理赏析

顶点的变换流程依然满足这个流程。
请添加图片描述

正常的矩阵变换过程, 模型顶点都是是基于原点(0,0,0)进行的变换。但是大场景会出现抖动情况。于是将顶点位置改为基于相机位置进行后面的变换。

那么每个顶点都应该减去相机位置。但是这个工作完全可以在顶点着色器中完成, 于是将该操作延迟。那么这里假设已经完成了世界空间视图空间的平移变换。

modelViewMatrixRTE 依然是用于将模型空间中的点转换到视图空间中。但是因为模型顶点已经是相对于相机位置了(该操作被延迟执行), 因此不需要再进行平移操作。

modelViewMatrixRTE.elements[12] = 0;
modelViewMatrixRTE.elements[13] = 0;
modelViewMatrixRTE.elements[14] = 0;

最后, 将世界空间相机空间的平移操作延迟到顶点着色器中执行。

vec4 mvPosition = vec4(position.xyz - cameraPostion, 1.);
  gl_Position = projectionMatrix * modelViewMatrixRTE * mvPosition;

相关推荐

  1. 标题

    2024-04-27 15:10:02       72 阅读
  2. 标题

    2024-04-27 15:10:02       69 阅读
  3. 标题

    2024-04-27 15:10:02       67 阅读
  4. 标题

    2024-04-27 15:10:02       77 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 15:10:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 15:10:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 15:10:02       87 阅读
  4. Python语言-面向对象

    2024-04-27 15:10:02       96 阅读

热门阅读

  1. Vue3的新组件<Suspense>

    2024-04-27 15:10:02       36 阅读
  2. PHP利用JWT refresh_token获取新access_token

    2024-04-27 15:10:02       34 阅读
  3. opencv改变像素点的颜色---------c++

    2024-04-27 15:10:02       35 阅读
  4. MongoDB聚合运算符:$slice

    2024-04-27 15:10:02       36 阅读
  5. GPT产业 行业研究报告合集整理

    2024-04-27 15:10:02       78 阅读
  6. sql server判断表是否存在,要是存在删除

    2024-04-27 15:10:02       101 阅读
  7. IDE 高效快捷键

    2024-04-27 15:10:02       37 阅读
  8. Kubernetes 命令大全

    2024-04-27 15:10:02       31 阅读
  9. Smokeyshell

    2024-04-27 15:10:02       32 阅读