当前位置: 首页 > news >正文

【Web端CAD/CAE文字标注】webgl+canvas 2d实现文字标注功能

一、需求背景

在CAD/CAE领域经常会遇到显示节点编号这种需求,效果如下图:
在这里插入图片描述
本文介绍如何在WebGL中实现文字的显示,对于如何在OpenGL中实现请绕路。

二、实现原理

Canvas是HTML5提供的元素,用于在网页上绘制图形,其支持2D与WebGL两种模式。对于canvas 2D擅长绘制基本图形、文字等。webgl擅长3D交互式图形的渲染,常用于游戏、3D模型、GIS、医学图像等领域。本文介绍的其实是对3D模型的标注,是将3D与2D进行结合,各自实现擅长的事。
其核心原理是在网页视图区同时放置两个Canvas,底层canvas使用WebGL,上层canvas使用2d分别绘制,两层canvas叠加实现最终效果。
在这里插入图片描述

两个canvas的放置顺序可使用z-index进行控制。核心原理就这么多,剩下的就是调用API的事了。

三、根据点坐标计算其屏幕位置

进行标注时需先根据点坐标确定其像素位置。这个过程跟GPU图形流水线计算顶点坐标是一样的。一般渲染引擎提供摄像机类,并有接口获取模型-视图-投影矩阵(MVP)。
用MVP矩阵乘以点坐标得到标准设备坐标系(NDC)下点的坐标,原点在屏幕中央,其范围是[-1, 1], 超过这个范围点不会显示在屏幕上。
注意Canvas 2d的API使用的坐标系是屏幕坐标系,其原点在屏幕左上角,X轴朝右,Y轴朝下。所以得到NDC坐标之后需变换到屏幕坐标系下,等价于图形流水线的视口变换。
在这里插入图片描述

变换公式如下:
X = n d c X + 1 2 ∗ v i e w p o r t X X = \frac{ndcX + 1}{2} * viewportX X=2ndcX+1viewportX
Y = − n d c Y + 1 2 ∗ v i e w p o r t Y Y = \frac{-ndcY + 1}{2} * viewportY Y=2ndcY+1viewportY
其中:
v i e w p o r t X viewportX viewportX是屏幕视口宽度
v i e w p o r t Y viewportY viewportY是屏幕视口高度
最后使用Canvas Context 2D的的API在(X,Y)位置绘制字体即可。

http://www.lryc.cn/news/249372.html

相关文章:

  • 对话框、内部控件位置
  • 【GraphQL 】将GraphQL API添加到Postgres数据库的六种简单方法,比较Hasura、Prisma和其他
  • 每日一题(LeetCode)----哈希表--有效的字母异位词
  • 【设计模式】行为型模式-第 3 章第 6 讲【中介者模式】
  • Django 通过 Trunc(kind) 和 Extract(lookup_name) 参数进行潜在 SQL 注入 (CVE-2022-34265)
  • Vue3-toRef 和 toRefs 函数
  • STM32---时钟树
  • 【功能测试】软件系统测试报告
  • CentOS一键安装docker脚本
  • PostGIS学习教程八:空间关系
  • ESP32-Web-Server编程- 通过文本框向 Web 提交数据
  • NAT网络地址转换
  • PyTorch模型训练过程内存泄漏问题解决
  • 【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据
  • pytorch训练模板
  • 代码随想录二刷 |字符串 |反转字符串
  • Rust语言入门教程(九) - 结构体
  • 如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问
  • AI伪原创软件-AI伪原创工具下载
  • 【python脚本】获取OneNET数据写入本地文件
  • 5 存储器映射和寄存器
  • 决策树学习
  • 如何在Ubuntu系统上安装Git
  • Leetcode.974 和可被 K 整除的子数组
  • Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError
  • 鸿蒙系统扫盲(三):鸿蒙开发用什么语言?
  • linux 中vmalloc实现简述
  • homeassistant 随笔
  • 带大家做一个,易上手的家常炒鸡蛋
  • 芒格传奇落幕!生前最后一次谈论比特币,说了什么?