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

给不规则的shapeGeometry贴图

首先看一下贴图效果,我们要做的是将一个长方形的贴图在不规则的多边形中贴图

实现思路

1. 取不规则多边形的box2,这个box2就是整个贴图的UV坐标

2. 计算每个不规则的多边形顶点的在该box2上的对应映射

3. 更新整个geometry的uvs数据

怎么计算映射?

计算每个点分别到U轴的投影和V轴的投影

具体代码如下:

const box2 = new THREE.Box2().setFromPoints(shapePositions);
const { min, max } = box2;
const width = max.x - min.x;
const height = max.y - min.y;
// 左下角坐标
const leftBottom = new THREE.Vector2(min.x, min.y);
// 右下角坐标
const rightBottom = new THREE.Vector2(max.x, min.y);
// getAreaByVertexs这个是判断不规则图形点的方向的,顺时针还是逆时针,可以不加这个去试试就知道这段代码的意思了
const positions = getAreaByVertexs(shapePositions) < 0 ? [...shapePositions] : shapePositions.reverse();
// 左下角是texture的(0,0),所以基于此点计算
positions.slice(0, shapePositions.length - 1).forEach((item) => {const v1 = new THREE.Vector2().subVectors(leftBottom, rightBottom);const v2 = new THREE.Vector2().subVectors(leftBottom, item);const distance = leftBottom.distanceTo(item);const angle = v1.angleTo(v2);const uvx = (Math.cos(angle) * distance) / width;const uvy = (Math.sin(angle) * distance) / height;uvs.push(Math.max(0, Math.min(uvx, 1)), Math.max(0, Math.min(uvy, 1)));
});
// 记得拿到uvs数据去更新geometry的uv坐标

http://www.lryc.cn/news/419262.html

相关文章:

  • 网络层IP协议报头字段的认识
  • Linux部署MySQL8.0
  • 二叉树中的深搜
  • 固态继电器行业知识详解
  • 【practise】数组中出现次数超过一半的数字
  • RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!
  • MySQL的InnoDB的页里面存了些什么
  • SQL Server 事务
  • qt quick实现的水波纹特效:横向波纹、纵向波纹效果
  • 释放数据要素价值,FISCO BCOS 2024 应用案例征集
  • 日撸Java三百行(day18:循环队列)
  • 论文精读1
  • uniapp免费申请苹果证书教程每次7天可用于测试
  • 【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
  • eBPF编程指南(一):eBPF初体验
  • pip笔记
  • centos安装postgresql-12
  • Npm使用教程
  • 【Android Studio】修改项目名称can‘t rename root module解决办法
  • 豆瓣Top250电影数据分析可视化系统(Flask+Mysql+Pyecharts)
  • 软件质量保证计划书(2024Word完整版)
  • 【学习笔记】Matlab和python双语言的学习(动态规划)
  • 低代码开发:机遇与挑战的双重探索
  • Docker最佳实践(三):安装mysql
  • 进阶SpringBoot之 Web 静态资源导入
  • 【数据结构七夕专属版】单链表及单链表的实现【附源码和源码讲解】
  • 鸿蒙笔记--Socket
  • 安装python+python的基础语法
  • html+css网页制作 国家体育总局2个页面模版(无js)
  • Effective Java学习笔记第27、28条原生态类型和非受检警告