WebGL笔记:图形转面的原理与实现

opengles 绘制图元 ——glDrawArrays() 相关API介绍 (十) 本文主要介绍 opengles3.0 所支持的绘制图元 API 相关接口, 这里主要介绍绘制三角形的接口软硬件环境:硬件:PC软件:ubuntu22.04 opengles3.0opengles3.0 中有5个绘制图元的API 调用,分别是其中目前用的比较多的是前3个 API接口,特别是前2个,用的场景特别多。glDrawArrays是一个OpenGLES函数,用于根据顶点数组中的数据进行绘制。它可以绘制一系列的图元,如点、线、三角形等,这些图元的顶点数据都存储在顶点数组中。 阅读详情

1 )回顾 WebGL 三种面的适应场景

  • TRIANGLES 单独三角形
  • TRIANGLE_STRIP 三角带
  • TRIANGLE_FAN 三角扇
  • 备注
    • 在实际的引擎开发中,TRIANGLES 是用得最多的
    • TRIANGLES 的优势是可以绘制任意模型,缺点是比较费点

2 )适合 TRIANGLES 单独三角形的的模型


  • 比如上述这个不规则图形

3 )TRIANGLE_STRIP 和TRIANGLE_FAN 的优点和缺点

  • TRIANGLE_STRIP 和TRIANGLE_FAN 的优点是相邻的三角形可以共用一条边,比较省点
  • 然而其缺点也太明显,因为它们只适合绘制具备相应特点的模型
  • 适合TRIANGLE_STRIP三角带的模型如下

  • 适合TRIANGLE_FAN三角扇的模型如下

  • 扩展:
    • three.js 使用的绘制面的方式就是TRIANGLES,可以在其 WebGLRenderer 对象的源码的 renderBufferImmediate 方法中查看
      _gl.drawArrays(_gl.TRIANGLES, 0, object.count);
      

4 )图形转面的基本步骤

  • 在three.js 里有一个图形几何体ShapeGeometry,可以把图形变成面。

  • 只要有数学支撑,就可以实现这种效果

5 )使用TRIANGLES 独立三角形的方式,将图形转成面

  • 原理

    • 使用的方法叫做“砍角”
    • 其原理就是从起点将多边形中符合特定条件的角逐个砍掉,然后保存到一个集合里
    • 直到把多边形砍得只剩下一个三角形为止。
    • 这时候集合里的所有三角形就是我们想要的独立三角形。
  • 举个例子


  • 已知:逆时针绘图的路径G

  • 求:将其变成下方网格的方法


  • 求解步骤
    • 1)寻找满足以下条件的 ▲ABC
      • ▲ABC 的顶点索引位置连续,如:012、123、234
      • 比如,012时,A是0,B是1,C是2
      • 点C在向量AB的正开半平面里,可以理解为你站在A点,面朝B点,点C要在你的左手边
      • ▲ABC 中没有包含 路径G 中的其它顶点
    • 2)当找到 ▲ABC 后,就将点B从路径的顶点集合中删掉,并将ABC三个点存入集合中,然后继续往后找。
    • 3)当路径的定点集合只剩下3个点时,就结束。
    • 4)由所有满足条件的 ▲ABC 构成的集合就是我们要求的独立三角形集合。

  • 在上述坐标系示例中,可辅助我们找到C点
  • A是起点,B是第二个点,C则是第三个点,用这个方法,可以看到C点是否在向量AB(A->B)的左手边
  • 砍角的精髓就在于不断消耗B,让图形可砍,逐渐砍完,比如B点是5时满足条件,5被干掉,下一轮砍角就可组 4,6,7 这个三角形
  • 每一轮都是按照顺序(不一定是升序,因为可能从最后一个点x,0,1这样组)找三个点组成一个三角形,判断这个三角形是否符合被砍的标准

  • 上面这个图形, 进一步理解如何判断一个点,比如B,在一个向量OA的左侧还是右侧
    • 从 OA 转到 OB 需要 θ \theta θ 度,如果 这个角度大于零,则B在OA的左侧,反之,则在右侧
    • 如何判断 这个 θ \theta θ 是 大于零 还是 小于零, 有一个算法可以使用:
      • s i n θ ∗ ∣ O A ∣ ∗ ∣ O B ∣ = a x ∗ b y − a y ∗ b x sin \theta * |OA| * |OB| = ax * by - ay * bx sinθ∗∣OA∣∗∣OB∣=ax∗by−ay∗bx
      • 在这个公式中,|OA|, |OB| 都是绝对值,都是 >=0 的,所以,只要后面的 a x ∗ b y − a y ∗ b x > 0 ax * by - ay * bx > 0 ax∗by−ay∗bx>0, 则 s i n θ > 0 sin \theta > 0 sinθ>0, θ > 0 \theta > 0 θ>0
      • 这样就可判断出一个点在向量的哪一侧了

