学习threejs,网格深度材质MeshDepthMaterial

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • 1.1 ☘️网格深度材质MeshDepthMaterial简介
  • 二、🍀实现网格深度材质MeshDepthMaterial效果
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中使用网格深度材质MeshDepthMaterial,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️网格深度材质MeshDepthMaterial简介

THREE.MeshDepthMaterial 是 Three.js 中的一种特殊材质类型,主要用于绘制场景中物体的深度信息。这种材质仅渲染网格对象的深度值,而不渲染颜色或其他表面属性。THREE.MeshDepthMaterial 通常用于深度遮挡(occlusion)计算、阴影投射(shadow casting)以及其他需要深度信息的场景。

构造函数
new THREE.MeshDepthMaterial(parameters) 接受一个包含材质属性的对象参数 parameters。

常用属性
THREE.MeshDepthMaterial 继承自 THREE.Material,并具有以下一些特定的属性:
color:基础颜色,默认为白色(0xffffff)。虽然这个属性存在,但是在 THREE.MeshDepthMaterial 中不起作用。
opacity:材质的全局透明度,默认为 1(不透明)。虽然这个属性存在,但是在 THREE.MeshDepthMaterial 中不起作用。
transparent:是否开启透明模式,默认为 false。虽然这个属性存在,但是在 THREE.MeshDepthMaterial 中不起作用。
side:指定材质在哪一面渲染,可以是 THREE.FrontSide(正面)、THREE.BackSide(背面)或 THREE.DoubleSide(双面)。
wireframe:是否启用线框模式,默认为 false。
visible:是否渲染该材质,默认为 true。
depthTest:是否进行深度测试,默认为 true。
depthWrite:是否写入深度缓冲区,默认为 true。
blending:混合模式,默认为 THREE.NoBlending。由于 THREE.MeshDepthMaterial 不渲染颜色,所以混合模式在这个材质中不起作用。
vertexColors:是否启用顶点颜色,默认为 THREE.NoColors。虽然这个属性存在,但是在 THREE.MeshDepthMaterial 中不起作用。
flatShading:是否使用平滑着色,默认为 false。如果设置为 true,则每个面片都将使用平均法线。此属性可能影响深度值的计算。

二、🍀实现网格深度材质MeshDepthMaterial效果

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt
  • 4、加载几何模型:创建THREE.MeshDepthMaterial网格深度材质,循环创建CubeGeometry立方体并使用THREE.MeshDepthMaterial网格深度材质,创建THREE.AxisHelper坐标辅助工具,Scene场景加入以上几何体和工具。
  • 6、加入controls控制、gui,加入stats监控器,监控帧数信息

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn18(网格深度材质MeshDepthMaterial)</title>
    <script src="https://johnson2heng.github.io/three.js-demo/lib/three-v60.js"></script>
    <!--<script src="lib/threejs/127/three.js-master/build/three.js"></script>-->
    <script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script>
</head>
<style>
    body {
        margin: 0;
    }

    canvas {
        width: 100%;
        height: 100%;
        display: block;
    }
