// 方式 1: 导入整个 three.js核心库
import * as THREE from 'three';
const scene = new THREE.Scene();
// 方式 2: 仅导入你所需要的部分
import { Scene } from 'three';
const scene = new Scene();
//先定义渲染器尺寸,下面是浏览器全屏
const size = {
width: window.innerWidth,
height: window.innerHeight,
}
//获取canvas Dom元素
const canvas = document.querySelector('canvas.webgl')
//将dom引入传入渲染器,用来创建渲染器
const renderer = new THREE.WebGLRenderer({ canvas })
//设置渲染器尺寸
renderer.setSize(size.width, size.height)
//设置渲染器像素比 避免有些高分辨率的设备把屏幕弄得太模糊,设置像素比最大2X
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
//创建场景
const scene = new THREE.Scene()
//创建mesh模型(由几何体+材质) 正方体
//长宽高为1的立方体 长宽高的线条分段是5条,用来调整网格密度
const geometry = new THREE.BoxGeometry(1, 1, 1, 5, 5, 5)
const material = new THREE.MeshBasicMaterial({
color: 0x03c03c, // 材质的颜色
transparent:true,// 开启透明
opacity:0.5,// 设置透明度
wireframe: true, //显示网格虚线
})
const mesh = new THREE.Mesh(geometry, material)
mesh.position.set(0,0,0)
scene.add(mesh)
如图所示
//初始化相机 透视相机
//这里是以45度观察 不设最远最近距离
const camera = new THREE.PerspectiveCamera(45, size.width/size.height)
//相机的位置放在在 x=3 y=3 z=3的位置
camera.position.set(3, 3, 3)
//然后相机看向 x=0 y=0 z=0的位置
camera.lookAt(0, 0, 0)
//场景添加相机
scene.add(camera)
已经完成所有场景布置了, 可以调用渲染器的render渲染方法,需要传入参数场景Scene和相机camera
renderer.render(scene, camera)
这个时候就可以看到一个网格立方体了
但是这种太模糊,没有位置概念,可以引入辅助坐标系,以方便更好观察
Tips:以下代码需要在render渲染调用之前加,render执行过后渲染就完毕了
//添加坐标轴 辅助查看
const axesHelper = new THREE.AxesHelper(150)
scene.add(axesHelper)
可以看到多了三个线,其中红色的是x轴、绿色是 y轴、蓝色的是z轴,xyz交汇处就是0,0,0原点
目前我们上面看到的渲染是静态渲染,只渲染了一次,可以利用requestAnimationFrame浏览器自带的刷新器,动态的去改变网格对象的参数,达到视线动态渲染旋转的效果
在最后面加上如下代码
// 动态渲染
const tick = () => {
renderer.render(scene, camera)
mesh && (mesh.rotation.x += 0.02) //以x轴旋转
// mesh && (mesh.rotation.y += 0.02) //以y轴旋转
// mesh && (mesh.rotation.z += 0.02) //以z轴旋转
window.requestAnimationFrame(tick)
}
tick()
就能看到立方体开始旋转了
目前相机观察视角是固定的,利用OrbitControls可以利用鼠标或者手势拖拽调整相机的观察视角
//在代码最前面import 轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
//在渲染前创建轨道控制器 用来用鼠标控制相机
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true
// 动态渲染 更新控制器update
const tick = () => {
renderer.render(scene, camera)
mesh && (mesh.rotation.x += 0.02) //以x轴旋转
// mesh && (mesh.rotation.y += 0.02) //以y轴旋转
// mesh && (mesh.rotation.z += 0.02) //以z轴旋转
controls.update() // 更新控制器
window.requestAnimationFrame(tick)
}
tick()
附 gitte源码: ThreeJsDemo: ThreeJs Demo