还是先放代码。
<!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 οnlοad="threeStart();">
<div id="canvas-frame"></div>
</body>
</html>
跟上篇日志的内容差不太多,把动画部分注释掉了。
这里贴图主要用到了THREE.MeshPhongMaterial()这个api,如果不贴图,只是增加颜色,那么用
THREE.MeshLambertMaterial()这个api即可。
然后旋转移动的方法很多,这里可以通过属性旋转移动,也可以通过方法旋转移动。这里借用一下人家的图,确实很详细。上面的代码是通过修改属性值来修改位置。按理说,这里的方式是有问题的,通过这两种方式的api修改肯定不安全,不知道后面会不会修改这些api。
但以上仅仅只是开始,如果只了解上面的知识,不了解本质的话,后面肯定会很难走。其实这个移动旋转更多的是进行了矩阵的运算。