</style>
<body onload="draw()">
</body>
<script>
  var renderer
  var initRender = () => {
    renderer = new THREE.WebGLRenderer({antialias: true, alpha: true})
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.setClearColor(0x000000)
    // renderer.shadowMap.enabled = true
    document.body.appendChild(renderer.domElement)
  }
  var scene
  var initScene = () => {
    scene = new THREE.Scene()
    // scene.background = new THREE.Color(0x050505)
  }
  var camera
  var initCamera = () => {
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.set(0, 40, 100)
    camera.lookAt(new THREE.Vector3(0, 0, 0))
  }
  var stats
  var initStats = () => {
    stats = new Stats()
    document.body.appendChild(stats.dom)
  }
  var initModel = () => {
    var helper = new THREE.AxisHelper(10)
    scene.add(helper)

    var cubeGeometry = new THREE.CubeGeometry(25, 25, 25)
    var cubeMaterial = new THREE.MeshDepthMaterial()
    for (var i = 0; i < 3000; i++) {
      var cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
      // cube.position.set(800 * ( 2.0 * Math.random() - 1.0 ), 800 * ( 2.0 * Math.random() - 1.0 ), 800 * ( 2.0 * Math.random() - 1.0 ))
      cube.position.x = 800 * (2.0 * Math.random() - 1.0)
      cube.position.y = 800 * (2.0 * Math.random() - 1.0)
      cube.position.z = 800 * (2.0 * Math.random() - 1.0)
      cube.rotation.x = Math.random() * Math.PI
      cube.rotation.y = Math.random() * Math.PI
      cube.rotation.z = Math.random() * Math.PI
      cube.castShadow = true
      cube.updateMatrix()
      scene.add(cube)
    }
  }
  var controls
  var initControls = () => {
    controls = new THREE.OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
    controls.minDistance = 50
    controls.maxDistance = 200
  }
  var render = () => {
    renderer.render(scene, camera)
  }
  //初始化dat.GUI简化试验流程
  var gui

  function initGui() {
    //声明一个保存需求修改的相关数据的对象
    controls = {}
    var gui = new dat.GUI()
  }

  var onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    render()
    renderer.setSize(window.innerWidth, window.innerHeight)
  }
  var animate = () => {
    render()
    stats.update()
    // if (camera.near = 0.1) {
    //   camera.near += 100
    //   camera.updateProjectionMatrix();
    // }
    // controls.update()
  }
  var draw = () => {
    initRender()
    initScene()
    initCamera()
    initModel()
    initGui()
    initStats()
    // initControls()

    animate()

    window.onresize = onWindowResize
  }
</script>
</html>

效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】栈和队列

文章目录 一.栈1.1定义 顺序栈和链式栈1.2基本操作1.2.1表示1.2.2初始化1.2.3清空1.2.4销毁1.2.5入栈1.2.6出栈1.2.7取栈顶 1.3共享栈1.3.1定义1.3.2进栈出栈 二.队列2.1定义 顺序队列和链式队列循环队列2.2基本操作2.2.1初始化2.2.2判空2.2.3求队列长度2.2.4取队头元素2.2.5销…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

我谈Sobel算子与高斯一阶微分的关系

现在算力提升了&#xff0c;最常用的一阶差分边缘检测算子已经不是Sobel算子了&#xff0c;而是高斯一阶微分。 高斯一阶微分 顾名思义&#xff0c;高斯函数的一阶导数。 Derivative of Gaussian 1D 一维直接扩展到二维。 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面…

【python爬虫】携程旅行景点游客数据分析与可视化

一.选题背景 随着旅游业的快速发展&#xff0c;越来越多的人选择通过互联网平台预订旅行产品&#xff0c;其中携程网作为国内领先的在线旅行服务提供商&#xff0c;拥有大量的旅游产品和用户数据。利用爬虫技术可以获取携程网上各个景点的游客数据&#xff0c;包括游客数量、游…

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

四、Spring Boot集成Spring Security之认证流程

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…

锥线性规划【分布鲁棒、两阶段鲁棒方向知识点】

1 锥线性对偶理论 本部分看似和分布鲁棒、两阶段鲁棒优化没什么关系&#xff0c;但值得优先学习&#xff0c;原因将在最后揭晓。 二阶锥 二阶锥&#xff08;second-order cone&#xff0c;又称ice-cream/Lorentz cone&#xff09;的形式为&#xff1a; 非负象限锥 半正定锥 …

【工具变量】上市公司企业广告支出数据(2007-2023年)

一、测算方式&#xff1a;具体而言&#xff0c;参照 Lu 等&#xff08;2022&#xff09;的研究&#xff0c;本文通过上市公司财务报表附注获取每家上市公司每年销售费用明细项目&#xff0c;筛选出广告费、广告宣传费、广告推广费、广告策划费、广告展览费等与广告支出相关的项…

【Git】基本操作+分支管理

Git基本操作 Git仓库创建 Git仓库的基本认知 Git仓库就是一个用来跟踪和管理项目文件变化的地方&#xff0c;其记录了所有的修改历史&#xff0c;可以回退到之前的任何一个历史版本 工作区&#xff1a;正在进行实际操作的文件夹暂存区&#xff1a;临时保存想要提交修改的区域…

