Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Computer Graphics Fundamentals / 05-Practice-31.10.2022 / 05.js
blob: d732bab9381ce727a08a66019a075e77e977e8e8 (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
// Задача: конструирайте ... зарче, от дупките
// на което струи светлина


var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setAnimationLoop( drawFrame );
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
document.body.appendChild( renderer.domElement );

var scene = new THREE.Scene();

var aspect = window.innerWidth/window.innerHeight;
camera = new THREE.PerspectiveCamera( 30, aspect );
camera.position.set( 0, 10, 30 );
camera.lookAt( new THREE.Vector3( 0, -2, 0 ) );


// Основно тяло на зарчето - куб 4х4х4, който ще
// трябва да решите как да продупчите
var die = new THREE.Mesh(
	new THREE.BoxGeometry( 4, 4, 4 ),
	new THREE.MeshLambertMaterial()
);
die.castShadow = true;

var hole = new THREE.Mesh(new THREE.BoxGeometry(3.8, 3.8, 3.8));
var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(0.9, 0.9, 4, 32));

var cylinder2 = new THREE.Mesh(new THREE.CylinderGeometry(0.9, 0.9, 4, 32));
cylinder2.rotation.x = Math.PI / 2;

var cylinder3 = new THREE.Mesh(new THREE.CylinderGeometry(0.9, 0.9, 4, 32));
cylinder3.rotation.z = Math.PI / 2;

var csg = new CSG();
csg.subtract([die, hole, cylinder, cylinder2, cylinder3]);

die = csg.toMesh();
die.castShadow = true;

scene.add( die );

// широка платформа, която ще бъде осветявана
var geometry = new THREE.BoxGeometry( 100, 1, 100)
var material = new THREE.MeshPhongMaterial();
platform = new THREE.Mesh( geometry, material );
platform.position.set( 0, -5, 0 );
platform.receiveShadow = true;
scene.add( platform );

// светлина вътре в куба, свети надолу през
// дупките на зарчето - ама трябва вие да си
// я сложите на подходящо място
light1 = new THREE.SpotLight( 'white' );
light1.position.set(0, 0, 0);
light1.target = platform;
light1.penumbra = 1;
light1.castShadow = true;
scene.add(light1);

// втора слаба светлина, която прави жълтото
// петно на платформата
light2 = new THREE.SpotLight( 'yellow', 0.5 ); // интензитет 0.5
light2.position.set( 0, 0.1, 0 );
light2.angle = 1.3;
light2.penumbra = 1;
scene.add( light2 );

// трета светлина - отгоре много слаба бяла,
// а отдолу по-силна керемидена - нужна ни е,
// за да видим външните стени на зарчето
light3 = new THREE.HemisphereLight( 0x202020, 0xA04040 );
scene.add( light3 );

function drawFrame()
{
	// въртим зарчето
	die.rotation.x += 0.005;
	die.rotation.y += 0.004;
	die.rotation.z += 0.003;
	
	renderer.render( scene, camera );
}