1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
// Задача: Създадени са два пилона на случайни
// места и случайни височини. Направете обекта
// ball да се движи напред-назад по права линия
// между върховете на пилоните, но не от открай
// до край.
var renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setAnimationLoop( drawFrame );
document.body.appendChild( renderer.domElement );
// включваме генерирането на меки сенки
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
var scene = new THREE.Scene();
scene.background = new THREE.Color( 'lemonchiffon' );
var aspect = window.innerWidth/window.innerHeight;
var camera = new THREE.PerspectiveCamera( 30, aspect );
camera.position.set( 0, 80, 250 );
camera.lookAt( new THREE.Vector3( 0, 20, 0 ));
// координати на началната точка на движението
var x1 = 10+60*Math.random();
var y1 = 10+40*Math.random();
var z1 = 40-80*Math.random();
// координати на крайната точка на движението
var x2 = -10-60*Math.random();
var y2 = 10+40*Math.random();
var z2 = 40-80*Math.random();
// създаване на подвижната сфера
var ball = new THREE.Mesh(
new THREE.SphereGeometry( 6, 32, 32 ),
new THREE.MeshPhongMaterial( {color: 'goldenrod', shininess: 60, specular: 'white'} )
);
ball.position.set( (x1+x2)/2, (y1+y2)/2, (z1+z2)/2 );
ball.castShadow = true;
scene.add( ball );
// създаване на земята
var ground = new THREE.Mesh(
new THREE.BoxGeometry( 200, 2, 140 ),
new THREE.MeshPhongMaterial( {color: 'green', shininess: 0, specular: 'white'} )
);
ground.position.y = -1;
ground.receiveShadow = true;
scene.add( ground );
// създаване на двата пилона
var material = new THREE.MeshPhongMaterial( {color: 'green', shininess: 0, specular: 'white'} )
scene.add( futuristicPillar( x1, z1, y1, material ) );
scene.add( futuristicPillar( x2, z2, y2, material ) );
// светлина
var light = new THREE.PointLight();
light.position.set( (x1+x2)/2, y1+y2, (z1+z2)/2 );
light.castShadow = true;
scene.add( light );
scene.add( new THREE.AmbientLight( 'deeppink' ) );
var ballPos = ball.position.clone();
var pillar1Pos = { x: x1, y: y1, z: z1 };
var pillar2Pos = { x: x2, y: y2, z: z2 };
function interpolate(pos1, pos2, per) {
return new THREE.Vector3(
pos1.x * (1.0 - per) + pos2.x * per,
pos1.y * (1.0 - per) + pos2.y * per,
pos1.z * (1.0 - per) + pos2.z * per);
}
var framesPerCycle = 300;
var frameCount = 0;
// във функцията drawFrame реализирайте исканото
// движение с линейна комбинация
function drawFrame()
{
if (frameCount % framesPerCycle < framesPerCycle / 2) {
ball.position.copy(interpolate(pillar1Pos, pillar2Pos, (frameCount % framesPerCycle) / framesPerCycle * 2));
} else {
ball.position.copy(interpolate(pillar2Pos, pillar1Pos, ((frameCount - framesPerCycle / 2) % framesPerCycle) / framesPerCycle * 2));
}
scene.rotation.y += 0.001;
renderer.render( scene, camera );
frameCount++;
}
|