大家好啊,又是长时间没更新,最近在学习threejs,发现很好玩,于是大概学习了一下
什么是threejs,很简单,你将它理解成three + js就可以了。three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript 来写3D程序的意思。
Javascript是运行在网页端的脚本语言,那么毫无疑问Three.js也是运行在浏览器上的。
先说配置环境吧,如果已经配置过node的,那就直接npm下载吧,如果没有配置过得,或者想快速简单的实操一下,那么推荐下载vscode上的一个插件叫做live server
这样就可以正常打开了。
首先,我们要定义threejs中最基础的东西,scene(场景)、camera(相机)和renderer(渲染器)。
//创建3D场景对象Scene
var scene = new THREE.Scene();
//创建一个透视摄像机对象
let width = window.innerWidth
let height = window.innerHeight
const camera = new THREE.PerspectiveCamera(45, width / height, 1, 8000)
//创建一个渲染器对象
let renderer = new THREE.WebGLRenderer()
此时,基本步骤已经做好,场景,相机,渲染器都已经new出来了,当然,还没完
透视相机参数详解
第一个参数就是视场(也就是角度大小),第二个是宽高比,第三个就是近面的距离,第四个就是远面的距离。
此时,我们要先对渲染器做一些操作,
//设置渲染器的大小
renderer.setSize(width, height)
//咔 渲染操作
renderer.render(scene, camera)
//添加到页面中
document.body.appendChild(renderer.domElement)
此时,如果你打开的页面是这样的,那么这几步就是没问题的
但是你会发现有两个下拉框,但是你又不想要,你可以这样,加点css样式就可以
body {
margin: 0;
padding: 0;
box-sizing: border-box;
overflow: hidden;
}
此时,这两个下拉框就没有了,页面一片黑漆漆的
这里,我们就要创建几何模型了,我这里创建一个最简单的几何对象
// 创建一个长方体几何对象Geometry
var geometry = new THREE.BoxGeometry(100, 100, 100);
后面三个参数分别对应这长宽高
此时,我们就需要设置一下相机参数
//设置相机位置
camera.position.set(200, 200, 200)
//设置相机在哪拍摄
camera.lookAt(0, 0, 0)
当然,我们创建几何模型还不够,需要创建一个基础材质对象Material,不需要光照就可以显示的那种
var material = new THREE.LineBasicMaterial({})
我们可以设置一个颜色,在那个大括号里面可以写入我们的配置项
//创建一个材质对象Material
var material = new THREE.LineBasicMaterial({
color: 'pink',
// 开启透明
// transparent: true,
//透明度
opacity: 1
});
此时,我们还需要创建一个网格模型对象Mesh
将几何模型和材质放进去,并将其添加到场景中
//创建一个网格模型对象Mesh
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
此时,你就可以看到这样的场景
那说明你第一个小案例已经成功,
那我们趁热打铁,,生成121个这样的立方体
我们只需要一个双层for循环
for (let i = 0; i <= 10; i++) {
for (let j = 0; j <= 10; j++) {
//创建一个网格模型对象Mesh
var mesh = new THREE.Mesh(geometry, material);
mesh.position.set(i * 200, 0, j * 200);
//将网格模型对象添加到场景对象中
scene.add(mesh);
}
}
但是,我们打开网页,发现生成的是这样子的
此时,我们仅需要把相机参数改一下,因为站得高,才能看得远嘛
camera.position.set(2000, 2000, 2000)
camera.lookAt(1000, 0, 1000)
但是这时你想要滑动页面看看剩下的,你却发现滑动不了,别担心,你只需要这样
首先引入一个小小的控件
<script src="./three.js-r137/examples/js/controls/OrbitControls.js"></script>
然后将控件实例化就行
//创建一个控制器对象
const controls = new THREE.OrbitControls(camera, renderer.domElement)
controls.target.set(1000,0,1000)
controls.update()
controls.addEventListener('change', function () {
renderer.render(scene, camera)
})
此时,你就可以随意滑动你的页面来欣赏这121个小立方体了
好了,本篇到此结束,附上源码供大家参考
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
margin: 0;
padding: 0;
box-sizing: border-box;
overflow: hidden;
}
</style>
</head>
<body>
</body>
<script src="./three.js-r137/build/three.js"></script>
<script src="./three.js-r137/examples/js/controls/OrbitControls.js"></script>
<script>
//创建3D场景对象Scene
var scene = new THREE.Scene();
//创建网络模型
// 创建一个长方体几何对象Geometry
var geometry = new THREE.BoxGeometry(100, 100, 100);
//创建一个材质对象Material
var material = new THREE.LineBasicMaterial({
color: 'pink',
// //开启透明
// transparent: true,
//透明度
opacity: 1
});
//创建一个网格模型对象Mesh
// var mesh = new THREE.Mesh(geometry, material);
// scene.add(mesh);
for (let i = 0; i <= 10; i++) {
for (let j = 0; j <= 10; j++) {
//创建一个网格模型对象Mesh
var mesh = new THREE.Mesh(geometry, material);
mesh.position.set(i * 200, 0, j * 200);
//将网格模型对象添加到场景对象中
scene.add(mesh);
}
}
//创建一个透视摄像机对象
let width = window.innerWidth
let height = window.innerHeight
const camera = new THREE.PerspectiveCamera(45, width / height, 1, 8000)
// camera.position.set(200, 200, 200)
camera.position.set(2000, 2000, 2000)
// camera.lookAt(0, 0, 0)
camera.lookAt(1000, 0, 1000)
//创建一个渲染器对象
let renderer = new THREE.WebGLRenderer()
//设置渲染器的大小
renderer.setSize(width, height)
//设置背景颜色
// renderer.setClearColor('gold', 0.5)
//咔 渲染操作
renderer.render(scene, camera)
//添加到页面中
document.body.appendChild(renderer.domElement)
//创建一个控制器对象
const controls = new THREE.OrbitControls(camera, renderer.domElement)
controls.target.set(1000,0,1000)
controls.update()
controls.addEventListener('change', function () {
renderer.render(scene, camera)
})
</script>
</html>