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为onject.onBeforeRender = function(para1,para2,...){}
这种形式,就可以定义,在何时渲染。
一个示例
效果
关键代码
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
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步