Threejs使用LOD根据摄像机距离物体的距离显示不同的物体

简介: Threejs使用LOD根据摄像机距离物体的距离显示不同的物体

1,介绍


该示例使用的是 r95版本Three.js库。

主要实现功能:多细节层次 —— 在显示网格时,根据摄像机距离物体的距离,来使用更多或者更少的几何体来对其进行显示。

效果图如下:



2,动画主要说明


多细节层次(LOD,Levels of Detail)

多细节层次 —— 在显示网格时,根据摄像机距离物体的距离,来使用更多或者更少的几何体来对其进行显示。


每一个级别都和一个几何体相关联,且在渲染时,可以根据给定的距离,来在这些级别对应的几何体之间进行切换。 通常情况下,你会创建多个几何体,比如说三个,一个距离很远(低细节),一个距离适中(中等细节),还有一个距离非常近(高质量)。


LOD – three.js中文文档 (yanhuangxueyuan.com)


如下代码添加物体到场景中时,使用LOD进行添加并设置可见距离

var lod = new THREE.LOD();
// 创建一个基础材质的立方体
function createBoxGeometryBasicMaterialImg() {
  var texture = THREE.ImageUtils.loadTexture("assets/textures/brick-wall.jpg");
  var mat = new THREE.MeshPhongMaterial();
  mat.map = texture;
  // 创建一个立方体并设置大小
  var cubeGeometry = new THREE.BoxGeometry(8, 8, 8);
  var cube = new THREE.Mesh(cubeGeometry, mat);
  // 设置立方体位置
  cube.position.x = -10;
  cube.position.y = 3;
  cube.position.z = 0;
  return cube;
}
// 创建一个基础材质的立方体
function createBoxGeometryBasicMaterial() {
  // 创建一个立方体并设置大小
  var cubeGeometry = new THREE.BoxGeometry(14, 14, 4);
  // MeshBasicMaterial(基础材质不会对光源有反应只会使用指定的颜色渲染)
  var cubeMaterial = new THREE.MeshBasicMaterial({
    color: 0xff0000,
  });
  var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
  // 设置立方体位置
  cube.position.x = -5;
  cube.position.y = 10;
  cube.position.z = -30;
  return cube;
}
// 创建一个球形几何体
function createSphereGeometryLambertMaterial() {
  var textureLoader = new THREE.TextureLoader();
  // 创建一个球体
  var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
  var cubeMaterial = new THREE.MeshStandardMaterial({
    map: textureLoader.load("assets/textures/brick-wall.jpg"),
  });
  // cubeMaterial.map.wrapS = THREE.RepeatWrapping;
  // cubeMaterial.map.wrapT = THREE.RepeatWrapping;
  var sphere = new THREE.Mesh(sphereGeometry, cubeMaterial);
  // 位置范围
  sphere.position.x = 20;
  sphere.position.y = 4;
  sphere.position.z = 2;
  return sphere;
}
// 将立方体添加到场景中
var cube = createBoxGeometryBasicMaterial();
lod.addLevel(cube, 200);
// 将立方体添加到场景中
var cube_img = createBoxGeometryBasicMaterialImg();
lod.addLevel(cube_img, 100);
// 将球体添加到场景中
var sphere = createSphereGeometryLambertMaterial();
lod.addLevel(sphere, 300);
scene.add(lod);
function renderScene() {
  orbit.update();
  lod.update(camera)
  // 使用requestAnimationFrame函数进行渲染
  renderer.render(scene, camera);
  requestAnimationFrame(renderScene);
}


需要学习案例、素材、模型,请进入博客首页查看其他文章或者留言

目录
相关文章
|
1月前
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
56 1
Threejs用切线实现模型沿着轨道行驶
|
5月前
|
存储 编解码 定位技术
技术心得:墨卡托投影、地理坐标系、地面分辨率、地图比例尺
技术心得:墨卡托投影、地理坐标系、地面分辨率、地图比例尺
125 0
|
3月前
|
编解码 定位技术
航摄比例尺、成图比例尺、地面分辨率与航摄设计用图比例尺
航摄比例尺、成图比例尺、地面分辨率与航摄设计用图比例尺
175 0
|
3月前
|
机器学习/深度学习
第5章-着色基础-5.2-光源
第5章-着色基础-5.2-光源
26 0
|
3月前
|
算法 定位技术 图形学
矢量线的一种栅格化算法
矢量线的一种栅格化算法
22 0
|
传感器
使用校准相机测量平面物体
使用校准相机测量平面物体。
143 0
|
6月前
|
算法
[Halcon&几何] 矩形顶点和对角连线角度计算
[Halcon&几何] 矩形顶点和对角连线角度计算
130 0
webgl图形变换、投影与摄像机
入坑webgl,从图形变换、投影与摄像机开始,基操学得好,以后才能怎么炫酷怎么来~快快快,点进来~~
webgl图形变换、投影与摄像机
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
396 0