图形转面的实现

1 )绘制路径G

  • 路径G的顶点数据
    const pathData = [
      0, 0,
      600, 0,
      600, 100,
      100, 100,
      100, 500,
      500, 500,
      500, 300,
      300, 300,
      300, 400,
      200, 400,
      200, 200,
      600, 200,
      600, 600,
      0, 600
    ];
    
    • 这一些数据是CSS的顶点数据,走的是CSS的坐标系
    • 画CSS的时候,需要逆时针绘图
    • 在CSS坐标系,水平的是 x轴(向右为正),垂直的是 y轴(向下为正), 原点在左上角

  • 在上图中,就是数据对应的图形,原点 (0, 0) 对应左上角,逆时针绘制出来的
  • 在pathData里两个数字为一组,分别代表顶点的x位和y位
  • pathData里的数据是我以像素为单位画出来的,在实际项目协作中,UI给我们的svg文件可能也是以像素为单位画出来的,这个我们要做好心理准备
  • 因为,webgl画布的宽和高永远都是两个单位
  • 所以,我们要将上面的点画到webgl 画布中,就需要做一个数据映射
WEBGL保姆级教程(十):WebGL高级图形技术之动画效果实现 WebGL动画实现指南:核心原理与实战案例 本文系统讲解了WebGL动画的实现技术,主要包括:1)动画核心原理:通过渲染循环(requestAnimationFrame)连续更新模型状态实现动态效果;2)五大动画类型:变换动画、顶点动画、骨骼动画、粒子动画和状态动画;3)关键技术:时间控制(deltaTime)、插值计算(lerp/slerp)和矩阵变换;4)实战案例:包含立方体复合变换、平面波浪顶点动画和Three.js骨骼动画的实现代码。文章还提供了性能优化建议,如减少绘制调用、使用实例化渲染等,帮助开 阅读详情

相关推荐

学废了系列 - WebGIS vs WebGL图形编程

前工作中有不少涉及到地图的项目,我参加了几次技术评审,前端伙伴们在 WebGIS 方面的知识储备稍有不足,这次分享的主要目的是科普一些在前端领域比较常用的 WebGIS 知识。另外,我之前的工作中积攒了一些从零开始搭建 WebGL 地图引擎的微薄经验,虽然最终遗憾没有上线,但在其中学到的一些WebGL知识还是值得分享一下。WebGL 可以说是前端可视化技术领域难度最大的一项图形编程技术,所以今天就结合 WebGIS 这个话题顺带分享一些 WebGL 的相关知识,不会太深入,很细节的技术点在后续文章里再讲解。

slw213106的博客 4792

WEBGL保姆级教程(九):WebGL高级图形技术之模型加载与渲染

本文详细介绍了WebGL开发中常见的3D模型文件格式及其加载方法。主要内容包括:1) 四种主流模型格式(OBJ、GLTF/GLB、FBX、STL)的特点与适用场景;2) 模型加载的核心流程,从文件解析到WebGL渲染;3) 两种典型实现方案:使用Three.js快速加载glTF模型的案例,以及原生WebGL解析OBJ格式的底层实现;4) 模型加载的注意事项,包括格式转换、跨域问题、性能优化等。文章既提供了高效的Three.js解决方案,又通过原生WebGL实现帮助理解底层原理,适合不同层次的开发者学习3D模

分享知识,拥抱变化 1563

WEBGL保姆级教程(十一):WebGL高级图形技术之交互与用户输入

本文介绍了WebGL交互开发的核心技术与实现方法。主要内容包括:1)WebGL交互原理,通过JavaScript事件捕获用户输入,将2D屏幕坐标转换为3D场景坐标;2)关键实现技术,包括坐标映射、射线检测和常见交互事件处理;3)三个典型交互案例:鼠标控制模型旋转、键盘控制相机移动和鼠标点击选择3D物体;4)性能优化建议,如事件节流、批处理检测和使用WebWorkers;5)开发注意事项,包括坐标系统一致性和移动设备适配等。文章通过完整代码示例,帮助开发者从基础到进阶掌握WebGL交互开发的关键技术。

分享知识,拥抱变化 763

WEBGL入门的基础介绍

目录 WebGL基本介绍 概述 WebGL的特性 图形硬件的介绍 WebGL开发入门 WebGL绘制图形抽象过程 基于WebGL封装的框架 WebGL坐标系基础 视变换 投影变换 视口变换 实例演示(使用ThreeJS) 光照 光照类型 光照的原理(漫反射) 光照的原理(环境反射) 光照效果的对比 纹理映射 图片纹理 凹凸纹理 环境贴图 开发调试与...

Amesteur的博客 2062

JavaScript 与 WebGL:创建 3D 图形与动画

