还是先放代码。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Three框架</title> <script src="js/three.js"></script> <script src="js/stats.js"></script> <script src="js/Tween.js"></script> <style type="text/css"> div#canvas-frame { border: none; cursor: pointer; width: 100%; height: 600px; background-color: #EEEEEE; } </style> <script> function initTween() { new TWEEN.Tween(mesh.position) .to({ x: -400 }, 3000).repeat(Infinity).start(); } var renderer; var stats; function initThree() { width = document.getElementById('canvas-frame').clientWidth; height = document.getElementById('canvas-frame').clientHeight; renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(width, height); document.getElementById('canvas-frame').appendChild(renderer.domElement); renderer.setClearColor(0xFFFFFF, 1.0); stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.getElementById('canvas-frame').appendChild(stats.domElement); } var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000); camera.position.x = 600; camera.position.y = 0; camera.position.z = 600; camera.up.x = 0; camera.up.y = 1; camera.up.z = 0; camera.lookAt(0,0,0); } var scene; function initScene() { scene = new THREE.Scene(); } var light; function initLight() { light = new THREE.AmbientLight(0xFF0000); light.position.set(100, 100, 200); scene.add(light); light = new THREE.PointLight(0x00FF00); light.position.set(0, 0, 300); scene.add(light); } var cube; var mesh; var mesh2; var mesh3; function initObject() { var geometry = new THREE.CubeGeometry(100, 100, 100); var material = new THREE.MeshPhongMaterial({ map: THREE.ImageUtils.loadTexture('textures/a.jpg') }); mesh = new THREE.Mesh(geometry, material); mesh.position = new THREE.Vector3(0, 0, 0); scene.add(mesh); var geometry2 = new THREE.CubeGeometry(100, 100, 100); var material2 = new THREE.MeshPhongMaterial({ map: THREE.ImageUtils.loadTexture('textures/a.jpg') }); mesh2 = new THREE.Mesh(geometry2, material2); mesh2.position.set(200, 0, 0); scene.add(mesh2); var geometry3 = new THREE.CubeGeometry(200, 100, 50, 4, 4); var material3 = new THREE.MeshLambertMaterial({ color: 0xFFFFFF }); var mesh3 = new THREE.Mesh(geometry3, material3); mesh3.position.set(0, -150, 0); scene.add(mesh3); } function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); animation(); //initTween(); } function animation() { mesh.rotation.x += 0.1; mesh.rotation.y += 0.1; mesh2.position.x += 10; renderer.render(scene, camera); requestAnimationFrame(animation); stats.update(); //TWEEN.update(); } </script> </head> <body onload="threeStart();"> <div id="canvas-frame"></div> </body> </html>
跟上篇日志的内容差不太多,把动画部分注释掉了。
这里贴图主要用到了THREE.MeshPhongMaterial()这个api,如果不贴图,只是增加颜色,那么用
THREE.MeshLambertMaterial()这个api即可。
然后旋转移动的方法很多,这里可以通过属性旋转移动,也可以通过方法旋转移动。这里借用一下人家的图,确实很详细。上面的代码是通过修改属性值来修改位置。按理说,这里的方式是有问题的,通过这两种方式的api修改肯定不安全,不知道后面会不会修改这些api。
但以上仅仅只是开始,如果只了解上面的知识,不了解本质的话,后面肯定会很难走。其实这个移动旋转更多的是进行了矩阵的运算。