BabylonJS 6.0文档 Deep Dive 摄像机(六):遮罩层和多相机纹理

1. 使用遮罩层来处理多个摄影机和多网格物体

LayerMask是分配给每个网格(Mesh)和摄像机(Camera)的一个数。它用于位(bit)级别用来指示灯光和摄影机是否应照射或显示网格物体。默认值为0x0FFFFFFF,处于此值的情况下,网格会被任何备用灯光和相机照亮和显示。为了确定相机是否看到网格物体,执行一个逐位AND运算,并将结果与零进行比较:

mesh.layerMask & camera.layerMask !== 0

该功能主要在多个摄像机的场景下使用。如果希望网格物体在屏幕上始终可见且可拾取,例如按钮,则可以在场景中添加第二个摄像机和灯光,以专门显示和照亮它。

如果你需要第二个摄像头只能看到按钮。该按钮应仅显示一次。

请注意,默认的 layerMask 从前 4 位是 0 或 off。如果第二个摄像头和按钮都具有具layerMask且值为以下4个中的一个,则第二个摄像头将只能看到该按钮:

  • 0x10000000
  • 0x20000000
  • 0x40000000
  • 0x80000000

还应注意,任何人都无法看到一个layerMask为0的网格物体。这可能对隐藏事物有用。 

设置多相机:

if (scene.activeCameras.length === 0){scene.activeCameras.push(scene.activeCamera);
}
var secondCamera = new Babylon.Camera(...);
secondCamera.layerMask = 0x10000000;
scene.activeCameras.push(secondCamera);var Button = new BABYLON.Mesh(...);
Button.layerMask = 0x10000000;

如需要关注更多遮罩层的信息,点击这里。

2. 灯光

除非第二个摄像机能看到的网格材料是纯自发光的,否则他们之间仍然会相互影响,造成一些意料崴的问题。若要防止此类情况,需要遍历所有光源并设置 excludeWithLayerMask 值为0x10000000:

for (let i = scene.lights.length - 1; i >= 0; i--) {scene.lights[i].excludeWithLayerMask = 0x10000000;
}

然后使“按钮”亮起:

var light = new BABYLON.Light(...);
light.includeOnlyWithLayerMask = 0x10000000;

最后,如果以后可能会加入更多的灯光,则可以在添加灯光时注册回调:

scene.onNewLightAdded = onNewLight;
onNewLight = function(newLight, positionInArray, scene) {newLight.excludeWithLayerMask = 0x10000000;
};

3. 案例:做一个瞄准镜

这是一个使用显示枪支瞄准器的第二正交相机的简单示例。为了简单起见,使用了发光材料来避免被照亮。只需将其复制并粘贴到任何场景中,然后调用它即可。所选的 layerMask 还允许 Babylon 的 对话框进行互操作。也许这些可以结合起来,用测距仪做一个平视坦克瞄准器。

从商业化应用的质量考虑,可能不会使用 CreateBox(),因为它会创建无论如何都无法直接看到的深度面。它还应该考虑窗口大小的变化,除非它是平板电脑应用程序。

function addGunSight(scene) {if (scene.activeCameras.length === 0) {scene.activeCameras.push(scene.activeCamera);}const secondCamera = new BABYLON.FreeCamera("GunSightCamera", new BABYLON.Vector3(0, 0, -50), scene);secondCamera.mode = BABYLON.Camera.ORTHOGRAPHIC_CAMERA;secondCamera.layerMask = 0x20000000;scene.activeCameras.push(secondCamera);meshes = [];const h = 250;const w = 250;const y = BABYLON.MeshBuilder.CreateBox("y", { size: h * 0.2 }, scene);y.scaling = new BABYLON.Vector3(0.05, 1, 1);y.position = new BABYLON.Vector3(0, 0, 0);meshes.push(y);const x = BABYLON.MeshBuilder.CreateBox("x", { size: h * 0.2 }, scene);x.scaling = new BABYLON.Vector3(1, 0.05, 1);x.position = new BABYLON.Vector3(0, 0, 0);meshes.push(x);const lineTop = BABYLON.MeshBuilder.CreateBox("lineTop", { size: w * 0.8 }, scene);lineTop.scaling = new BABYLON.Vector3(1, 0.005, 1);lineTop.position = new BABYLON.Vector3(0, h * 0.5, 0);meshes.push(lineTop);const lineBottom = BABYLON.MeshBuilder.CreateBox("lineBottom", { size: w * 0.8 }, scene);lineBottom.scaling = new BABYLON.Vector3(1, 0.005, 1);lineBottom.position = new BABYLON.Vector3(0, h * -0.5, 0);meshes.push(lineBottom);const lineLeft = BABYLON.MeshBuilder.CreateBox("lineLeft", { size: h }, scene);lineLeft.scaling = new BABYLON.Vector3(0.01, 1, 1);lineLeft.position = new BABYLON.Vector3(w * -0.4, 0, 0);meshes.push(lineLeft);const lineRight = BABYLON.MeshBuilder.CreateBox("lineRight", { size: h }, scene);lineRight.scaling = new BABYLON.Vector3(0.01, 1, 1);lineRight.position = new BABYLON.Vector3(w * 0.4, 0, 0);meshes.push(lineRight);const gunSight = BABYLON.Mesh.MergeMeshes(meshes);gunSight.name = "gunSight";gunSight.layerMask = 0x20000000;gunSight.freezeWorldMatrix();const mat = new BABYLON.StandardMaterial("emissive mat", scene);mat.checkReadyOnlyOnce = true;mat.emissiveColor = new BABYLON.Color3(0, 1, 0);gunSight.material = mat;
}

