這次要模擬的場景如下圖:就是在綠草地上足球的運動,並且視角會隨着足球的運動發生變化,同時整個草地的視角也會旋轉。

接下來,我們就對各個元素進行分析:
1,草地
用PlaneGeometry在三維空間里創建一個平面對象,添加草場紋理,然后rotation.x在x軸方向旋轉90度,營造一種立體的視角
我們用 floorMater.map.repeat.set將草皮重復,是不要讓草皮太放大,看起來失真;
function addFloor() {
var floorGeom = new THREE.PlaneGeometry(100,100,20,20);
var floorMater = new THREE.MeshPhongMaterial();
floorMater.map = THREE.ImageUtils.loadTexture('http://10.1.26.29:84/assets/textures/06_DIFFUSE.jpg');
//沿着(S)x,(T)y方向允許紋理重復自己
floorMater.map.wrapS = floorMater.map.wrapT = THREE.REpeatWrapping;
//material.map.repeat.set(repeatX,repeatY);repeatX:指定在x軸方向多久重復一次。repeatY:指定在y軸方向多久重復一次。
//如果設置為1,都不會重復。 如果設置<1,紋理就會被放大。 如果設置為負數,就會產生紋理鏡像。
floorMater.map.repeat.set(10,10);
var floor = new THREE.Mesh(floorGeom,floorMater);
floor.receiveShadow = true;
floor.rotation.x = -0.5 * Math.PI;
scene.add(floor);
}
2,添加橫桿
這里用的就是一個圓柱,通過旋轉將其與草地幾乎平行
function addRail() {
var cylinderGeometry = new THREE.CylinderGeometry(0.1, 0.1,15,50,50);
var cylinderMaterial = new THREE.MeshPhongMaterial({color:0xeeeeee});
var cylinder = new THREE.Mesh(cylinderGeometry,cylinderMaterial);
cylinder.position.set(1,5,1);
cylinder.rotation.x = '15';
cylinder.rotation.y = '-57.8';
cylinder.rotation.z = '-14.85';
cylinder.name = 'cylinder';
scene.add(cylinder);
}
3,添加足球
Three.js的光源默認不會導致物體間的投影,打開投影需要執行以下幾步:
打開渲染器的地圖陰影: renderer.shadowMapEnabled = true;
啟用光線的投影:light.castShadow = true;
把模型設置為生成投影:mesh.castShadow = true;
把模型設置為接收陰影:mesh.receiveShadow= true;
然后為足球添加一個足球的紋理
function addSphere() {
var sphereGeometry = new THREE.SphereGeometry(0.8, 25, 25);
var sphereMaterial = new THREE.MeshBasicMaterial({specular: '#a9fcff',emissive: '#006063',shininess: 10});
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.position.set(7,0.8,-1);
sphere.castShadow = true;
var texture = new THREE.ImageUtils.loadTexture("http://10.1.26.29:84/assets/football.jpg");
sphereMaterial.map = texture;
sphere.name = 'sphere';
scene.add(sphere);
}
4,render()函數
我們為每個元素分別寫了一個函數,然后在init()初始化函數中調用即可
這一節的重點就是render函數中改變camera的視角
首先我們相機的視角是以足球的位置camera.lookAt(sphere.position); 然后我們通過step改變足球的位置,camera視角就會跟着足球發生變化
然后我們為camera添加位置變化,使得camera本身位置發生旋轉、
我們可以通過分別注釋(1)(2)
function render() {
var sphere = scene.getObjectByName('sphere');
renderer.render(scene, camera);
camera.lookAt(sphere.position);
// (1)
step += 0.02;
sphere.position.x = 0 + ( 10 * (Math.cos(step)));
sphere.position.y = 0.75 * Math.PI / 2 + ( 6.5 * Math.abs(Math.sin(step)));
sphere.rotation.z += 0.03;
//(2)
var x = camera.position.x;
var z = camera.position.z;
camera.position.x = x * Math.cos(0.015) + z * Math.sin(0.015);
camera.position.z = z * Math.cos(0.015) - x * Math.sin(0.015);
requestAnimationFrame(render);
}
完整代碼下載:github(threejs-four) 如果你覺得我寫的對你有所幫助的話,請給我個star吧,謝謝
