Three.js中自定义UV坐标贴图举例超详细讲解_javascript技巧

文章编号:1005 技术教程 2026-02-04 uv坐标 threejs uv贴图 three.js uv

1、当原始几何体没有 UV 信息

2、当默认 UV 无法满足纹理显示需求

4、材质设置使用了 map(纹理贴图)

纹理可能根本看不到。

或者整个纹理只出现在几何体的一个小角落(默认 UV 不匹配)。

甚至多个面公用同一张纹理,但位置都不对。

在 3D 渲染中,为了将 2D 图片(纹理)映射到 3D 几何体上,需要用到 UV 坐标

const group = topPolygonMesh.object3d; if (!group) return; group.traverse(child => { if (child.isMesh && child.geometry && child.geometry.attributes.position) { const posAttr = child.geometry.attributes.position; const positions = posAttr.array; // 1. 计算 XY 投影平面的包围盒 let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; for (let i = 0; i < positions.length; i += 3) { const x = positions[i]; const y = positions[i + 1]; if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y; }; const width = maxX - minX; const height = maxY - minY; // 2. 根据 bbox 生成新的 UV(按 XY 贴图) const uv = []; for (let i = 0; i < positions.length; i += 3) { const x = positions[i]; const y = positions[i + 1]; const u = (x - minX) / width; const v = (y - minY) / height; uv.push(u, v); }; // 3. 设置新的 UV child.geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2)); child.geometry.attributes.uv.needsUpdate = true; } })

使用你上面的逻辑:

const group = topPolygonMesh.object3d;if (!group) return;group.traverse(child => { if (child.isMesh && child.geometry && child.geometry.attributes.position) {

🔹 找到场景中的所有 Mesh ,确保其包含几何体和位置(顶点)数据。

const posAttr = child.geometry.attributes.position;const positions = posAttr.array;let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;for (let i = 0; i < positions.length; i += 3) { const x = positions[i]; const y = positions[i + 1]; if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y;}const width = maxX - minX;const height = maxY - minY;

📌 获取几何体在 XY 平面上的包围盒

const uv = [];for (let i = 0; i < positions.length; i += 3) { const x = positions[i]; const y = positions[i + 1]; const u = (x - minX) / width; const v = (y - minY) / height; uv.push(u, v);}

📌 将 XY 坐标归一化为 UV 区间

child.geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2));child.geometry.attributes.uv.needsUpdate = true;

📌 设置 UV 属性并通知渲染系统更新

该段代码的最终目标是:✅ 使 XY 平面上的任意不规则几何体,都能准确、完整地显示一张贴图(通常是一张地图或图案)

到此这篇关于Three.js中自定义UV坐标贴图的文章就介绍到这了,更多相关Three.js自定义UV坐标贴图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


本文地址: https://www.earthnavs.com/jishuwz/569195bdcb8fad0db55b.html
全局中部横幅
WhatsApp筛号软件

跨境王WhatsApp筛号软件,可以按照不同国家号段生成电话号码,可以筛选这些号码是否开通WhatsApp,以及WhatsApp头像,并且可以根据头像识别性别、年龄

麒麟自动链

麒麟自动链(70link.cn)是一个非常专业的自助链网站,免费为新老站点提供永久性的自动链广告位,让新老站点获得更多的被点击机会。无需注册,无需审核,提交网站,做上链接,清除缓存,点击一次,完成收录!

开发者导航

程序员一站式导航平台,汇集AI工具、前端、后端、Python、Java等1000+优质开发工具

上游世界

该站点未添加描述description...

Global

GlobalTimes,anEnglish-languageChinesenewspaperunderthePeople

CGTN

Getthenewsasitbreaksandgobehindtheday

知乎圆桌

知乎,中文互联网高质量的问答社区和创作者聚集的原创内容平台,于2011年1月正式上线,以「让人们更好的分享知识、经验和见解,找到自己的解答」为品牌使命。知乎凭借认真、专业、友善的社区氛围、独特的产品机制以及结构化和易获得的优质内容,聚集了中文互联网科技、商业、影视、时尚、文化等领域最具创造力的人群,已成为综合性、全品类、在诸多领域具有关键影响力的知识分享社区和创作者聚集的原创内容平台,建立起了以社区驱动的内容变现商业模式。

西瓜数据

西瓜数据提供新媒体流量监测及精准营销服务,以数据为依托,为品牌主营销洞察提供支持,提高投放效率,降低投放成本,助力品牌实现营销新目标。

Bitsum.

Real-TimeCPUOptimizationandAutomation.KeepyourPCresponsiveduringhighCPUloadsandautomateprocesssettingswithrules.AppsrunYOURWAY!

红网

湖南新闻综合门户网站,国内网站新闻影响力十强,中国地方新闻网站第一品牌,湖南省党网。2001年成立。提供新闻信息、生活资讯、视频直播、论坛博客、手机报、客户端、微博、电子商务、活动策划、舆情、广告等服务。设省直部门网群和13个市州、123个县市区分站。荣获过中国最具影响力新闻网站、中国十大创新传媒、最具品牌价值网站等荣誉,有百姓呼声、红辣椒评论等名牌栏目。