// Задача: Създадени са два пилона на случайни // места и случайни височини. Направете обекта // 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++; }