• 系列博文-Three.js入门指南(张雯莉)-网格 setInterval方法 requestAnimationFrame方法 使用stat.js记录FPS


    第6章 动画

    在本章之前,所有画面都是静止的,本章将介绍如果使用Three.js进行动态画面的渲染。此外,将会介绍一个Three.js作者写的另外一个库,用来观测每秒帧数(FPS)。

    CSS3动画那么强,requestAnimationFrame还有毛线用?

    window.requestAnimationFrame  MDN

    小球下落例子

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>我随便写写的HTML小Demo合集</title>
        <link rel="stylesheet" href="css/bootstrap.css">
        <link rel="stylesheet" href="css/main.css">
    </head>
    <body onload="init()">
    <button>hehe</button>
        <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
    </body> 
        <script src="lib/jquery.js"></script>
        <script src="lib/bootstrap.js"></script>
        <script src="lib/underscore.js"></script>
        <script src="lib/backbone.js"></script>
        <script src="js/main.js"></script>
        <script src="lib/three.js"></script>
        <script src="lib/stat.js"></script>
        <script>
    var requestAnimationFrame = window.requestAnimationFrame 
            || window.mozRequestAnimationFrame
            || window.webkitRequestAnimationFrame
            || window.msRequestAnimationFrame;
    window.requestAnimationFrame = requestAnimationFrame;
    
    var scene = null;
    var camera = null;
    var renderer = null;
    
    var id = null;
    
    var stat = null;
    
    var ballMesh = null;
    var ballRadius = 0.5;
    var isMoving = false;
    var maxHeight = 5;
    
    var v = 0;
    var a = -0.01;
    
    function init() {
        stat = new Stats();
        stat.domElement.style.position = 'absolute';
        stat.domElement.style.right = '0px';
        stat.domElement.style.top = '0px';
        document.body.appendChild(stat.domElement);
    
        renderer = new THREE.WebGLRenderer({
            canvas: document.getElementById('mainCanvas')});
        scene = new THREE.Scene();
    
        camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
        camera.position.set(5, 10, 20);
        camera.lookAt(new THREE.Vector3(0, 3, 0));
        scene.add(camera);
    
        // ball
        ballMesh = new THREE.Mesh(new THREE.SphereGeometry(ballRadius, 16, 8), 
            new THREE.MeshLambertMaterial({
                color: 0xffff00
        }));
        ballMesh.position.y = ballRadius;
        scene.add(ballMesh);
    
        // plane
        var texture = THREE.ImageUtils.loadTexture('../img/chess.png', {}, function() {
            renderer.render(scene, camera);
        });
        texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
        texture.repeat.set(4, 4);
        var plane = new THREE.Mesh(new THREE.PlaneGeometry(5, 5),
                new THREE.MeshLambertMaterial({map: texture}));
        plane.rotation.x = -Math.PI / 2;
        scene.add(plane);
    
        var light = new THREE.DirectionalLight(0xffffff);
        light.position.set(10, 10, 15);
        scene.add(light);
    
        id = requestAnimationFrame(draw);
    }
    
    function draw() {
        stat.begin();
    
        if (isMoving) {
            ballMesh.position.y += v;
            v += a;
     if (ballMesh.position.y <= ballRadius) {
                // hit plane
                v = -v * 0.9;
            }
    
            if (Math.abs(v) < 0.001) {
                // stop moving
                isMoving = false;
                ballMesh.position.y = ballRadius;
            }
        }
    
        renderer.render(scene, camera);
    
        id = requestAnimationFrame(draw);
    
        stat.end();
    }
    
    function stop() {
        if (id !== null) {
            cancelAnimationFrame(id);
            id = null;
        }
    }
    
    function drop() {
        isMoving = true;
        ballMesh.position.y = maxHeight;
        v = 0;
    }
    
    $("button").click(drop);
        </script>
  • 相关阅读:
    数据结构_队列和滑动窗口
    数据结构_栈和单调栈
    数据结构_链表及邻接表
    JavaSE多线程
    AppExtension总结
    FlutterBloc 2.1.1迁移至6.0.6
    iOS通知总结
    Provider 4.3.2+2 f
    Fish-Redux 研究
    王道考研复习-操作系统-内存管理(三)
  • 原文地址:https://www.cnblogs.com/cndotabestdota/p/5748104.html
Copyright © 2020-2023  润新知