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
全局中部横幅
网易免费邮箱

网易免费邮箱,你的专业电子邮局,提供以@163.com、@126.com和@yeah.net为后缀的免费邮箱。超过20年邮箱运营经验,系统快速稳定安全,支持超大附件和网盘服务。网易邮箱官方App“邮箱大师”帮您高效处理邮件,支持所有邮箱,并可在手机、Windows和Mac上多端协同使用。

学习资源分享

158资源整合网:是一个学习资源整合平台,整合各类名师讲座视频、培训课程、培训视频教程下载,也是一个虚拟资源平台。

All
All

redditlisthelpsyoufindthebestpartsofreddit.combybringingyoudailyrankingsandstatisticsforthemostpopularsubreddits.

汉网

汉网由长江日报报业集团注资千万独资打造,是长江日报报业集团及旗下长江日报、武汉晚报、武汉晨报等十余家报刊在互联网上的主要代表。与长江公益文化传播院强强联合,打造湖北地区最具权威的公益性网站。是您身边的公益平台,关注您身边的公益活动,聚焦您身边公益人物。扶危济困、传递温暖,打造人人公益、快乐公益。

新闻中心首页

新浪网新闻中心是新浪网最重要的频道之一,24小时滚动报道国内、国际及社会新闻。每日编发新闻数以万计。

专业的云计算

作为云计算技术的专业服务提供商,中国公云(3322)为数百万用户提供内网域名、智能域名、动态域名等基础信息服务。

DDNSTO高效管理设备

DDNSTO内网穿透设备原理远程下载远程开机远程桌面远程文件管理

七牛云

2011年成立以来,七牛云致力于成为全球领先的一站式中立音视频云 + AI 服务商,围绕数字化浪潮下的在线音视频需求,基于强大的云边一体化能力和低代码能力,持续在视频点播、互动直播、实时音视频、摄像头上云等领域,进行深度技术投入,提供面向业务场景的视频云解决方案。截至目前,有超过100万企业客户和开发者长期使用七牛云服务,包括OPPO、爱奇艺、平安银行、招商银行、上汽集团、芒果TV等知名企业。

大厂图床

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

B2B目录网

B2B站网址大全是全人工编辑的开放式网站分类目录资源平台,收录国内外、各行业优秀B2B网站,旨在为用户提供网站分类目录检索、优秀网站参考以及B2B推广服务。