瞄准镜的示例

使用此处的信息并将其与上一节中的Viewpoint信息相结合,我们可以创建一个更复杂的示例,其中包括从特定摄像机中省略网格的选项。

画中画的示例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JOSEF约瑟 过电流继电器 JL15-1200/11 一开一闭 吊车起重机交直流可用

系列型号 JL15-/11: JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL1…

code server安装使用教程

1. 安装 1.1. 下载code-server安装包 类似这种文件:code-server-3.10.2-linux-amd64.tar.gz 解压:tar -xvf code-server-3.10.2-linux-amd64.tar.gz 1.2 (可选)建立软连接 ln -s path/to/code-server-3.10.2-linux-amd64/bin…

音频前置放大器电路图大全

音频前置放大器电路图(一) 在本设计中,前置放大器的增益控制采用直流音量控制方式,其具体实现如图1所示。前置放大器是由全差分运放和电阻构成的反相比例放大器,其增益由反馈电阻与输人电阻的比值决定。外部输人的直流…

铅酸电池废液处理需要哪些工艺设备

铅酸电池废液处理是一项非常重要的环保任务。为了保护环境和人类的健康,我们需要采取一系列工艺设备来处理这些废液。那么,到底需要哪些设备呢?让我们深入探讨一下吧。 首先,废液处理的第一步是预处理阶段。在这个阶段&#xff0c…

华为数通方向HCIP-DataCom H12-831题库(判断题:101-120)

第101题 路由协议通过Hello报文就可以检测到故障,所以不需要BFD 正确 错误 答案: 错误 解析: Hello机制是可以检测到网络故障,但是效率太低,平常会结合BFD来快速检测故障机制,能够实现快速故障检测。 第102题 VXLAN采用Mac in TCP封装方式将二层报文用三层协议进行封装 …

【CANoe使用大全】——Trace窗口

文章目录 1.Trace作用2.Trace窗口打开方式2.1.Analysis—>Trace2.2.Measurement Setup ------> Trace 3.Trace窗口菜单栏介绍3.1. Detail View3.1. Statistic View3.3.Difference view3.4.Predefined filter3.5.Analysis filter3.6.其他过滤方式 4. 其他窗口介绍5. 报文保…

阿里巴巴Java开发手册(详尽版)

点击下载 阿里巴巴Java开发手册

【RabbitMQ】延迟队列之死信交换机

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《RabbitMQ实战》。🎯🎯 &am…

前端学习生产环境、开发环境、测试环境

1、路径 定义是什么环境 NODE_ENVdevelopment 开发环境 2、.env 端口号 3、.env.development 开发环境 4、.env.production 生产环境 5、.env.test 测试环境 6、如何访问,通过process.env进行访问 学习中.......

简化java代码:mapstruct + 策略模式

目录 目的 准备 注意 相同类型-属性名不同 实体类 映射 使用 验证-查看实现类 测试 不同类型(策略模式) 实体类 映射 工具类 使用:对象拷贝 验证-查看实现类 测试 使用:集合拷贝 测试 策略模式说明 准备-依赖 目的 简化 BeanUtils.…

Axios取消请求:AbortController

AbortController AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。 核心逻辑是:利用AbortController接口的只读属性signal标记fetch请求;然后在需要取消请求的时候&#xff0…

python算法与数据结构---单调栈与实践

单调栈 单调栈是一个栈,里面的元素的大小按照它们所在栈的位置,满足一定的单调性; 性质: 单调递减栈能找到左边第一个比当前元素大的元素;单调递增栈能找到左边第一个比当前元素小的元素; 应用场景 一般用…

微信小程序登录获取手机号教程(超详细)

1. 背景介绍: 在我们开发微信小程序时,登录时,需要获取用户手机号作为唯一标识,下面我介绍一下获取手机号的教程。 本篇文章介绍后端获取方法: 前端工作 后端工作 前端 新建Page页面,在xxx.wxml中加入…

Shell脚本④循环语句for、while、until

目录 一.for 1. 九九乘法表 2.求1到10奇数和 3.累计加到100 (1)方法一 (2)方法2 二.while 1.猜价格小游戏 2.累加到100的方法三 三.until循环 1.累加到100方法四 四.嵌套循环 五.循环语句中break、exit和continue 1…

Leetcode:二分搜索树层次遍历

题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例: 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,…

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)

一:前期准备: 1.1:注册阿里云账号,开启对象存储oss功能,创建一个bucket(百度教程多的是,跟着创建一个就行,创建时注意存储类型是标准存储,读写权限是公共读)…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(24)-Fiddler如何优雅地在正式和测试环境之间来回切换-中篇

1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 (1)已发布线上…

YOLOv8改进 | Conv篇 | 利用DualConv二次创新C2f提出一种轻量化结构(轻量化创新)

一、本文介绍 本文给大家带来的改进机制是利用DualConv改进C2f提出一种轻量化的C2f,DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合33和11的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积…

JavaScript基础之输入输出与变量常量详解

输入和输出 输出和输入也可理解为人和计算机的交互,用户通过键盘、鼠标等向计算机输入信息,计算机处理后再展示结果给用户,这便是一次输入和输出的过程。 举例说明:如按键盘上的方向键,向上/下键可以滚动页面&#x…

unity 装饰器模式(实例详解)

文章目录 简介1. **组件装饰器(Component Decorators)**:2. **游戏对象特效装饰器(GameObject Effects Decorator)**:3. **输入处理装饰器(Input Handling Decorators)**:4. **性能优化装饰器(P…