Three.js

安装:

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();
  }
});

 十、集合体法相——UV--顶点算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值