欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

three.js 的简单实例

程序员文章站 2024-03-16 18:11:46
...

three.js 的简单实例

三大主件: 渲染器、场景、相机

思想核心: 相机获取到场景内显示的内容, 然后再通过渲染器渲染到画布上面

渲染器: 实例化渲染器的同时生成的一个 Canvas 画布, 之后将这个画布添加到了 DOM 当中

场景: 场景只是一个容器, 显示的内容需要进行添加, 添加一个内容称作一个网格, 每个网格基本上包括几何体和材质, 网格也称之为模型

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title>three</title>
		<style>
			body {
				margin: 0;
			}
			
			canvas {
				width: 100%;
				height: 100%;
				display: block;
			}
		</style>
	</head>

	<body onload="init()">
		<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
		<script type="text/javascript" src="js/three.min.js"></script>
		<script type="text/javascript" src="js/stats.min.js"></script>
		<script type="text/javascript" src="js/dat.gui.min.js"></script>
		<script>
			//声明一些全局变量
			var renderer, camera, scene, geometry, material, mesh, stats, rotate = true;

			//初始化渲染器
			function initRenderer() {
				renderer = new THREE.WebGLRenderer(); //实例化渲染器
				renderer.setSize(window.innerWidth, window.innerHeight); //设置宽和高
				document.body.appendChild(renderer.domElement); //添加到dom
			}

			//初始化场景
			function initScene() {
				scene = new THREE.Scene(); //实例化场景
			}

			//初始化相机
			function initCamera() {
				camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200); //实例化相机
				camera.position.set(0, 0, 15); //初始化的坐标
			}

			//创建模型
			function initMesh() {
				geometry = new THREE.BoxGeometry(2, 2, 2); //创建几何体
				material = new THREE.MeshNormalMaterial(); //创建材质
				mesh = new THREE.Mesh(geometry, material); //创建网格
				scene.add(mesh); //将网格添加到场景
			}

			//运行动画
			function animate() {
				requestAnimationFrame(animate); //循环调用函数

				//判断是否可以旋转
				if(rotate) {
					mesh.rotation.x += 0.01; //每帧网格模型的沿x轴旋转0.01弧度
					mesh.rotation.y += 0.02; //每帧网格模型的沿y轴旋转0.02弧度
				}

				stats.update(); //更新性能检测框
				renderer.render(scene, camera); //渲染界面
			}

			//性能检测框
			function initStats() {
				stats = new Stats();
				document.body.appendChild(stats.dom);
			}

			//创建调试框
			function initGui() {

				//控制参数初始值
				controls = {
					positionX: 0,
					positionY: 0,
					positionZ: 0,
					rotate: true
				};
				
				gui = new dat.GUI(); //实例化对象
				gui.add(controls, "positionX", -10, 10).onChange(updatePosition);
				gui.add(controls, "positionY", -5, 5).onChange(updatePosition);
				gui.add(controls, "positionZ", -10, 10).onChange(updatePosition);

				function updatePosition() {
					mesh.position.set(controls.positionX, controls.positionY, controls.positionZ);
				}

				gui.add(controls, "rotate").name("旋转").onChange(function(e) {
					rotate = e;
				});
			}

			//初始化函数,页面加载完成是调用
			function init() {
				initRenderer();
				initScene();
				initCamera();
				initMesh();
				initStats();
				initGui();
				animate();
			}
		</script>

	</body>

</html>