three.js,一个WebGL引擎,基于JavaScript,可直接运行GPU驱动游戏与图形驱动应用于浏览器。其库提供的特性与API以绘制3D场景于浏览器。
运行环境:
Three.js 是一款运行在浏览器中的3D 引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。你可以在它的主页上看到许多精彩的演示。不过,这款引擎还处在比较不成熟的开发阶段,其不够丰富的 API 以及匮乏的文档增加了初学者的学习难度(尤其是文档的匮乏)three.js的代码托管在github上面。
官网:1. threejs文件包下载和目录简介 | Three.js中文网
包下载地址:Releases · mrdoob/three.js · GitHub
开发环境当中使用:npm instell three --save(下载)
import * as Three from 'three'(引入)
Scene-场景,可以理解成一个3D的虚拟场景,用来模拟三维世界的
Camera-相机|摄像机,可以理解成一个3D场景的观测点
Renderer-渲染器
1. 创建场景
2.创建几何体
3.为几何体挑选网格材质
4.将物体mesh添加到场景
5.设置一个相机,可以通过相机的位置,表示观测点以及设置观测点的最近和最远距离,观测的角度等信息
6.设置一个渲染器:
7.将照片(渲染结果)插入到页面节点
a)引入主文件
import * as THREE from 'three';//主文件
b)创建3d场景
const scene=new THREE.Scene();
c)在场景中添加物体
//1.在场景中添加物体
const geometry = new THREE.BoxGeometry(100, 100, 100);//矩形
//2.物体外观材质
const material = new THREE.MeshBasicMaterial({
color:0xFF0000,//红色
})
//3.创建一个网格模型(将长方体和材质整合在一起)
const mesh = new THREE.Mesh(geometry, material);
//4.设置网格模型mesh的位置
mesh.position.set(0,0,0);//如果不设置,默认是原点的位置 0 0 0位置
//5.将物体mesh 添加到场景
scene.add(mesh);
d) 添加三维坐标系(有助于观看物体的x、y、z轴;不是必选项)
//添加三维坐标系
const axesHelper = new THREE.AxesHelper(200);//值必须必物体值更大(避免观察不到)
//把坐标系应用到场景
scene.add(axesHelper);
e)相机的相关设置
//7.设置一个相机,通过相机来观测mesh的位置
//参数说明:1.摄像机角度 2.宽高比 3.最近观测距离 4.最远观测距离
const camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,1,1000);
//设置相机位置
camera.position.set(200, 200, 200);
//设置相机观察目标点的位置
camera.lookAt(0,0,0);
f)设置一个渲染器,让物体能展示在页面上
//8.设置一个渲染器(咔)
const renderer=new THREE.WebGLRenderer();
//设置canvas画布的宽高
renderer.setSize(window.innerWidth,window.innerHeight);
//渲染成像,生成一张照片
renderer.render(scene,camera);
//9.将照片插入到页面节点
document.body.appendChild(renderer.domElement);
通过上面的操作就可以生成第一个3d模型作品啦~~~,使用下面的操作可以让您的3d作品变得更加美观哟~~~
//添加点光源 //参数:1.光源的颜色 2.光源的亮度 3.光源照射的范围 4.衰减度
const Light = new THREE.PointLight(0xccccc, 1);
Light.position.set(100, 150, 0); scene.add( Light );
//参数 1.需要被可视化的光源 2.点光源大小
// 光源辅助观察(能够看到官员的照射位置)
const pointLightHelper = new THREE.PointLightHelper(Light, 10); scene.add(pointLightHelper);
//平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(80, 100, 50)
directionalLight.target = mesh; scene.add( directionalLight );
//可视化平行光 (能够看到光源的照射位置)
const directionalLightHelper=new THREE.DirectionalLightHelper(directionalLight,5);
scene.add( directionalLightHelper );
//添加环境光
const ambient = new THREE.AmbientLight(0x404040);
scene.add(ambient)
原理:相机位置改变导致物体旋转
import {OrbitControls} from 'three/addons/controls/OrbitControls.js'
//摄像机控件
//创建摄像机控件的参数(1.改变的相机 2.监控的区域范围)
const controls=new OrbitControls(camera,renderer.domElement);
//拖动物体的时候需要设置相机的位置,让它随着鼠标拖动而变换方位
controls.addEventListener("change",()=>{
renderer.render(scene,camera)
})
controls.target.set(0,0,0)//控件的位置和相机的位置设置成一直,鼠标拖动的时候就不会跳
controls.update();//更新控件,不然可能会出现控件无法识别到设置被更新过的情况
function render(){
// const spt=clock.getDelta()*1000;//*1000表示将秒换算成毫秒
// console.log("两帧之间间隔的毫秒:"+spt)
mesh.rotateY(0.01);//0.01弧度,不是度
renderer.render(scene,camera);//调用一次render就咔一张照片
requestAnimationFrame(render)//浏览器自带方法
}
render()
更多详情设置请参考官网1. threejs文件包下载和目录简介 | Three.js中文网