Mapbox加载gltf模型

标签: 无 分类: 未分类 创建时间:2022-03-06 10:35:59 更新时间:2024-12-04 11:29:35

2.fbx转为gltf

使用 fbx2gltf.exe 可以将 fbx 转换为 gltf,并且加上 –draco 参数,可以将fbx进行压缩,压缩率还是挺高的。

1
2
3
4
5
## 进行压缩
.\FBX2glTF-windows-x64.exe --draco --verbose -i .\位置调整.FBX -o .\test_c\test.gltf

## 打包到一个文件中
.\FBX2glTF-windows-x64.exe --draco --verbose -b -i .\小.FBX -o .\test_c\test.glb

2.加载gltf模型

mapbox中加载gltf模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* 自定义图层
*
*/
// parameters to ensure the model is georeferenced correctly on the map
var modelOrigin = [120.230, 30.235];
var modelAltitude = 0;
var modelRotate = [Math.PI / 2, 0, 0];
var modelScale = 5.41843220338983e-8;

// transformation parameters to position, rotate and scale the 3D model onto the map
var modelTransform = {
translateX: mapboxgl.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).x,
translateY: mapboxgl.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).y,
translateZ: mapboxgl.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).z,
rotateX: modelRotate[0],
rotateY: modelRotate[1],
rotateZ: modelRotate[2],
scale: modelScale
};

var THREE = window.THREE;

// configuration of the custom layer for a 3D model per the CustomLayerInterface
var customLayer = {
id: '3d-model',
type: 'custom',
renderingMode: '3d',
onAdd: function(map, gl) {
this.camera = new THREE.Camera();
this.scene = new THREE.Scene();

// create two three.js lights to illuminate the model
var directionalLight = new THREE.DirectionalLight(0xffffff);
directionalLight.position.set(0, -70, 100).normalize();
this.scene.add(directionalLight);

var directionalLight2 = new THREE.DirectionalLight(0xffffff);
directionalLight2.position.set(0, 70, 100).normalize();
this.scene.add(directionalLight2);

// use the three.js GLTF loader to add the 3D model to the three.js scene
var loader = new THREE.GLTFLoader();
loader.load('./test.gltf', (function (gltf) {
this.scene.add(gltf.scene);
}).bind(this));
this.map = map;

// use the Mapbox GL JS map canvas for three.js
this.renderer = new THREE.WebGLRenderer({
canvas: map.getCanvas(),
context: gl
});

this.renderer.autoClear = false;
},
render: function(gl, matrix) {
var rotationX = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1, 0, 0), modelTransform.rotateX);
var rotationY = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 1, 0), modelTransform.rotateY);
var rotationZ = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 0, 1), modelTransform.rotateZ);

var m = new THREE.Matrix4().fromArray(matrix);
var l = new THREE.Matrix4().makeTranslation(modelTransform.translateX, modelTransform.translateY, modelTransform.translateZ)
.scale(new THREE.Vector3(modelTransform.scale, -modelTransform.scale, modelTransform.scale))
.multiply(rotationX)
.multiply(rotationY)
.multiply(rotationZ);

this.camera.projectionMatrix.elements = matrix;
this.camera.projectionMatrix = m.multiply(l);
this.renderer.state.reset();
this.renderer.render(this.scene, this.camera);
this.map.triggerRepaint();
}
};

/**加载模型 */
map.on('style.load', function() {
map.addLayer(customLayer);
})
参考文章:
1.添加3D模型 这是中文官网的一个加载雷达模型的例子
2. facebookincubator /FBX2glTF 将fbx格式的三维模型转成glt并进行了压缩。
3.FBX转gltf,Ceisum中加载动画效果

[问题]
当我使用FBX2gltf工具,将fbx格式转为
(1) THREE.GLTFLoader: Failed to load buffer “buffer.bin”
【解决】
这个问题主要就是在使用fbx转换工具的时候,会生成一个buffer.bin文件,但是这个文件生成到了c盘的文件夹下,我没有发现,只要把这个gltf文件和bin文件,一起考过去就可以了。或者就是在使用工具的时候, -o 参数后面写一个文件夹的路径,然后再写 .gltf 后缀。

(2) THREE.GLTFLoader: No DRACOLoader instance provided
出现这个问题,主要就是没有加载 DRACOLoader 模块,并且要设置 setDecoderPath 。

1
2
3
4
5
6
7
8
// html
<script src="./node_modules/three/build/three.min.js"></script>
<script src="./node_modules/three/examples/js/loaders/GLTFLoader.js"></script>
<script src="./node_modules/three/examples/js/loaders/DRACOLoader.js"></script>

// js,要将node_modules文件下 找到three文件夹, 找到 /examples/js/libs/draco/ ,作为下面的路径,
THREE.DRACOLoader.setDecoderPath( '/examples/js/libs/draco' );
loader.setDRACOLoader( new THREE.DRACOLoader() );

我的主要问题,其实还是设置这个 DecoderPath ,我虽然设置了路径,但是似乎还是找不到,它还是从 根目录下加载 draco_decoder.js 文件。

参考文章:
1.New GLTF Loader for GLTF2 - unable to pass DracoLoader instance
2.GLTFLoader threejs官网关于loader的说明
3.Vue+Three 加载glb文件报错 这里有些提示,就是要加载 draco 模块
4.How to use draco loader?
5. mrdoob /three.js
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。