读取obj文件中的vt并转成需要的uv数据

embedded/2024/11/13 7:56:05/

        先展示效果图

        适用场景:加载的obj模型需要发生形变,同时还要展示模型的纹理效果,可以使用到面料模拟或者弹性物体的模拟当中

        具体实现方案:

        1、读取obj文件中的vt的值,存起来

        2、读取f值,存v索引和vt索引

        3、根据存储的v索引和vt索引新增uv数据

        4、将整个uv数组放入到模型当中

        5、读取模型的uv,使用纹理加载器加载图片,放入到模型上

        然后就是上代码了~

        

function loadFromUrl(url) {return fetch(url).then(response => response.text()).then(objData => {const lines = objData.split('\n');let vertices = [];let faceTriIds = [];let vt = [];let uv = [];let uvIndex = [];for (const line of lines) {const parts = line.split(' ').filter(part => part!== '');if (parts[0] === 'v') {// 将顶点坐标依次存入一维数组vertices.push(parseFloat(parts[1]));vertices.push(parseFloat(parts[2]));vertices.push(parseFloat(parts[3]));} else if (parts[0] === 'f') {const facePart = parts[1].split('/');const facePart02 = parts[2].split('/');const facePart03 = parts[3].split('/');faceTriIds.push(Number(facePart[0])-1,Number(facePart02[0])-1,Number(facePart03[0])-1);// 获取uv的索引-->找到值存入uvuvIndex[Number(facePart[0])-1] = Number(facePart[1])-1uvIndex[Number(facePart02[0])-1] = Number(facePart02[1])-1uvIndex[Number(facePart03[0])-1] = Number(facePart03[1])-1} else if (parts[0] === 'vt') {vt.push(parseFloat(parts[1]),parseFloat(parts[2]))}}// 遍历uv --> 根据索引找到具体的uv值for (let i = 0; i < uvIndex.length; i++) {uv[i*2] = vt[uvIndex[i]*2]uv[i*2+1] = vt[uvIndex[i]*2+1]}return { vertices, faceTriIds, uv };}).catch(error => {console.error('Error loading OBJ file from URL:', error);return null;});
}export default loadFromUrl;

应该还算清晰明了的吧

就这样~~~~


http://www.ppmy.cn/embedded/107207.html

相关文章

TCP编程

目录 一丶socket 1.简介 2.类型 3.端口 port 4.端口转换 5.IP地址转换 二丶TCP编程 函数接口&#xff1a; 1.socket 2.bind 3.linten 4.accept 5.recv 6.connect 7.send 服务器代码&#xff1a; 客户端代码 一丶socket 1.简介 1》1982 - Berkeley Software D…

经验笔记:Feeds流设计与实现

Feeds流设计与实现经验笔记 一、概述 Feeds流是一种动态的消息或内容展示方式&#xff0c;常见于社交媒体、新闻应用、博客平台等。它按照一定的逻辑&#xff08;通常是时间顺序或算法推荐&#xff09;将内容展现给用户。设计一个好的Feeds流不仅需要考虑技术实现&#xff0c…

【C++】简述STL——string类的使用

文章目录 一、STL的简述1.STL的框架2.STL版本 二、string1、string的介绍2、为什么string类要实现为模板&#xff1f; 三、string的构造接口四、string的容量相关的接口五、string对象修改相关的接口1、insert2.earse3、assign4、replace 六、string对象字符串运算相关接口1、c…

Tomato靶场渗透测试

1.扫描靶机地址 可以使用nmap进行扫描 由于我这已经知道靶机地址 这里就不扫描了 2.打开网站 3.进行目录扫描 dirb http&#xff1a;//172.16.1.113 发现有一个antibot_image目录 4.访问这个目录 可以看到有一个info.php 5.查看页面源代码 可以发现可以进行get传参 6.…

如何理解互斥锁概念

目录 一、什么是互斥锁 1、定义 2. 工作原理 3. 避免问题 4. 实现方式 5. 使用场景 一、什么是互斥锁 1、定义 互斥锁&#xff08;Mutual Exclusion Lock&#xff09;是一种机制&#xff0c;用于确保同一时间只有一个线程可以访问特定的共享资源。它类似于一把“锁”&…

redis被攻击redis READONLY You can‘t write against a read only slave.

redis 日志路径 /var/log/redis 拿下来后发现有这种错误 Operation now in progress 可能是网络断开导致&#xff0c; 查找redis whereis redis 修改 vim /etc/redis.conf 大概在300行 下面代码yes改no slave-read-only no 重启redis sudo systemctl restart redis.…

【Python】简单的数据类型——int、float、bool、str

目录 1. 整数类型 int 2. 浮点数类型 float 3. 布尔类型 bool 4. 字符串 str 5. 类型转换 5.1 隐式类型转换 5.2 显示类型转换 6. 输出 6.1 print函数 6.2 格式化输出 7. 输入 1. 整数类型 int a 10 print(type(a)) print(type(-2))<class int> <class i…

ARM发布新一代高性能处理器N3

简介 就在2月21日&#xff0c;ARM发布了新一代面向服务器的高性能处理器N3和V3&#xff0c;N系列平衡性能和功耗&#xff0c;而V系列则注重更高的性能。此次发布的N3&#xff0c;单个die最高32核&#xff08;并加入到CCS&#xff0c;Compute Subsystems&#xff0c;包含Core&a…