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

文章编号:1038 技术教程 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/a64b878be1203db6455a.html
全局中部横幅
笔点

笔点(www.bidianer.com)是一个简洁的网址导航网站。你可以自定义上网常用网址、自定义你需要的工具模块。你还可以发现、收集、分享,Web开发、设计工作中的优质资源、干货。

The
The

Livenews,investigations,opinion,photosandvideobythejournalistsofTheNewYorkTimesfrommorethan150countriesaroundtheworld.SubscribeforcoverageofU.S.andinternationalnews,politics,business,technology,science,health,arts,sportsandmore.

All
All

redditlisthelpsyoufindthebestpartsofreddit.combybringingyoudailyrankingsandstatisticsforthemostpopularsubreddits.

验证码

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

百度新闻

百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点。您可以搜索新闻事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。

群晖科技

Synology提供你安全、高效率的资料管理系统,确保你能从容掌握极速成长的庞大数位资料,从中取得竞争优势。

QQ空间

QQ空间(Qzone)是拥有数亿用户的社交网络,是QQ用户的网上家园,是腾讯集团的核心平台之一。您可以玩游戏、玩装扮、上传照片、写说说、写日志,黄钻贵族还可以免费换装并拥有多种特权。QQ空间同时致力于建设腾讯开放平台,和第三方开发商、创业者一起为亿万中国网民提供卓越的、个性化的社交服务。

红尘资源网

红尘资源网欢迎各位,本站专注于收集分享各种最新破解资源、活动线报、娱乐资讯、绿色软件、技术教程,还有来自全网的网站模板、网站源码分享以及各种去广告软件下载.

牛蛙资源网

牛蛙资源网,每天准时更新全网精品资源免费分享平台,专注网络活动线报,技术教程,自学教程,网站源码,技术导航,绿色资源,包括绿色软件资源,办公资源,游戏图文攻略资源等,聚集了全网资源,技术,教程,分享平台!

富贵论坛

富贵论坛,二十五年老富贵论坛官网,业务涉及QQ号码、YY、淘宝、抖音、陌陌、手机靓号、游戏账号,二手交易论坛,买号卖号就上富贵交易平台官方网站。