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);
}


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

目录
相关文章
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现下雨,下雪,阴天,晴天,火焰
2389 0
Threejs实现下雨,下雪,阴天,晴天,火焰
|
11月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
3054 2
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
3207 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
人工智能 JSON 安全
AI提示词入门教程
前言 在当前的信息时代,人工智能(AI)已成为我们日常生活和工作中不可或缺的一部分。尤其是在处理语言和文本的应用中,AI的效率和能力已经展现出巨大潜力。然而,要充分利用AI的能力,有效地与之交互是关键。本文旨在探讨如何通过合适的提示词来指导AI,以确保任务的准确性和效率。我们将重点讨论基本原则和技巧,这些内容对于任何希望通过AI实现特定目标的用户都是极其有用的。
1095 0
|
11月前
Threejs中导入GLTF模型克隆后合并
这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。
426 2
Threejs中导入GLTF模型克隆后合并
|
11月前
threeJs用精灵模型Sprite实现下雨效果
这篇文章介绍了使用Three.js中的Sprite(精灵)模型来实现下雨特效的方法和技术细节。
429 2
threeJs用精灵模型Sprite实现下雨效果
|
11月前
Three添加天空盒子
这篇文章详细说明了如何在Three.js中添加天空盒(Skybox)以增强3D场景的真实感和沉浸体验。
431 6
Three添加天空盒子
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
1924 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
11月前
|
前端开发
ThreeJs通过canvas和Sprite添加标签
这篇文章介绍了在Three.js中利用Canvas和Sprite实现动态文本标签的方法,使得标签可以跟随模型并在3D空间中始终保持面向摄像机。
508 0
ThreeJs通过canvas和Sprite添加标签
|
11月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5189 2
WebAssembly:让前端性能突破极限的秘密武器