首页 > 其他分享 >ThreeJs实现简单的动画

ThreeJs实现简单的动画

时间:2024-02-02 17:32:51浏览次数:31  
标签:动画 ThreeJs 渲染 requestAnimationFrame THREE renderer 简单 var new

上一节实现可用鼠标控制相机的方式实现动态效果,但很多时候是需要场景自己产恒动态效果,而不是通过鼠标拖动,此时引入一个requestAnimationFrame方法,它实际上是通过定时任务的方式,每隔一点时间改变场景中内容后重新渲染一遍,间隔时间短的话视觉上就显示出连续的动画效果,Js本身也自带定时方法 setInterval,同样可以实现动画效果,但是性能上不如requestAnimationFrame,比如浏览器的当前窗口并非是threeJs页面,setInterval会一直循环执行,但是 requestAnimationFrame会停止,直到浏览器的Tab标签切换到threejs页面才会继续执行。下面的源码展示了通过requestAnimationFrame的方式实现动画效果。(mesh.rotation.x += 0.02是改变正方体网格的z轴旋转角度),requestAnimationFrame每执行一次就会旋转一次。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--引入three.js,这是使用three必须的js文件,此处引入的是外网提供的three文件,如果引入有问题可以到官网下载three文件后引入本地的theee.js文件-->
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
    <script src="three/OrbitControls.js"></script>
</head>

<body>
<script>
    /**
     * 创建场景对象Scene
     */
    var scene = new THREE.Scene();

    /**
     * 相机设置
     */
    //窗口宽度
    var width = window.innerWidth;
    //窗口高度
    var height = window.innerHeight;
    //窗口宽高比
    var k = width / height;
    //三维场景显示范围控制系数,系数越大,显示的范围越大
    var s = 200;
    //创建相机对象
    var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
    //设置相机位置
    camera.position.set(200, 300, 200);
    //设置相机方向(指向的场景对象)
    camera.lookAt(scene.position);

    /**
     * 光源设置
     */
        //新建点光源(常用光源分为点光源和环境光,点光源的效果类似灯泡,环境光的效果类似白天的太阳光)
    var point = new THREE.PointLight(0xffffff);
    //设置点光源的位置
    point.position.set(400, 200, 300);
    //将点光源添加到场景中
    scene.add(point);
	

    /**
     * 创建网格模型,也就是3D模型
     */
    //创建一个立方体几何对象Geometry
    var geometry = new THREE.BoxGeometry(100, 100, 100);
    //给几何体创建材质,这里是改为蓝色,材质对象Material
    var material = new THREE.MeshLambertMaterial({
        color: 0x0000ff
    });
    //网格模型对象Mesh
    var mesh = new THREE.Mesh(geometry, material);
    //网格模型添加到场景中,每个模型最终都要添加到场景中才会被渲染
    scene.add(mesh);

    /**
     * 创建渲染器对象
     */
    //创建渲染器对象(渲染要等所有东西都加进去再渲染场景,创建和3D模型和光源没有先后顺序)
    var renderer = new THREE.WebGLRenderer();
    //设置渲染区域尺寸(设置的是整个屏幕的长度和宽度
    renderer.setSize(width, height);
    //设置渲染的背景色
    renderer.setClearColor(0xb9d3ff, 1);
    //body元素中插入canvas对象,也可以在页面中添加div,并加上id,通过id指定在某个div中渲染
    document.body.appendChild(renderer.domElement);
	
	//循环渲染
	function render() {
		//执行渲染操作   指定场景、相机作为参数
		renderer.render(scene, camera);
		// 使用 requestAnimationFrame 函数安排下一次渲染
		requestAnimationFrame(render);
		//修改正方体网格的x轴旋转角度
		mesh.rotation.x += 0.02
	}
	//执行渲染
	render()
	
	//创建鼠标控制器	
	//let controls = new THREE.OrbitControls(camera, renderer.domElement );
	//监听控制器,每次拖动后重新渲染画面
	//controls.addEventListener('change', function () {
	//	renderer.render(scene, camera); //执行渲染操作
	//});
	
</script>
</body>
</html>

