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
|
// Задача: Направете топка да се върти в кръг
// около пилон
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( 'dimgray' );
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 xp = 40*Math.random();
var yp = 20+40*Math.random();
var zp = 40*Math.random();
// създаване на топка
var ball = new THREE.Mesh(
new THREE.SphereGeometry( 6, 32, 32 ),
new THREE.MeshPhongMaterial( {color: 'goldenrod', shininess: 60, specular: 'white'} )
);
ball.castShadow = true;
scene.add( ball );
// създаване на земята
var ground = new THREE.Mesh(
new THREE.BoxGeometry( 200, 2, 140 ),
new THREE.MeshPhongMaterial( {color: 'steelblue', shininess: 60, specular: 'white'} )
);
ground.position.y = -1;
ground.receiveShadow = true;
scene.add( ground );
// създаване на пилон
var material = new THREE.MeshPhongMaterial( {color: 'steelblue', shininess: 100, specular: 'white'} );
scene.add( futuristicPillar( xp, zp, yp, material ) );
// светлина
var light = new THREE.PointLight();
light.position.set( 0, 50, 0 );
light.castShadow = true;
scene.add( light );
scene.add( new THREE.AmbientLight( 'white', 0.7 ) );
var clock = new THREE.Clock();
var rotationTime = 5;
var rotationDiam = 20;
function drawFrame()
{
var t = clock.getElapsedTime();
// движение в кръг - може би тук да се допише?
ball.position.x = Math.sin(Math.PI * 2 * (t % rotationTime) / rotationTime) * rotationDiam + xp;
ball.position.z = Math.cos(Math.PI * 2 * (t % rotationTime) / rotationTime) * rotationDiam + zp;
ball.position.y = Math.sin(Math.PI * 2 * (t % rotationTime) / rotationTime + Math.PI / 4) * rotationDiam + yp;
scene.rotation.y += 0.002;
renderer.render( scene, camera );
}
|