Three.js多细节层次LOD

开发Web3D应用的时候,在一个很大的场景中有一个物体通过一个网格模型Mesh表示,为了追求更好的性能,在显示效果相近的情况下,可以根据网格模型Mesh距离相机镜头的远近来设置网格模型绑定几何体Geometry的三角形面数或者说顶点数量,面数越多显示效果肯定越精细,不过距离比较远的情况下,适当降低曲面三角形面数,在渲染性能提高的同时,低面数也可以做到高面数近似的显示效果。
比如说一个球体你可以用50个三角形面描述,也可以用200个三角形面,距离相机镜头比较近的情况下,使用200个三角形面面数球体效果比较好,如果离得比较远,同样渲染效果下为了更好的渲染性能,也没必要还设置为200个三角形面,可以适当减少面数。

为了实现距离相机远近不同,使用不同三角形面数的网格模型,Three.js引擎封装了一个类多细节层次THREE.LOD来实现该功能,多细节层次概念对应的英文是Levels of Detail。关于THREE.LOD类的介绍可以参考Threejs官方文档object(物体)分类下关于THREE.LOD的介绍。

代码案例

下面的代码创建三个三角形面数不同的球体网格模型,然后通过多细节层次模型THREE.LOD来设置远近不同距离显示哪一个球体网格模型,距离比较远显示低面数球体网格哦行,距离比较近,显示高面数网格模型。

var scene = new THREE.Scene();
// 创建一个多细节层次模型对象LOD
var lod = new THREE.LOD();// 近距离——高面数网格模型球体
var geometry1 = new THREE.SphereGeometry(50, 25, 25)
var material1 = new THREE.MeshPhongMaterial({color: 0xff0000,//使用红色标记高面数网格模型
});
var mesh1 = new THREE.Mesh(geometry1, material1);
// 细节层级距离100,距离相机比近显示该网格模型
lod.addLevel(mesh1, 100);
// 中距离——中面数网格模型球体
var geometry2 = new THREE.SphereGeometry(50, 20, 20)
var material2 = new THREE.MeshPhongMaterial({color: 0x00ff00, //使用绿色标记中面数网格模型
});
var mesh2 = new THREE.Mesh(geometry2, material2);
// 细节层级距离300,距离相机中等距离显示该网格模型
lod.addLevel(mesh2, 300);
// 远距离——低面数网格模型球体
var geometry3 = new THREE.SphereGeometry(50, 15, 15)
var material3 = new THREE.MeshPhongMaterial({color: 0x0000ff, //使用蓝色标记低面数网格模型
});
var mesh3 = new THREE.Mesh(geometry3, material3);
// 细节层级距离500,距离相机比较远显示该网格模型
lod.addLevel(mesh3, 500);
// 控制台查看多细节层次模型对象Lod
// 你可以看到Lod对象的.children属性包含了上面.addLevel方法插入的三个网格模型mesh1,mesh2,mesh3
console.log(lod)
// 改变物体距离相机不同距离,可以看到不同面数的网格模型Mesh,
// 可以改变z的值进行测试,上面三个不同面数的球体网格模型使用了不同的颜色进行标记,便与测试
// 设置z的值改变球体网格模型的位置,注意相机参数  200  -100 -300
lod.position.z = -300
// 把多层次细节模型对象lod插入到场景中,lod虽然包含多个子对象网格模型,通常显示一个
// 注意渲染函数render中执行lod的更新方法.update(camera)
scene.add(lod);
...
...
function render() {// 注意渲染函数render中执行lod的更新方法.update(camera)lod.update(camera)renderer.render(scene, camera);requestAnimationFrame(render);
}

为了便于进行代码测试,注意相机参数的设置

var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 3000);
camera.position.set(0, 0, 300);

多层次细节LOD

多层次细节模型对象LOD和组对象Group一样基类是Object3D,为了你能够更快的使用好LOD类,可以类比过去的Threejs知识点进行快速学习记忆。你可以简单的把多层次细节模型对象LOD理解为组对象Group,组对象Group可以通过.add()方法插入一个网格模型对象作为group的子对象,也就是插入到.children属性中,对于多层次细节对象LOD是一样的,只是
LOD使用的方法不是.add()而是.addLevel().addLevel().add()一样改变的是父对象的.children属性。

你可以把把多层次细节模型对象LOD简单的理解为组对象Group,区别在于组对象Group属性.children中的子对象默然是全部渲染的,多层次细节模型对象LOD属性.children中的子对象Threejs系统一般要根据距离计算显示其中一个。

.addLevel(模型对象,距离)方法

多层次细节LOD模型对象的.addLevel()方法,类似组对象或场景对象的.add()方法,会改变LOD对象的.children属性,.addLevel()方法的参数1会插入.children属性数组中,

.addLevel()方法的参数2用来设置参数1表示的模型对象在多少距离下显示,执行该方法lod对象的.levels数组属性会多一个元素对象。

// 细节层级距离300,距离相机300以内显示该网格模型
// 执行该方法,lod对象的`.levels`数组属性会多一个元素对象{distance: 300, object: Mesh}
lod.addLevel(mesh2, 300);

.levels属性

.levels属性值是一个数组,数组中有多个细节不同模型对象相关参数,数组元素是一个对象,有object和distance两个属性,object指向一个模型对象,distance表示该模型对象显示的临界距离。