效果如下,这里是图片,只是其中一帧的样子,没有动态效果。看到动态效果可以把上面的代码复制到html文件中双击打开在浏览器中执行。

ThreeJs实现简单的动画_点光源


标签:动画,ThreeJs,渲染,requestAnimationFrame,THREE,renderer,简单,var,new
From: https://blog.51cto.com/BakerZhuang/9559829

相关文章

  • 史上最简单的日志告警方案,没有之一
    如果你在意生产环境的稳定性,希望自己的服务出问题时及时发现,大概率就有日志监控告警的需求,比如发现日志中有Error或Exception关键字就告警,比如通过日志统计某个服务的95分位延迟数据,延迟过高就告警,比如通过日志统计某个服务的statuscode,出现多个5xx就告警,等等。日志可......
  • react 点击按钮 div隐藏显示 添加展开收起动画效果
    js代码const[collapse,setCollapse]=useState(false)  const[showBack,setShowBack]=useState(false)  constchangeCollapse=()=>{//获取展开收起目标元素    constheaderDes=document.querySelector('.phone_header_des');  ......
  • 热门动画插件DoTween的使用
    做游戏基本都会用到插件,它能让你的效率更高,因为它里面都是写好了的方法,只要用就可以了。在众多动画插件中,DoTween脱颖而出,因为它用起来很简单也很方便,自然用的人就多了。那么我们也要学习下这个插件了。毕竟工作中用的还是蛮频繁的。你想想,你的UI动画,你难道要自己做动画吗?比如游戏......
  • 面试官:你能简单聊聊MyBatis执行流程
    本文分享自华为云社区《面试必问|聊聊MyBatis执行流程?》,作者:冰河。MyBatis源码解析大家应该都知道Mybatis源码也是对Jbdc的再一次封装,不管怎么进行包装,还是会有获取链接、preparedStatement、封装参数、执行这些步骤的。配置解析过程Stringresource="mybatis-config.x......
  • 工规和车规的简单区别
     车规级,即AutomotiveGrade,指要满足车载等级要求的元器件,AEC-Q系列标准是行业公认的车规元器件认证标准。AEC为美国汽车电子委员会(AutomotiveElectronicsCouncil),是由通用、福特和克莱斯勒为建立一套通用的零件资质及质量系统标准而设立,Q为Qualification的首字母,AEC-Q是AEC组......
  • 简单神经网络
    """前向传播解释:https://towardsdatascience.com/forward-propagation-in-neural-networks-simplified-math-and-code-version-bbcfef6f9250"""importmathimportrandom#Sigmoid激活函数defsigmoid_function(value:float,deriv:bool=F......
  • 网站弹出促销海报动画效果代码(带关闭按钮)
    在促销海报刚弹出时会抖动一两下<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>金币促销活动<......
  • 鸿蒙开发之发动画篇
    动画的原理是在一个时间段内,多次改变UI外观,由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧,对应一次屏幕刷新,而决定动画流畅度的一个重要指标就是帧率FPS(FramePerSecond),即每秒的动画帧数,帧率越高则动画就会越流畅。ArkUI中,产生动画的方......
  • 一个简单的Vulkan渲染器管线组织
    目录预计算管线逐帧管线逐帧预计算部分ShadowDepthPass逐帧计算部分G-BufferPassAOPassSSAOShadowPassCSMLightingPassPBR-IBLPassCompositePass总结问题参考资料延迟渲染管线核心在于先记录一遍每个像素上的信息,如Material、Normal、Albedo等,即G-Buffer,世界空间坐标可通......
  • 数据库MySQL8.0.29安装与备份||了解和掌握MySQL的安装和简单使用和备份数据
    内容:了解和掌握MySQL的安装和简单使用:(1) 了解安装MySQL的软硬件环境和安装方法;(2) 熟悉MySQL的相关基本使用;(3) 熟悉MySQL的构成和相关工具;(4) 通过MySQL的使用来理解数据库系统的基本概念。要求:1. 在微机上安装MySQL数据库系统,为后续实验搭建实验环境,提供前期准备;2. 完成实......