基于 GPU 渲染的高性能空间包围计算

空间包围检测在计算机图形学、虚拟仿真、工业生产等有着广泛的应用。

现代煤矿开采过程中,安全一直是最大的挑战之一。地质空间中存在诸多如瓦斯积聚、地质构造异常、水文条件不利等隐蔽致灾因素,一旦被触发,可能引发灾难性的后果。因此在安全生产过程中有效的管理和规避各隐蔽致灾因素,有着重要的意义。

通过对煤矿地质空间中各地质因素建模,建立空间数据库,还原地下真实场景,使用计算机图形学进行空间计算,可以实时监测各隐蔽致灾因素的位置和距离,指导安全生产,并进行可视化展示。

空间包围检测有多种方法,比如基于包围盒的检测,三角面碰撞检测等。本文提出了一种基于 GPU 渲染的高效计算方法。

假定待检测球体范围的半径为r。两种检测方法如下:

  • 方法 1:遍历模型所有的点,计算点和球心的距离。如果有距离小于 r,模型在球体范围内。
  • 方法 2:以检测区域的包围盒为正交投影空间,渲染所有需要检测的模型。渲染过程中计算每个渲染点到球心的距离,如果有距离小于r的渲染点,模型在球体范围内。

模型和检测区域有以下几种位置关系:

  • 图 1:模型完全在球体范围内:方法 1 可检测
  • 图 2:模型部分点在球体范围内:方法 1 可检测
  • 图 3:模型点不在球体范围内,部分三角面在球形范围内:方法 2 可检测
  • 图 4:模型不在球体范围内:方法 1 + 2 可检测
  • 图 5:模型完全包含球体范围:模型如果是空心的,方法 1 + 2 可检测模型不在球体范围内。如果需要计算结果是模型在球体范围内,也就是模型是实心的,建模时需要在模型内部加上额外的辅助计算的三角面,用于表达内部信息。此时用方法 1 + 2 可检测模型在球体范围内。

以上方法使用 WebGL 渲染到纹理(Render To Texture) 和 readPixels 功能。图扑 HT for Web SDK 组件库对 WebGL 底层复杂操作做了封装, 为用户省掉了繁琐的底层 WebGL 操作,可以方便快捷的实现正交透视、渲染到纹理和异步 readPixels 等高级 WebGL 功能。

方法 1:点检测法

准备一张 N X N 纹理图 texture1(HT RenderTarget),保证要检测的模型的数量不大于 N X N。每一个模型在纹理上分配一个像素,像素的位置为 (x,y)。

创建点渲染模式着色器程序,实现以下功能:

  • 顶点着色器:检测每个点到球心的距离,将距离是否小于r的信息传给片段着色器。指定的位置 (x,y) 赋给 gl_Position。
  • 片段着色器:如果距离小于 r, 渲染红色,否则不渲染颜色。

JavaScript 程序遍历每一个待检测模型,将模型的顶点和模型在纹理上的位置 (x,y) 通过 attribute 和 uniform 传给顶点着色器。所有模型渲染结束后,使用异步 readPixels 将渲染结果读出来。通过判断读取结果里每个像素点颜色值,获得模型是否在球体内部信息。

主要代码:

// 创建渲染材质1
const texture1 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 100, 100);

// 循环渲染所有的模型,结果保存到texture1。
for (let i = 0; i < nodeCount; i++) {
    data = datas[i];
    tModel = getDataMesh(data); // 获取模型网格信息
    // 准备着色器数据
    tModel.mat = model4.mat;
    tModel.matDef[DEFAULT_MAT_NAME] = model4.mat;
    tModel.mat.modelMat = data.getMatrix4().toArray();
    x = i % 100;
    y = Math.floor(i / 100);
    model4.mat.uPos = [x / 100 * 2 - 1 + 1 / 200, 2 * y / 100 - 1 + 1 / 200];
    // 渲染到texture1
    g3d.setViewport(gl, 0, 0, 100, 100);
    g3d.renderModel(texture1, model4, {
        clear: false
    });
}

// 读取检测结果
texture1.readPixelsAsync(0, 0, 100, 100, null, (result) => {
    for (let y = 0; y < 100; y++) {
        for (let x = 0; x < 100; x++) {
            // 遍历像素点,检测是否是红色
            // ......
        }
    }
});

方法 2:面检测法

准备两张纹理贴图 texture1 和 texture2。Texture1 的要求同方法 1。Texture2 默认使用 1000 X 1000 的分辨率。

创建两套着色器。第一套着色器使用三角面渲染:

  • 顶点着色器:正常计算顶点投影信息
  • 片段着色器:检测每一个点到球心的距离,如果小于 r,渲染红色

