// Задача: Направете топка да се движи на зигзаг // около пилони по екватора на сфера 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 ); }