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
|
// Задача: Направете топка да се движи на зигзаг
// около пилони по екватора на сфера
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( 'khaki' );
var aspect = window.innerWidth/window.innerHeight;
var camera = new THREE.PerspectiveCamera( 30, aspect );
camera.position.set( 250, 80, 0 );
camera.lookAt( new THREE.Vector3());
// създаване на пилони
var n = 6;
var material = new THREE.MeshPhongMaterial( {color: 'plum', shininess: 0, specular: 'white'} );
for( a=0; a<2*Math.PI; a+=2*Math.PI/n)
{
var pillar = futuristicPillar( 0, 0, 50, material );
pillar.position.set( 42*Math.sin(a+Math.PI/2), 0, 42*Math.cos(a+Math.PI/2) );
pillar.rotation.z = -Math.PI/2;
pillar.rotation.y = a;
scene.add( pillar );
}
// създаване на топка
var ball = new THREE.Mesh(
new THREE.SphereGeometry( 6, 32, 32 ),
new THREE.MeshPhongMaterial( {color: 'red', shininess: 50, specular: 'white'} )
);
ball.position.set( 0, 0, 70 );
ball.castShadow = true;
scene.add( ball );
// създаване на земята
var ground = new THREE.Mesh(
new THREE.SphereGeometry( 50, 64, 64 ),
new THREE.MeshPhongMaterial( {color: 'plum', shininess: 0, specular: 'white'} )
);
ground.receiveShadow = true;
scene.add( ground );
// светлина
var light = new THREE.PointLight();
light.castShadow = true;
scene.add( light );
scene.add( new THREE.AmbientLight( 'white', 0.2 ) );
var clock = new THREE.Clock();
var phiSec = -10;
var thetaSec = 3;
var radius = 70;
var verticalDivergence = Math.PI / 16;
function drawFrame()
{
var t = clock.getElapsedTime();
var phi = 2 * Math.PI * (t % phiSec) / phiSec;
var theta = verticalDivergence * Math.sin(2 * Math.PI * (t % thetaSec) / thetaSec) + Math.PI / 2 - verticalDivergence / 2;
ball.position.x = radius * Math.sin(theta) * Math.cos(phi);
ball.position.z = radius * Math.sin(theta) * Math.sin(phi);
ball.position.y = radius * Math.cos(theta);
scene.rotation.y += 0.01;
light.position.set( 100*Math.cos(scene.rotation.y-0.5), 30, 100*Math.sin(scene.rotation.y-0.5) );
renderer.render( scene, camera );
}
|