美国处方利用数据库查询方法

众所周知&#xff0c;药物的处方利用数据一直是评估药品市场渗透率、患者用药习惯以及药品普及程度的重要依据&#xff0c;也是监管机构评估医疗补助计划效率和效果的重要指标&#xff0c;而对于医药企业而言&#xff0c;了解药物的处方利用情况&#xff0c;可以助力他们更好对…

tensorflow入门案例手写数字识别人工智能界的helloworld项目落地1

参考 https://tensorflow.google.cn/?hlzh-cn https://tensorflow.google.cn/tutorials/keras/classification?hlzh-cn 项目资源 https://download.csdn.net/download/AnalogElectronic/89872174 文章目录 一、案例学习1、导入测试和训练数据集&#xff0c;定义模型&#xff…

树莓派应用--AI项目实战篇来啦-13.OpenCV摄像头云台人脸追踪

1. OpenCV 舵机云台人脸追踪介绍 本项目内容和前面学习的云台追踪物体是一样的原理&#xff0c;只是这里把追踪物体修改成追踪人脸&#xff0c;在前面的内容中&#xff0c;我们已经学习了二维云台的物体追踪&#xff0c;理解了二维云台对物体追踪的PID控制模型&#xff0c;在本…

vue+leaflet示例:克里金插值渲染显示(附源码下载)

demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本:14.19.1。运行工具&#xff1a;vscode或者其他工具。配置方式&#xff1a;下载demo源码&#xff0c;vscode打开&#xff0c;然后顺序执行以下命令&#xff1a; (1)下载demo环境依赖…

车易泊车位管理相机 —— 智能管理,停车无忧

在现代城市生活中&#xff0c;停车问题一直是困扰着车主和城市管理者的难题。车位难找、停车管理混乱等问题不仅浪费了人们的时间和精力&#xff0c;也影响了城市的交通秩序和形象。而车易泊车位管理相机的出现&#xff0c;为解决这些问题提供了一种高效、智能的解决方案。 一、…

120多套各种类别微信小程序模板源码

微信小程序是一种轻量级的应用开发平台&#xff0c;由腾讯公司推出&#xff0c;主要应用于移动端&#xff0c;为用户提供便捷的服务体验。本资源包含120套微信小程序的源码&#xff0c;对于开发者来说是一份宝贵的参考资料&#xff0c;可以用来学习、研究或者作为开发新项目的起…

Redux与Redux-thunk详解

Redux与Redux-Thunk中间件的工作原理是Redux状态管理库中的核心概念&#xff0c;它们共同协作以实现复杂应用中的状态管理和异步操作。以下是它们的工作原理的详细解释&#xff1a; Redux的工作原理 Action&#xff1a; Action是Redux中的基本单位&#xff0c;它是一个描述要…

类和对象的认识

类&#xff1a;类是用来描述一个对象的&#xff0c;在java中万物皆对象&#xff0c;通过对类的抽象&#xff0c;类有哪些属性和行为&#xff0c;将这些抽象出来就是类。比如&#xff1a;狗&#xff0c;有名字&#xff0c;年龄&#xff0c;要吃饭的行为等等&#xff0c;将这些动…

iframe的使用详解

目录 一、基本概念和语法 二、优点 1.内容整合与复用&#xff1a; 2.独立的浏览环境&#xff1a; 3.跨域数据展示&#xff1a; 三、缺点 1.可访问性问题&#xff1a; 2.性能问题&#xff1a; 3.安全风险&#xff1a; 四、替代方案 1.使用JavaScript框架进行组件化开…

5G AMR市场调研:前五大厂商占比大约有58.7%的市场份额

5G AMR是指利用5G网络技术来增强移动机器人的通信和控制能力。它结合了高速低延迟的5G通信特性&#xff0c;支持实时数据传输和远程操作&#xff0c;以提升移动机器人在工业自动化和服务领域的应用效率和灵活性。通过5G AMR&#xff0c;机器人可以更快速地响应指令、处理数据&a…