本人第一篇博文,最近很多人咨询此问题,发篇博文仅供参考!
系统点,从3dmax建模导出obj到threejs显示过一遍。。。
做个简单的cube:
导出选项:
检查mtl文件(很多人导出的obj材质贴图路径出错,参考我上图导出选项):
结构:
index.html:
<!DOCTYPE html><html lang="zh-CN"><head> <title>Cube</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <style> body { margin: 0px; overflow: hidden; } </style></head><body> <script src="js/three.js"></script> <script src="js/OrbitControls.js"></script> <script src="js/OBJLoader.js"></script> <script src="js/MTLLoader.js"></script> <script src="js/WebGL.js"></script> <script src="js/play.js"></script></body></html>
play.js:
(function () { "use strict"; if (WEBGL.isWebGLAvailable() === false) { alert(WEBGL.getWebGLErrorMessage()); } var container, camera, scene, renderer, controls, clock; var init = function () { container = document.createElement('div'); container.id = 'container'; document.body.appendChild(container); renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); container.appendChild(renderer.domElement); scene = new THREE.Scene(); var gridHelper = new THREE.GridHelper(100, 10, 0x121c35, 0x121c35); scene.add(gridHelper); scene.add(new THREE.HemisphereLight(0xffffbb, 0x080820, 2)); camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 200); camera.position.set(0, 50, 50); controls = new THREE.OrbitControls(camera, container); controls.autoRotate = true; new THREE.MTLLoader().load('models/cube.mtl', function (materials) { materials.preload(); new THREE.OBJLoader().setMaterials(materials).load('models/cube.obj', function (object) { scene.add(object); animate(); }); }); window.addEventListener('resize', onWindowResize, false); }; window.onload = init(); function onWindowResize() { var w = window.innerWidth, h = window.innerHeight; renderer.setSize(w, h); camera.aspect = w / h; camera.updateProjectionMatrix(); } function animate() { requestAnimationFrame(animate); render(); } function render() { controls.update(); renderer.render(scene, camera); }})();
前面的都很基础,干货在这里,也就是一些细节部分,你们苦苦百度不得的东西。哈哈哈哈、、、、
第一种失败原因:
由于浏览器same origin policy(同源策略)的安全限制,从本地文件系统载入外部文件将会失败,同时抛出安全性异常。
解决办法有二:
1.运行一个本地的服务器,最简单的下个nginx,本文不讲nginx,如需学习,自行百度。
2.打开file协议(chrome)
--allow-file-access-frome-files
桌面鼠标右击chrome,单击属性,在“目标”后面空一个填入以上代码,忽略我截图的-incognito,想知道自己百度。
然后点击应用,确定。
你如果以为完事大吉,那就错了!你双击index.html试试,还是报同样的错误,你需要拖动index.html到桌面chrome快捷方式打开、、、
第二种失败原因:
中文编码导致找不到贴图文件,出现下图错误。
这个原因是因为我的贴图用了中文名称,所以、、、嘿嘿嘿
修改cube.mtl文件编码为utf-8、、、
最后运行界面如下:
总结一下:
上述我尽所能的列举出一些关键出错地方,愿读者能解决问题,如果你还是不能成功运行,那么请检查自己的代码,如果还不行,留言我们一起解决。。。
昨天写的匆忙 ,居然忘记写,max要使用默认的扫描线渲染器下的标准材质、、、
如果你那边是vray的材质,是不能直接使用的,包括在其他的引擎当中都不可以,你需要将其烘焙。具体做法后面再说了、、、
联系客服