Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Computer Graphics Fundamentals / 07-Practice-21.11.2022 / 02.js
blob: cecdbe8771b883b2b960459ba8d9046e6ed9712b (plain) (blame)
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++;
}