我试图手动(没有像Three.js这样的库)将JSON 3D模型加载到我的webGL代码中只是为了好玩,但当我的模型有多个纹理时,我遇到了困难。在OBJ->JSON转换的文件中,我如何知道哪个纹理是后面的面的"活动"纹理?OBJ文件使用"usemtl"标记来识别正在使用的纹理/材料,但在使用JSON时,我似乎找不到那种指针。随着时间的推移,我正在使用alteredq编写的OBJ->JSON转换器
谢谢大家,棒
看看这个文件:three.js / src / extras / loaders / JSONLoader.js
。
JSON文件的faces
数组中每个面的第一个元素是一个位字段。第一个部分说,如果那张脸有三到四个指数。第二位说明该面是否指定了材质。材料索引(如果有)出现在索引之后。
示例:faces: [2, 46, 44, 42, 0, 1, 45, 46, 48, 3, ...
第一个面(带材料的三角形):
Type: 2 (00000010b)
Indices: 46, 44, 42
Material index: 0
第二面(无材料四边形):
Type: 1 (00000001b)
Indices: 45, 46, 48
第三面(带材料的四边形):
Type: 3 (00000011b)
Indices: ...
请检查源代码以了解该位字段的全部含义。
在我为KickJS游戏引擎编写的OBJ->JSON转换器中,每种材料都有自己的索引范围。
这意味着一个简单的OBJ模型,如
mtllib plane.mtl
o Plane
v 1.000000 0.000000 -1.000000
v 1.000000 0.000000 1.000000
v -1.000000 0.000000 1.000000
v -1.000000 0.000000 -1.000000
usemtl Material
s 1
f 2 3 4
usemtl Material.001
f 1 2 4
将被翻译成这个(有两个索引;每个材料一个):
[
{
"vertex": [1,0,1,-1,0,1,-1,0,-1,1,0,-1],
"name": "Plane mesh",
"normal": [0,-1,0,0,-1,0,0,-1,0,0,0,0],
"indices0": [0,1,2],
"indices1": [3,0,2]
}
]
使用在线模型查看器进行转换:
http://www.kickjs.org/example/model_viewer/model_viewer.html