javascript - webgl的obj文件中的纹理坐标
问题描述
有一个 .obj 文件,内容如下:
# texcoords
vt 0.306641 0.5
vt 0.841797 0.5
vt 0.888672 0.5
vt 0.935547 0.5
# verts
v 0 2 0
v 0 2 -4
v 0 6 0
...
# faces
f 3/3/1 2/3/1 1/3/1
f 4/3/1 2/3/1 3/3/1
f 7/4/1 6/4/1 5/4/1
...
在人脸部分,我们有三个项目:X/Y/Z,其中 X 是顶点索引,Y 是纹理坐标索引。
解析后我有三个数组:顶点数组、面数组和纹理坐标数组。但正如我们预期的那样,顶点的长度和纹理坐标不相等。纹理坐标的长度等于面数组的长度。但现在我不知道如何使用我的纹理坐标?我可以将纹理坐标传递给 ARRAY_BUFFER_ELEMENT 还是有其他方法?
解决方案
通常,除非您使用不常见的技术,否则您需要将位置和纹理坐标展平为平行数组。
遍历面,对于每个面,生成一个新的位置-texcoord 对(或 position-normal-texcoord 三元组)
伪代码
loadedPositions = [...];
loadedTexcoords = [...];
renderablePositions = [];
renderableTexcoords = [];
for each face
renderablePositions.push(loadedPositions[face.positionIndex])
renderableTexcoords.push(loadedTexcoords[face.texcoordIndex])
现在你可以渲染 renderablePositions/rendeableTexoordsdrawArrays
如果您想尝试重新索引新的 renderablePositon/renderableTexcoords,这取决于您。
伪代码
loadedPositions = [...];
loadedTexcoords = [...];
renderablePositions = [];
renderableTexcoords = [];
renderableIndices = [];
idToIndexMap = {};
for each face
id = `${face.positionIndex},${face.texcoordIndex}`;
if (idToIndexMap[id] === undefined) {
const index = renderablePositions.length // or length / 3
idToIndexMap[id] = index;
renderablePositions.push(loadedPositions[face.positionIndex])
renderableTexcoords.push(loadedTexcoords[face.texcoordIndex])
}
renderableIndices.push(idToIndexMap[id])
现在你可以用drawElements
有些事情,一个面可以有超过 3 个顶点,所以如果你想处理这种情况,你必须生成三角形。
面可以有负索引,表示相对于文件中迄今为止遇到的位置/法线/ texcoords 数量的索引。
我发现的最好的 .obj 参考是这个
推荐阅读
- typo3 - Typo3 损坏:前端/后端空白页,即使在恢复备份后也没有错误
- orbeon - 注销不适用于 DIGEST 身份验证
- python - 如何计算二维列表中相邻的元素数量
- html - 如何将标题文本放在另一个标题后面?(见图)
- python - 在元组列表的每个元组末尾添加列表元素
- python - 选择 NumPy 数组范围,包括最后一个元素
- javascript - 这是将多级深度对象数组转换为简洁对象数组的好方法吗?
- cython - 如何遍历其他结构中包含的对象并调用它们的方法(让 Cython 知道它们)?
- linux-kernel - 正式的 Linux 内核内存模型
- python - 502 Bad Gateway:注册的端点未能处理请求。: Python