第二套着色器使用点渲染:

  • 顶点着色器:根据输入的 texture2 坐标(attribute),使用 texture2D 获取对应位置的颜色值,如果是红色,表示模型在球体内部,将此信息传给片段着色器。模型在 texture1 上的位置信息 (x,y) 赋给 gl_Position。
  • 片段着色器:如果距离小于 r, 渲染红色,否则不渲染颜色。

JavaScript 程序遍历每一个模型,使用着色器 1 将结果渲染到 texture2。渲染过程使用正交透视矩阵,视锥是球体的包围盒。JavaScript 将 texture2 (uniform sampler2D)、texture2 每个像素的 x, y位置信息 (attribute)、模型在 texture1 上的位置信息 (uniform) 传给顶点着色器 2。片段着色器 2 将模型是否在球体内的信息渲染到 texture1。所有模型渲染结束后,使用异步 readPixels 将渲染结果读出来。通过判断读取结果里每个像素点颜色值,获得模型是否在球体内部信息。

主要代码:

// 创建渲染材质1,2

const texture1 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 100, 100);

const texture2 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 1000, 1000);


// 循环渲染所有的模型到texture2。texture2信息渲染到texture1

for (let i = 0; i < nodeCount; i++) {

    data = datas[i];

    tModel = getDataMesh(data); // 获取模型网格信息

    // 准备着色器1数据
    tModel.mat = model2.mat;
    tModel.matDef[DEFAULT_MAT_NAME] = model2.mat;
    tModel.mat.modelMat = data.getMatrix4().toArray();

    // 渲染到texture2
    g3d.setViewport(gl, 0, 0, 1000, 1000);
    g3d.renderModel(texture2, tModel, { clear: true });

    // 准备着色器2数据
    model3.mat.uImage = texture2.texture;
    x = i % 100;
    y = Math.floor(i / 100);
    model3.mat.uPos = [x / 100 * 2 - 1 + 1 / 200, 2 * y / 100 - 1 + 1 / 200];

    // 渲染到texture1
    g3d.setViewport(gl, 0, 0, 100, 100);
    g3d.renderModel(texture1, model3, { clear: false });

 }

方法 1 简单快速。但检测结果不准确。方法 2 检测结果准确,但计算过程复杂。实际使用中两种方法结合使用。首先使用方法 1 检测。对于不在球体范围内的模型,再使用方法 2 检测。

如果需要检测椭球体范围或者长方体的范围,可以获取椭球体或长方的变换矩阵,计算获得逆矩阵。将逆矩阵应用于每一个待检测模型的节点。此时只需要检测变换后的模型是否在单位圆或单位立方体内即可。HT SDK 3D 引擎库提供了丰富的数学计算 API,可以非常直观简洁的实现以上功能。

您可以至图扑软件官网查看更多案例及效果:图扑软件 - 构建先进 2D 和 3D 可视化所需要的一切

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

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

相关文章

架构整洁之道-组件构建原则

5 组件构建原则 大型软件系统的架构过程与建筑物修建很类似&#xff0c;都是由一个个小组件组成的。所以&#xff0c;如果说SOLID原则是用于指导我们如何将砖块砌成墙与房间的&#xff0c;那么组件构建原则就是用来指导我们如何将这些房间组合成房子的。 5.1 组件 组件是软件的…

漏洞原理SQL注入 手工注入漏洞

漏洞原理SQL注入 手工注入漏洞 SQL 注入的前置知识 information_schema库information_schema 是mysql5.0以上版本中自带的一个数据库。tables表information_schema库中的tables表中table_schema列&#xff08;存储数据库名&#xff09;和table_name列&#xff08;存储表名&…

慎投!这3本期刊诚信风险高,被警告和风险低的期刊选哪个?

近年来&#xff0c;学术界对学术诚信的关注越来越多&#xff0c;期刊的学术诚信风险也日益受到关注。科睿唯安在今年三月份剔除的35本SCI期刊中&#xff0c;绝大多数涉及学术诚信问题&#xff01;据官方介绍&#xff0c;其已正式开发了一款AI工具&#xff0c;可以锁定存在学术诚…

R-YOLO

Abstract 提出了一个框架&#xff0c;名为R-YOLO&#xff0c;不需要在恶劣天气下进行注释。考虑到正常天气图像和不利天气图像之间的分布差距&#xff0c;我们的框架由图像翻译网络&#xff08;QTNet&#xff09;和特征校准网络&#xff08;FCNet&#xff09;组成&#xff0c;…

ES 分词器

概述 分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 什么是分词器 顾名思义&#xff0c;文本分析就是把全文本转换成一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。在 ES 中&#xff0c;Ana…

