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

【Three】EdgesGeometry 和 wireframe 详细对比及使用说明

在 Three.js 中,EdgesGeometry生成的线条数量通常比直接在材质上启用wireframe: true更少,原因在于两者的实现机制不同。以下是详细解释和对比:


摘要:本文从底层机制出发,对比了 Three.js 中两种常见线框方案——材质wireframe: trueEdgesGeometry——在渲染线条数量、灵活性及性能上的差异,并结合角度阈值 (thresholdAngle) 给出直观对比与完整代码示例。

1.wireframe: true的线条数量

当在材质中启用wireframe时,Three.js 会渲染几何体的所有三角面边线。例如:

  • 立方体BoxGeometry)默认由 6 个面组成,每个面由 2 个三角形拼接而成,因此会有12 个三角形
  • 每个三角形有 3 条边线,但相邻三角形共享边线,所以实际渲染的边线数量为12 条边(与EdgesGeometry相同)。
  • 但对于更复杂的几何体(如细分后的球体或圆柱体),wireframe会渲染所有三角面的边线,导致线条数量爆炸式增长。
// wireframe 模式会渲染所有三角面的边线constmaterial=newTHREE.MeshBasicMaterial({color:0x0000ff,wireframe:true// 启用线框模式});

2.EdgesGeometry的线条数量

EdgesGeometry通过分析几何体的共享边(即相邻面之间不共面的边),提取出“真正的轮廓线”:

  • 对于立方体,它只会提取12 条边(与wireframe相同)。
  • 但对于复杂几何体(如平滑的球体或细分后的模型),它会过滤掉共面的边,仅保留“硬边”,因此线条数量显著减少
// 使用 EdgesGeometry 提取非共面的边constedges=newTHREE.EdgesGeometry(geometry,15);// 第二个参数是角度阈值(单位:度)constline=newTHREE.LineSegments(edges,lineMaterial);

3. 关键区别

特性wireframe: trueEdgesGeometry
线条来源所有三角面的边线非共面的边(通过角度阈值过滤)
复杂度控制无法控制,完全依赖三角面数量可通过角度阈值 (thresholdAngle) 调整
适用场景简单几何体或需要完全线框的情况需要简洁轮廓或复杂几何体
性能线条数量多,性能较差线条数量少,性能更优

4. 角度阈值 (thresholdAngle)

通过调整EdgesGeometry的第二个参数(角度阈值),可以控制哪些边被视为“硬边”:

  • 角度阈值默认是 15 度,表示相邻面的法线夹角超过 15 度时,边会被保留。
  • 增大阈值(如30):减少线条数量(仅保留明显不共面的边)。
  • 减小阈值(如1):增加线条数量(保留更多细节)。
// 示例:调整角度阈值为 30 度constedges=newTHREE.EdgesGeometry(geometry,30);

5. 直观对比(以球体为例)

  • wireframe: true

  • EdgesGeometry


6. 完整代码示例

// 创建蓝色立方体constgeometry=newTHREE.BoxGeometry(1,1,1);constmaterial=newTHREE.MeshPhongMaterial({color:0x0000ff});constcube=newTHREE.Mesh(geometry,material);scene.add(cube);// 使用 EdgesGeometry 添加黑色轮廓constedges=newTHREE.EdgesGeometry(geometry,15);// 角度阈值 15 度constlineMaterial=newTHREE.LineBasicMaterial({color:0x000000,linewidth:2});constwireframe=newTHREE.LineSegments(edges,lineMaterial);scene.add(wireframe);

总结

  • 需要简洁轮廓时:使用EdgesGeometry,通过角度阈值控制线条数量。
  • 需要完整线框时:使用wireframe: true,但需注意性能问题。
http://www.jsqmd.com/news/1101201/

相关文章:

  • openEuler/CCA完全指南:从硬件隔离到远程证明的终极安全方案
  • 抖音动态监控助手:实时检测博主更新与开播推送
  • Dism++:Windows系统维护的深度解析与技术实践指南
  • Python+Appium移动端自动化测试:从环境搭建到CI/CD实战
  • 2026迪庆黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • Token 账单的隐形刺客:LLM 推理成本监控体系的设计与实现
  • 大模型下测试方案改进探讨
  • GEO生成幻觉全链路抑制:从原理到三层拦截技术实操指南
  • 字符叠加 错漏重码日期喷码自动剔除
  • [特殊字符]加拿大电商必看,最后一公里攻略[特殊字符]
  • Scrcpy Server端事件注入实战:如何用反射调用InputManager实现Android远程控制
  • 移动应用渗透测试实战:从客户端到服务端的安全攻防剖析
  • 别再傻傻分不清了!UCIe协议栈里的DLP和DLLP到底啥关系?
  • GNSS数据处理避坑指南:手把手教你读懂并应用天线相位中心改正文件(.atx)
  • YOLO+卡尔曼滤波:从原理到实践,构建稳定目标跟踪系统
  • 研发效率翻倍:搭个企微合规流转通道,让团队经验自动变成本地案例库
  • VMware Workstation NAT模式端口映射失效深度复盘(附Wireshark抓包验证流程)
  • YOLO-Master:基于MoE架构的目标检测模型部署与性能测试指南
  • 3步搞定B站视频转文字:AI神器快速上手指南
  • HarmonyOS技术精讲-Form Kit(卡片开发服务)第2篇:搭建ArkTS卡片开发环境与创建第一个卡片
  • 别再乱用iPerf3的-P参数了!一个参数搞懂TCP/UDP打流瓶颈在哪
  • 告别环境卡壳!macOS下Claude Code从0到1安装与API模型连接
  • GEO词库迭代的RAG适配机制与全域语义稳定方案
  • 计算机毕业设计之基于web的房屋租赁管理系统
  • 微前端架构落地实战:用qiankun轻松拆分巨石应用
  • 库存扣减的并发难题:超卖·悲观锁·乐观锁·Redis 预扣减 4 种方案实战
  • 2026企业级AI接口统一调度平台实测排行 | 专业选型指南(避坑+成本对比)
  • 从2D到3D:WINNER+信道模型如何用仰角信息提升无线仿真精度(附场景参数对比)
  • 从纠错到5G:卷积码与维特比译码是如何塑造现代通信的?
  • VMware多机通信故障排查:7种常见组网失败场景及秒级修复方案