// Задача: Направете топката да се движи в // равнината XZ, като рикошира от стените. 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( 'skyblue' ); var aspect = window.innerWidth/window.innerHeight; var camera = new THREE.PerspectiveCamera( 30, aspect ); camera.position.set( 0, 120, 200 ); camera.lookAt( new THREE.Vector3( 0, -10, 0 ) ); // топчето за движене var ball = new THREE.Mesh( new THREE.SphereGeometry( 5, 32, 32 ), new THREE.MeshPhongMaterial( {color: 'orange', shininess: 10, specular: 'white', emissive: 'firebrick'} ) ); ball.castShadow = true; scene.add( ball ); // платформата var ground = new THREE.Mesh( new THREE.BoxGeometry( 160.2, 2.2, 100.2 ), new THREE.MeshPhongMaterial( {color: 'slateblue', shininess: 2, specular: 'white'} ) ); ground.position.y = -6; ground.receiveShadow = true; scene.add( ground ); // стъкленият корпус var glass = new THREE.Mesh( new THREE.BoxGeometry( 160, 10, 100 ), new THREE.MeshPhongMaterial( {color: 'azure', opacity: 0.2, transparent: true, shininess: 50, specular: 0x8080ff, side:THREE.BackSide} ) ); glass.receiveShadow = true; scene.add( glass ); // бялата рамка на стъкления корпус var frame = new THREE.BoxHelper( glass ); frame.material.color.set( 'white' ); scene.add( frame ); // светлина var light = new THREE.PointLight( 'white', 0.5 ); light.position.set( 0, 100, 0 ); light.castShadow = false; scene.add( light ); // и още една var light = new THREE.PointLight(); light.position.set( 0, 20, 0 ); light.castShadow = true; scene.add( light ); function absVec(v) { return new THREE.Vector3(Math.abs(v.x), Math.abs(v.y), Math.abs(v.z)); } function lessThanV(v1, v2) { return new THREE.Vector3(-1+2*(v1.x < v2.x), -1+2*(v1.y < v2.y), -1+2*(v1.z < v2.z)); } var movementV = new THREE.Vector3(1, 0, 0.5); var edgeV = new THREE.Vector3(80, 0, 50); function drawFrame() { scene.rotation.y += 0.001; movementV.multiply(lessThanV(absVec(ball.position).addScalar(5), edgeV)); ball.position.add(movementV); renderer.render( scene, camera ); }