三要素的加载 要知道的是,threeJS是为webgl做了许多工作的,那么最重要的一个流程无非是加载
camera [录制者⏺]
render [一切素材的准备🥗]
scene [一个舞台🏟]
为此我们首先要加载好三要素,才能对model进行操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var camera, scene, renderer; camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // 远景相机 scene = new THREE.Scene(); renderer = new THREE.WebGLRenderer({ antialias: true // 加入抗锯齿,可能产生性能上的卡顿 }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); camera.position.x = 0; camera.position.y = 1; camera.position.z = 10;
可以看到我们首先加载了camera,并制定了它的位置,对于整个render我们加入了抗锯齿效果,那么有了这样的场景,就要增加舞台上的演员⛄️。
我们在Clara.io 上寻找到了免费的模型,导出了json文件,你也可以通过3D max制作自己的model。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var loader = new THREE.ObjectLoader(); loader.load('don-flip.json', function(obj) { scene.add(obj); animate(); }, // onProgress callback function(xhr) { console.log((xhr.loaded / xhr.total * 100) + '% loaded'); }, // onError callback function(err) { console.error('An error happened'); }); var animate = function() { requestAnimationFrame(animate); renderer.render(scene, camera); };
以上我们通过ObjectLoader载入本地的json文件,根据情况需要也可以选择JsonLoader,将json文件中的材质与几何结构赋予给场景,可以在onProgress
的回调函数中查看模型是否加载成功。
但是当你运行以上代码时,可能发生一些错误,就是根本看不到任何图像,即使你成功load了模型,依然是黑屏!
那么问题出在我们没有添加光源的问题上
To fix
首先我们要加入光源,笔者选择了平行光
1 2 3 4 5 6 7 8 9 10 11 12 ... camera.position.z = 10; var dirLight = new THREE.DirectionalLight(0xffffff, 0.8); dirLight.position.set(200, 200, 1000).normalize(); dirLight.castShadow = true; scene.add(dirLight); scene.add(dirLight.target); ...
然后通过加入
1 2 3 renderer.setSize(window.innerWidth, window.innerHeight); ++ renderer.shadowMapEnabled = true; // 开启接受阴影 document.body.appendChild(renderer.domElement);
运行界面,我们即可看到加载好的模型。
为了让例子更加生动,我们需要让他做点transform,使这个例子不再生硬
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... ++ var leef = new THREE.Object3D(); var loader = new THREE.ObjectLoader(); loader.load('don-flip.json', function(obj) { -- scene.add(obj); ++ leef.add(obj); ++ scene.add(leef); animate(); }, ... var animate = function() { ... ++ leef.rotation.y += 0.01; ... renderer.render(scene, camera); };
最终的效果展示💃
;