WebGL 是一种基于 JavaScript 的 API,它允许开发者利用用户计算机的图形处理单元(GPU)在网页上绘制和渲染 3D 图形。它基于 OpenGL ES 2.0 规范,这是一个广泛应用于移动设备和嵌入式系统的图形渲染标准。通过 WebGL,网页开发者可以直接访问 GPU 的强大计算能力,实现复杂的 3D 场景渲染,而无需依赖于诸如 Flash 等第三方插件。

数字魔方操控师的博客 348

WebGL入门与实践:构建交互式3D图形体验

WebGL(Web Graphics Library)是一种JavaScript API,用于在不需要插件的情况下在任何兼容的Web浏览器中渲染2D和3D图形。它是OpenGL ES的一个Web版本,使得Web开发人员可以在网页中实现复杂的图形处理,而无需依赖特定平台或插件,如Flash或Java。WebGL的出现,极大地推动了Web平台上的图形应用开发。在确定浏览器支持WebGL之后,开发者可以使用HTML5的<canvas>元素来获取WebGL渲染上下文。getContext。

weixin_42393362的博客 3387

GL_TRIANGLE_STRIP之纹理贴图代码

GL_TRIANGLE_STRIP之纹理贴图代码

【OpenGL】十四、OpenGL 绘制三角形 ( 绘制 GL_TRIANGLE_STRIP 三角形 )

【OpenGL】十四、OpenGL 绘制三角形 ( 绘制 GL_TRIANGLE_STRIP 三角形 | GL_TRIANGLE_STRIP 三角形绘制分析 ) https://hanshuliang.blog.youkuaiyun.com/article/details/112799758 博客源码快照

拆解特斯拉Optimus的关节技术:谐波减速器在仿人机器人中的5个精妙设计

本文深度解析特斯拉Optimus仿人机器人关节中的谐波减速器技术,揭示其五大工程突破:微型化材料革命、两万分之一圈精度实现、碳纤维柔轮轻量化、智能运维系统及国产替代方案。重点探讨谐波减速器如何通过创新设计和先进材料实现精准传动,为仿人机器人提供高效可靠的关节动力解决方案。

omega的博客 1077

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 391

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 527

整车CAN网络错误帧排查方法

本文围绕 CAN 总线错误帧展开,先剖析其产生原因,涵盖物理连接与硬件问题、电磁兼容性问题、总线负载与设计问题及配置问题;再阐述位错误、填充错误等 5 类错误帧类型;接着说明错误帧与总线 BUSOFF 的关系,解析主动 / 被动错误状态及 BUSOFF 的触发与恢复;还结合整车故障案例做实际分析,指出错误帧根源多为线束或控制器问题。最后总结,强调错误帧是 CAN 协议保障高鲁棒性的机制,掌握相关知识助工程师提升 CAN 网络处理能力。

车载网络小D的博客 1250

汽车级智能栅极驱动器深度解析 | 连载03:功能框图与工作模式详解

在前两期连载中,我们分析了DRV871x-Q1的产品架构、引脚配置和电气特性。本期我们将深入探讨DRV871x-Q1的功能框图和工作模式,这是理解芯片内部工作机制的关键。通过分析功能框图,我们能够清晰地了解各功能模块之间的关系和信号流向;通过工作模式分析,我们能够掌握芯片在不同应用场景下的配置方法。这些知识对于系统设计和故障排查都至关重要。

VehSwHwDeveloper的博客 1106

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

bjzhang75的博客 688

飞牛fnNAS个人小账本导入微信账单

本文介绍了将微信支付账单导入ezBookkeeping个人记账系统的详细方法。首先通过微信申请导出账单文件,接收后需进行Excel预处理:删除前导行、添加账户和分类列、整理金额格式等。在ezBookkeeping中需预先设置"微信"分类和账户。导入时需注意列映射关系,包括交易时间、账户名称等关键字段的对应设置。文章还提到处理交易标签、格式转换等细节问题,并建议避免使用"修改余额"功能。该方法同样适用于支付宝账单导入,解决了直接导入可能出现的格式不兼容问题。

dgnankai的专栏 483

高电压技术的面试内容整理(详细版本:57题)

涵盖了高电压技术的关键领域,包括气体放电的物理过程、液体和固体介质的绝缘特性、高压外绝缘的分类与特性、电气设备绝缘试验的方法与原理、电力系统的防雷保护措施,以及内部过电压的产生、影响与限制方法,为理解和应对高电压环境下的电气问题提供了系统的知识框架。通过深入探讨气体放电理论、介质极化与损耗、绝缘子的电气特性、绝缘试验技术、防雷策略以及内部过电压的管理。

weixin_44808274的博客 777

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 数据结构与算法之图: 图及其深度和广度优先遍历实现 (Ts, Py, Go版)
下一篇: 数据结构与算法之图: LeetCode 65. 有效数字 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值