部署一个私有化的博客系统

效果 安装 1.创建目录 mkdir /opt/typecho/usr cd /opt/typecho 2.编写配置文件 vim docker-compose.yml 内容如下 version: 3 services:typecho:image: joyqi/typecho:nightly-php7.4-apachecontainer_name: typechorestart: alwaysenvironment:- TYPECHO_SITE_URLhttp:…

大模型应用开发:为产品创建一个AI客服/智能助手

欢迎阅读本系列文章&#xff01;我将带你一起探索如何使用OpenAI API来开发GPT应用。无论你是编程新手还是资深开发者&#xff0c;都能在这里获得灵感和收获。 本文将继续展示AI助手的开发方式&#xff0c;在OpenAPI中它的名字是Assistants。 什么是Assistants&#xff1f; 在之…

《信息系统项目管理师》备考计划

《信息系统项目管理师》证书价值和作用 信息系统项目管理师证书的价值体现在提升专业知识、助力职业发展、职称评定、技能补贴和人才引进或积分落户等方面。 一方面可以通过系统学习&#xff0c;可以显著提高自己在信息系统项目管理领域的专业水平。方便自己以后向更多的方向…

【思科】 GRE VPN 的实验配置

【思科】GRE VPN 的实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“虚拟专…

路由进阶

文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…

AttributeError: ‘Plotter‘ object has no attribute ‘topicture‘

在以下网址找到自己的pytorch和cuda版本然后点击进入&#xff1a; https://nvidia-kaolin.s3.us-east-2.amazonaws.com/index.html 下载自己系统和python对应的最新版本 使用pip安装 pip install kaolin-0.14.0-cp38-cp38-linux_x86_64.whl

如何使用Everything随时随地远程访问本地电脑搜索文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

力扣日记1.28-【回溯算法篇】93. 复原 IP 地址

力扣日记&#xff1a;【回溯算法篇】93. 复原 IP 地址 日期&#xff1a;2023.1.28 参考&#xff1a;代码随想录、力扣 93. 复原 IP 地址 题目描述 难度&#xff1a;中等 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&…

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

超值福利,全是独家特制版软件,功能超凡且完全免费

闲话休提&#xff0c;直接为您呈现四款神仙级别的软件。 1、我的ABC软件工具箱 这款小巧而强大的批量处理办公助手——我的ABC软件工具箱&#xff0c;不仅界面清爽、无弹窗广告&#xff0c;更重要的是&#xff0c;它完全免费&#xff01;这款工具箱将成为您高效办公的得力助手…

D8: Type com.huazhuokeji.footballpark.BuildConfig is defined multiple times:

D8: Type com.huazhuokeji.footballpark.BuildConfig is defined multiple times: 报错信息如下分析总结 报错信息如下 E:\unityProject\GVoice\Temp\gradleOut\launcher\build\intermediates\project_dex_archive\release\out\com\huazhuokeji\footballpark\BuildConfig.dex:…

获取鼠标点击图片时候的坐标,以及利用html 中的useMap 和area 实现图片固定位置的点击事件

一 编写原因 应项目要求&#xff0c;需要对图片的固定几个位置分别做一个点击事件&#xff0c;响应不同的操作&#xff0c;如下图&#xff0c;需要点击红色区域&#xff0c;弹出不同的提示框&#xff1a; 二 获取点击图片时候的坐标 1. 说明 实现这以上功能的前提是需要确定需…

Dataloader加载数据集

文章目录 回顾Epoch, Batch-Size, Iterations糖尿病 Dataset 构建数据集实现代码DataLoader使用 糖尿病分类预测代码torchvision.datasets练习 练习 回顾 上节课使用全部数据进行训练。 Epoch, Batch-Size, Iterations epoch:训练的总轮次&#xff0c;指所有的训练样本都进…

高分文献解读|乳酸通过与可溶性腺苷酸环化酶结合调控铁代谢

乳酸(LA)的过量产生可能发生在运动期间或者许多疾病中&#xff0c;例如癌症中。个人伴有高乳酸血症的患者常表现为贫血、血清铁减少以及一种铁代谢关键调控因子—铁调素&#xff08;hepcidin&#xff09;升高。然而&#xff0c;目前尚不清楚乳酸是否以及如何调节铁调素的表达。…

C++从初级工程师到中级工程师【个人学习笔记】

目录 1 背景2 要点2.1 内存分区模型2.1.1 程序运行前2.1.2 代码 2.2.1 程序运行后栈区代码 1 背景 从这一章开始&#xff0c;开始学习C的面向对象编程&#xff0c;是C中的核心。 2 要点 2.1 内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&…