美文网首页
为场景添加动画

为场景添加动画

作者: Codifier | 来源:发表于2019-11-06 16:37 被阅读0次
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Adding Animation</title>
        <script src="../../three-part/threejs/three.js"></script>
        <script src="../../three-part/utils/stats.min.js"></script>
        <script src="../util/util.js"></script>
        <style>
            body {
                margin: 0;
                overflow: hidden;
            }
        </style>
    </head>
    <body>
    <div id="container"></div>
    <script type="text/javascript">
        init();
        function init(){
            // show FPS
            let stats = initStats();
            // Scenes allow you to set up what and where is to be rendered by three.js.
            // This is where you place objects, lights and cameras.
            let scene = new THREE.Scene();
            /**
             * Camera that uses perspective projection
             * PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
             * fov — Camera frustum vertical field of view.
             * aspect — Camera frustum aspect ratio.
             * near — Camera frustum near plane.
             * far — Camera frustum far plane.
             */
            let camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
    
            // The WebGL renderer displays your beautifully crafted scenes using WebGL.
            let render = new THREE.WebGLRenderer();
            // Sets the clear color and opacity.
            render.setClearColor(new THREE.Color(0x000000));
            render.setSize(window.innerWidth, window.innerHeight);
            // If set, use shadow maps in the scene. Default is false.
            render.shadowMap.enabled = true;
            /**
             * An axis object to visualize the 3 axes in a simple way.
             * The X axis is red. The Y axis is green. The Z axis is blue.
             * AxesHelper( size : Number )
             * size -- (optional) size of the lines representing the axes. Default is 1.
             */
            let axes = new THREE.AxesHelper(20);
            scene.add(axes);
    
            // create a plane
            /**
             * PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer)
             * width — Width along the X axis. Default is 1.
             * height — Height along the Y axis. Default is 1.
             * widthSegments — Optional. Default is 1.
             * heightSegments — Optional. Default is 1.
             * @type {PlaneGeometry}
             */
            let planeGeometry = new THREE.PlaneGeometry(60, 20, 4, 4);
            // A material for drawing geometries in a simple shaded (flat or wireframe) way.
            let planeMaterial = new THREE.MeshLambertMaterial({
                color : 0xaaaaa
            });
            /**
             * Representing triangular polygon mesh based objects
             * Mesh( geometry : Geometry, material : Material )
             * geometry — (optional) an instance of Geometry or BufferGeometry. Default is a new BufferGeometry.
             * material — (optional) a single or an array of Material. Default is a new MeshBasicMaterial
             * @type {Raycaster.params.Mesh|Mesh}
             */
            let plane = new THREE.Mesh(planeGeometry, planeMaterial);
            plane.rotation.x = -0.5 * Math.PI;
            plane.position.set(15, 0, 0);
            // Whether the material receives shadows. Default is false.
            plane.receiveShadow = true;
            scene.add(plane);
    
            // create a cube
            /**
             * BoxGeometry is a geometry class for a rectangular cuboid with a given 'width', 'height', and 'depth'.
             * On creation, the cuboid is centred on the origin, with each edge parallel to one of the axes.
             * BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer)
             * width — Width; that is, the length of the edges parallel to the X axis. Optional; defaults to 1.
             * height — Height; that is, the length of the edges parallel to the Y axis. Optional; defaults to 1.
             * depth — Depth; that is, the length of the edges parallel to the Z axis. Optional; defaults to 1.
             * widthSegments — Number of segmented rectangular faces along the width of the sides. Optional; defaults to 1.
             * heightSegments — Number of segmented rectangular faces along the height of the sides. Optional; defaults to 1.
             * depthSegments — Number of segmented rectangular faces along the depth of the sides. Optional; defaults to 1.
             * @type {BoxGeometry}
             */
            let cubeGeometry = new THREE.BoxGeometry(6, 6, 6, 3, 3, 3);
            // The material uses a non-physically based Lambertian model for calculating reflectance.
            // This can simulate some surfaces (such as untreated wood or stone) well,
            // but cannot simulate shiny surfaces with specular highlights (such as varnished wood).
            let cubeMatrial = new THREE.MeshLambertMaterial({
                color : 0xff0000
            });
            let cube = new THREE.Mesh(cubeGeometry, cubeMatrial);
            cube.position.set(5, 4, 0);
            // Whether the object gets rendered into shadow map. Default is false.
            cube.castShadow = true;
            scene.add(cube);
    
            // create a sphere
            /**
             * A class for generating sphere geometries
             * SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)
             * radius — sphere radius. Default is 1.
             * widthSegments — number of horizontal segments. Minimum value is 3, and the default is 8.
             * heightSegments — number of vertical segments. Minimum value is 2, and the default is 6.
             * phiStart — specify horizontal starting angle. Default is 0.
             * phiLength — specify horizontal sweep angle size. Default is Math.PI * 2.
             * thetaStart — specify vertical starting angle. Default is 0.
             * thetaLength — specify vertical sweep angle size. Default is Math.PI.
             * @type {SphereGeometry}
             */
            let sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
            let sphereMatrial = new THREE.MeshLambertMaterial({
                color : 0x7777ff
            });
            let sphere = new THREE.Mesh(sphereGeometry, sphereMatrial);
            sphere.position.set(20, 4, 2);
            sphere.castShadow = true;
            scene.add(sphere);
    
            // add a spotlight
            /**
             * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets.
             * SpotLight( color : Integer, intensity : Float, distance : Float, angle : Radians, penumbra : Float, decay : Float )
             * color - (optional) hexadecimal color of the light. Default is 0xffffff (white).
             * intensity - (optional) numeric value of the light's strength/intensity. Default is 1.
             * distance - Maximum range of the light. Default is 0 (no limit).
             * angle - Maximum angle of light dispersion from its direction whose upper bound is Math.PI/2.
             * penumbra - Percent of the spotlight cone that is attenuated due to penumbra. Takes values between zero and 1. Default is zero.
             * decay - The amount the light dims along the distance of the light.
             */
            let spotlight = new THREE.SpotLight(0xffffff);
            spotlight.position.set(-40, 40, -15);
            spotlight.castShadow = true;
            // A Vector2 defining the width and height of the shadow map.
            spotlight.shadow.mapSize = new THREE.Vector2(1024, 1024);
            spotlight.shadow.camera.far = 130;
            spotlight.shadow.camera.near = 40;
            scene.add(spotlight);
    
            camera.position.set(-30, 40, 30);
            camera.lookAt(scene.position);
    
            document.getElementById("container").appendChild(render.domElement);
    
            let step = 0;
            renderScene();
    
            function renderScene() {
                stats.update();
                // rotate the cube
                cube.rotation.x += 0.02;
                cube.rotation.y += 0.02;
                cube.rotation.z += 0.02;
                // bouncing the ball
                step += 0.04;
                sphere.position.x = 20 + 10 * (Math.cos(step));
                sphere.position.y = 2 + 10 * Math.abs(Math.sin(step));
                requestAnimationFrame(renderScene);
                render.render(scene, camera);
            }
        }
    </script>
    </body>
    </html>
    

    运行结果:


    相关文章

      网友评论

          本文标题:为场景添加动画

          本文链接:https://www.haomeiwen.com/subject/cqoubctx.html