• Three.js中的动画实现02-[Three.js]-[Object3D属性.onAfterRender/.onBeforeRender]


    Table Of Content
    Object3D简介以及两个属性的介绍
    一个示例

    Object3D简介以及两个属性的介绍

    这是Three.js中大部分对象的基类,提供了一系列的属性和方法来对三维空间中的物体进行操控。这里介绍该基类的两个属性。
    .onAfterRender : function

    一个可选的回调函数,在Object3D渲染之后直接执行。 使用以下参数来调用此函数:renderer,scene,camera,geometry,material,group。

    .onBeforeRender : function

    一个可选的回调函数,在Object3D渲染之前直接执行。 使用以下参数来调用此函数:renderer,scene,camera,geometry,material,group。

    其实在前面讲requestAnimationFrame时,demo中就用到了.onBeforeRender这个属性。
    原因是,我们写的是模块化,并不是所有逻辑都写在一个文件中,这样如果我们需要实现动画,就需要在渲染器更新函数中对我们创建的模型进行操作。如果按照这种想法,我们需要把在专门创作模型的js文件中定义的模型变量传入到渲染器更新函数所载的js文件,这个过程很繁琐,易出错。 因此,Three.js为大多数3D模型提供了这样两个属性。 只需要通过onject.onBeforeRender = function(para1,para2,...){}这种形式,就可以定义,在何时渲染。

    一个示例

    效果

    ![](https://img2018.cnblogs.com/blog/1735896/202001/1735896-20200101234552641-303346906.gif)

    关键代码

    function draw(scene) {
    //方体
    var cubeGeometry = new THREE.BoxGeometry(20,20,20);
    var cubeMaterial = new THREE.MeshLambertMaterial({
        color:0xffaaaa,
        wireframe:true
    });
    var cube = new THREE.Mesh(cubeGeometry,cubeMaterial);
    cube.position.x = 0;  cube.position.y = 10;  cube.position.z = 80;
    cube.castShadow  = true;
    cube.onBeforeRender = function(){//关键
        this.rotation.x += 0.02;
        this.rotation.y += 0.02;
        this.rotation.z += 0.02;
    }
    scene.add(cube)
    
    //球体
    var sphereGeometry = new THREE.SphereGeometry(20,40,50);
    var sphereMaterial = new THREE.MeshLambertMaterial({
        color:0x777777,
        wireframe: true
    });
    var sphere = new THREE.Mesh(sphereGeometry,sphereMaterial);
    sphere.castShadow  = true;
    var step = 0;
    sphere.onBeforeRender = function(){//关键
    step += 0.04;
    sphere.position.x = 20 + (10*(Math.cos(step)));
    sphere.position.y = 20 + (10*Math.abs(Math.sin(step)));
    }
    
    scene.add(sphere)
    
    
    //地面
    var planeGeometry = new THREE.PlaneGeometry(300,300,20,20);
    var planeMaterial = new THREE.MeshPhongMaterial({
        color:0x222222,
        side: THREE.Double
    });
    var plane = new THREE.Mesh(planeGeometry,planeMaterial);
    plane.rotation.x = -0.5 * Math.PI;
    plane.position.x = 0;
    plane.position.y = -5;
    plane.position.z = 0
    plane.receiveShadow   = true;
    scene.add(plane)
    
    //灯光
    var spotlight = new THREE.SpotLight(0xffffff);
    spotlight.position.set(-40,60,-10);
    spotlight.castShadow = true
    scene.add(spotlight);
    
    }
    

    值得注意的是球体的弹跳(bounce)的实现
    x方向:

    sphere.position.x = 20 + (10*(Math.cos(step)));
    

    该方向上的增量变化是10~30
    y方向:

    sphere.position.y = 20 + (10*Math.abs(Math.sin(step)));
    

    该方向上的增量是20~30

    该demo的完整代码在这里:Link

  • 相关阅读:
    令人抓狂的redis和rediscluster Python驱动包的安装
    基于Docker的Consul集群实现服务发现
    应用中引入缓存层后,缓存和持久化层数据一致性的思考
    Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了
    Redis Cluster 自动化安装,扩容和缩容
    mysql 8.0 忘记root密码后重置
    MySQL 8.0部分弃用的参数整理
    MySQL Online DDL与DML并发阻塞关系总结
    MySQL Error Log 文件丢失导致The server quit without updating PID file启动失败的场景
    MySQL删除大表时潜在的问题(drop table,truncate table)
  • 原文地址:https://www.cnblogs.com/jaycethanks/p/12131040.html
Copyright © 2020-2023  润新知