当前位置:网站首页>THREEJS基础入门
THREEJS基础入门
2022-06-29 20:50:00 【Ss、、帅海】
大家好啊,又是长时间没更新,最近在学习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>边栏推荐
- VoIP Push 在海外音视频业务中的应用
- Cantata version 9.5 has officially passed the sgs-t Ü V certification and conforms to all major software safety standards
- Clock tree synthesis (CTS)
- Logical structure and physical structure
- Oracle reserved word query
- Enter the year and month to find the total number of days in the month
- Wangedit rich text editor usage (detailed)
- 双目立体视觉摄像头的标定、矫正、世界坐标计算(opencv)
- Win7 easy connect 提示:选路连接失败,可能当前连接网络异常,请稍后重试
- [buuctf.reverse] 142_ [SUCTF2019]babyunic
猜你喜欢

Cmake development - Multi Directory Project

Sentinel's quick start takes you through flow control in three minutes

【编译原理】类型检查

The reason why the log analysis tool of "operation and maintenance" is used more and more frequently

智能门锁主流品牌有哪些?选购门锁时要注重产品的哪些特性?

Chainsafe cross chain bridge deployment tutorial

0/1分数规划专题

阿里云发布《中国机器人产业图谱(2022)》,122页pdf

Fastadmin background setting radio button

Exercise 8 Chapter 8 Verilog finite state machine design -4 Verilog quartus Modelsim
随机推荐
「运维有小邓」Active Directory 密码过期通知功能
空间导电盘式滑环材料的选择
LSF-bsub命令
Nutch2.1在Windows平台上使用Eclipse debug 存储在MySQL的搭建过程
Ovirt database modify delete node
期末复习【微机原理】
深入Go底层原理,重写Redis中间件实战无密
Win7 Easy Connect prompt: route selection connection failed. The current connection network may be abnormal. Please try again later
Information system project manager -- Chapter VII examination questions of project cost management over the years
注解
60 days of remote office experience sharing | community essay solicitation
Win7 easy connect 提示:选路连接失败,可能当前连接网络异常,请稍后重试
导航 实验【微机原理】【实验】
I found another cross domain method by chance. I don't know if anyone has ever played this way
Three. JS development: drawing of thick lines
计算成像前沿进展
mapbox-gl开发教程(十二):加载面图层数据
String类的常用方法
"Xiaodeng" active directory batch user creation in operation and maintenance
双目立体视觉摄像头的标定、矫正、世界坐标计算(opencv)