每执行一次.addLevel(模型对象,距离)方法,.levels属性就多一个元素对象,.addLevel()的两个参数值分别原来设置.levels元素的object和distance属性

为了更好的了解lod对象的数据结构,可以在控制打印该对象,查看lod对象的每一个属性,尤其是 .levels属性,Threejs系统渲染的时候,会从Lod的属性中各个参数,控制渲染结果。

// 控制台查看多细节层次模型对象Lod
// 你可以看到Lod对象的.children属性包含了上面.addLevel方法插入的三个网格模型mesh1,mesh2,mesh3
console.log(lod)

.update(相机对象)

基于每个level中的object和camera(摄像机)之间的距离,来设置其可见性。 为了使得多细节层次能够被自动地更新,这个方法需要在渲染循环中被调用。

function render() {// 注意渲染函数render中执行lod的更新方法.update(camera)lod.update(camera)
...
}

本文转载地址:我的个人技术博客

Three.js多细节层次LOD相关推荐

  1. Three.js 多细节层次

    Three.js 多细节层次 概述 代码 概述 多细节层次 -- 在显示网格时,根据摄像机距离物体的距离,来使用更多或者更少的几何体来对其进行显示. 每一个级别都和一个几何体相关联,且在渲染时,可以根 ...

  2. tableau实战系列(三十)- 多细节层次(LOD) 计算产品销售周期延申表达式详解

    前言 LOD(level of details) 是tableau 10.0中一个重要的更新功能,非常强大 三种表达式fixed , include, exclude . 通俗的解释一下三种表达式: ...

  3. 着色器的细节层次技术 Shader Level of Detail

    Shader Level of Detail (LOD) works by only using shaders or subshaders that have their LOD value les ...

  4. 聚焦3D地形编程第五章GeomipMapping for the CLOD

    第二部分高级地形编程 聚焦3D地形编程第五章GeomipMapping for the CLOD 译者: 神杀中龙 邵小宁 microsoftxiao@163.com 翻译的烂请见谅 原著 <F ...

  5. GPU Gems1 - 18 空间BRDF(Spatial BRDFs)

    这章主要介绍了空间双向反射分布函数(SBRDF),接着文章讨论了压缩SBRDF表达式,以及由离散光或环境贴图所照明的SBRDF的渲染方法.关于BRDF请参考大佬浅墨的这篇文章https://blog. ...

  6. 移动端海洋实时仿真技术研究与实现

    http://blog.csdn.net/jxw167/article/details/54646773 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国 ...

  7. OSG学习:OSG组成(二)——渲染状态和纹理映射

    以下内容来自: 1.<OpenSceneGraph三维渲染引擎编程指南>肖鹏 刘更代 徐明亮 清华大学出版社  2.<OpenSceneGraph三维渲染引擎设计与实践>王锐 ...

  8. OpenGL红宝书的部分学习记录

    我看的OpenGL红宝书为: <OpenGL编程指南>-- 原书第9版 OpenGL Programming Guide – The Official Guide to Learning ...

  9. GIS原理篇 terrain 基于TIN的表面数据(地形数据)

    一.什么是terrain Terrain 数据集是一种多分辨率的基于 TIN 的表面数据结构,它是基于作为要素存储在地理数据库中的测量值构建而成的.通常,terrain 数据集利用激光雷达.声纳和摄影 ...

最新文章

  1. CVPR2020人脸防伪检测挑战赛冠亚军论文解读(下篇)
  2. 学python要考什么证-学python需要考证吗?
  3. 快速使用wordpress
  4. 常考数据结构与算法:排序
  5. 打印helloworld,注释,从源文件到可执行文件
  6. Logistic 回归(sigmoid函数,手机的评价,梯度上升,批处理梯度,随机梯度,从疝气病症预测病马的死亡率...
  7. selenium webdirver之ruby-开发ide安装
  8. 10道腾讯的Java面试题
  9. Duplicate entry ‘‘ for key ‘***‘
  10. 祝每位读者在新的一年里虎虎有生气·事事皆如意!
  11. Microsoft Visual Studio 2012 产品密匙
  12. 实时操作系统与分时操作系统原理详解——经典
  13. 多测师杭州拱墅校区__肖sir__软件测试生命周期(4)
  14. 改变iOS searchBar中textField的背景颜色
  15. 数学算法 湿度计算方法
  16. MSP430F149--点亮LED灯程序代码
  17. HR提升丨怎样当一名称职的中层管理者
  18. ListView实现item局部刷新
  19. 智能血压计方案/设计案列/APP/小程序
  20. Android11 读写权限申请

热门文章

  1. 魔兽8.0最新服务器人口普查,魔兽世界人口普查8.0版最新资讯!赶紧来了解!
  2. 超声波脉冲发生器可调电源设计
  3. 平面设计师不断的提高设计水平的技巧是什么
  4. 微信小程序实现pdf、word等格式文件上传的方法
  5. STC-ISP下载过程
  6. 论文阅读:Interactive Multiobjective Optimisation: Preference Changes and Algorithm Responsiveness
  7. 学计算机的要起一个群名,微信群名字大全 一起走过的日子
  8. 反应力测试游戏软件,反应力测试小游戏合集
  9. gdb与peda、pwngdb、pwndbg组合安装与使用
  10. 匈牙利算法的粗略解释