安装:
npm i three -S
一、渲染第一个场景和物体
import * as THREE from "three";
//目标:了解three.js最基本的内容
//1.创建场景
const scene = new THREE.Scene();
//2.创建相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
//3.设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera)
//4.设置物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1);
const cubeMaterial = new THREE.MeshBasicMaterial({color:new THREE.Color(0xffff00,1,0)})
//创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
//将几何体添加到场景
scene.add(cube)
//5.初始化渲染器
const render = new THREE.WebGLRenderer();
// 设置渲染尺寸大小
render.setSize(window.innerWidth,window.innerHeight);
//将webgl渲染的canvas内容添加到body
document.body.appendChild(render.domElement);
//使用渲染器,通过相机将场景渲染进来
render.render(scene,camera)
二、轨道控制器查看物体
import * as THREE from "three";
//目标:了解轨道控制器的最基本的内容
//1.导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera)
const cubeGeometry = new THREE.BoxGeometry(1,1,1);
const cubeMaterial = new THREE.MeshBasicMaterial({color:new THREE.Color(0xffff00,1,0)})
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
scene.add(cube)
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(render.domElement);
// render.render(scene,camera)
//2.创建轨道控制器 因为每一帧都要渲染一下,所以书写一个渲染函数
const controls = new OrbitControls(camera,render.domElement)
//3.渲染函数
function renderfun(){
render.render(scene,camera);
//渲染下一帧的时候就会调用render函数
requestAnimationFrame(renderfun)
}
renderfun()
三、坐标辅助器
import * as THREE from "three";
//目标:三维坐标轴
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera)
const cubeGeometry = new THREE.BoxGeometry(1,1,1);
const cubeMaterial = new THREE.MeshBasicMaterial({color:new THREE.Color(0xffff00,1,0)})
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
scene.add(cube)
//1.创建坐标轴
const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera,render.domElement)
function renderfun(){
render.render(scene,camera);
requestAnimationFrame(renderfun)
}
renderfun()
四、3D物体的移动
import * as THREE from "three";
//目标:3d物体的移动
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
//直接设置位置(方法)
// cube.position.set(0,0,5) 设置在z轴5
//直接设置位置X
// cube.position.x = 5
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
function renderfun() {
//设置物体在x轴来回移动
cube.position.x += 0.1;
if (cube.position.x >= 5) cube.position.x = 0;
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
五、物体缩放和旋转
import * as THREE from "three";
//目标:3d物体的移动、缩放、旋转
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
//直接设置位置(方法)
// cube.position.set(0,0,5) 设置在z轴5
//直接设置位置X
// cube.position.x = 5
//放大和缩小
// cube.scale.set(1,2,1)
// cube.scale.x = 2
// 旋转
cube.rotation.set(Math.PI / 4 , 0 , 0)
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
function renderfun() {
//设置物体在x轴来回移动
cube.position.x += 0.01
cube.rotation.x += 0.01
if (cube.position.x >= 5) cube.position.x = 0
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
六、Gsap动画库的基本使用
安装:
npm i gsap
import * as THREE from "three";
//目标:了解gsap的基本使用
// 1.导入gsap
import gsap from "gsap";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
cube.rotation.set(Math.PI / 4, 0, 0);
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
//2.设置动画
var animate = gsap.to(cube.position, { x: 5, duration: 5 ,onComplete:()=>{
console.log("动画完成");
},onStart:()=>{
console.log("动画开始");
},
// 无限次循环为-1
repeat:-1,
// 往返运动
yoyo:true,
// 延时运动
delay:2
});
window.addEventListener("click",()=>{
//暂停
animate.pause()
})
window.addEventListener("dblclick",()=>{
//恢复
animate.resume()
})
function renderfun() {
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
七、实现尺寸变化自适应画面
import * as THREE from "three";
import gsap from "gsap";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
cube.rotation.set(Math.PI / 4, 0, 0);
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
//设置控制器阻尼,让控制器具有惯性,必须在循环里调用.update()
controls.enableDamping = true
gsap.to(cube.position, { x: 5, duration: 5 ,repeat:-1,yoyo:true,delay:2});
function renderfun() {
// 在这里调用update()方法
controls.update()
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
//监听画面变化,渲染画面
window.addEventListener("reset",()=>{
//更新摄像头
camera.aspect = window.innerWidth / window.innerHeight
//更新投影矩阵
camera.updateProjectionMatrix()
//跟新渲染器
render.setSize(window.innerWidth,window.innerHeight)
//设置渲染像素比
render.setPixelRatio(window.devicePixelRatio)
})
八、调用js画布全屏退出全屏
import * as THREE from "three";
import gsap from "gsap";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
cube.rotation.set(Math.PI / 4, 0, 0);
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
controls.enableDamping = true
gsap.to(cube.position, { x: 5, duration: 5 ,repeat:-1,yoyo:true,delay:2});
function renderfun() {
// 在这里调用update()方法
controls.update()
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
window.addEventListener("reset",()=>{
camera.aspect = window.innerWidth / window.innerHeight
camera.updateProjectionMatrix()
render.setSize(window.innerWidth,window.innerHeight)
render.setPixelRatio(window.devicePixelRatio)
})
//设置全屏与退出全屏
window.addEventListener("dblclick",()=>{
if(!document.fullscreenElement){
// 全屏
render.domElement.requestFullscreen()
}else{
// 退出全屏
document.exitFullscreen()
}
})
九、应用图形界面改变变量
安装:
npm i dat.gui -S
import * as THREE from "three";
import gsap from "gsap";
//导入dat.gui
import * as dat from "dat.gui";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.set(0, 0, 10);
scene.add(camera);
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xffff00, 1, 0),
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
cube.rotation.set(Math.PI / 4, 0, 0);
scene.add(cube);
//创建gui实例
const gui = new dat.GUI();
//修改x轴位置
gui
.add(cube.position, "x")
.min(0)
.max(5)
.step(0.01)
.name("x轴移动")
.onChange((value) => {
console.log("值修改了");
})
.onFinishChange((value) => {
console.log("完全修改了,才执行");
});
//修改物体颜色
const params = {
color: "#ff0",
fn: () => {
//让立方体动起来
gsap.to(cube.position, { x: 5, duration: 5 ,repeat:-1,yoyo:true,delay:2});
},
};
gui.addColor(params, "color").onChange((value) => {
console.log(value);
cube.material.color.set(value);
});
var folder = gui.addFolder("设置立方体")
folder.add(cube.material,"wireframe")
//是否显示
gui.add(cube, "visible").name("是否显示");
//设置触发某个函数
gui.add(params,"fn").name("是否开启动画");
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const render = new THREE.WebGLRenderer();
render.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(render.domElement);
const controls = new OrbitControls(camera, render.domElement);
controls.enableDamping = true;
function renderfun() {
controls.update();
render.render(scene, camera);
requestAnimationFrame(renderfun);
}
renderfun();
window.addEventListener("reset", () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
render.setSize(window.innerWidth, window.innerHeight);
render.setPixelRatio(window.devicePixelRatio);
});
window.addEventListener("dblclick", () => {
if (!document.fullscreenElement) {
render.domElement.requestFullscreen();
} else {
document.exitFullscreen();
}
});