three.js 学习基础笔记

基初用法笔记:场景,相机,渲染器,辅助线,几何体,控制器,gsap动画,GUI交互控制

import * as THREE from 'three'
//引入控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
//引入动画
import gsap from "gsap"
//引和dat.GUI
import * as dat from 'dat.gui'

//创建场景
const scene = new THREE.Scene();

//创建相机添加至场景
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 10)

//创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)

//添加辅助线
const axes = new THREE.AxesHelper(5)
scene.add(axes)
axes.position.set(0, 0, 0)

//添加一个盒子
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({ color: "red" })
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
cube.position.set(0, 0, 0)
cube.rotation.set(Math.PI / 4, 0, 0)
scene.add(cube)

//添加控制器,并设置阻尼
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true

//添加环境光
const alight = new THREE.AmbientLight("#FFF", .7)
scene.add(alight)
//添加平行光
const dlight = new THREE.DirectionalLight("#fff", .5)
scene.add(dlight)

//添加GUI控制动画
const params = {
  fn: () => {
    const g = gsap.to(cube.position, { x: 5, duration: 2, ease: "power1.inOut", repeat: 2 })
    console.log(g)
  }
}
const datGui = new dat.GUI()
datGui.add(cube.position, 'x').min(-5).max(5).name("方块X")
datGui.add(params, 'fn').onChange(() => {
  console.log(11111111)
})


document.body.appendChild(renderer.domElement)

const render = () => {
  controls.update()
  renderer.render(scene, camera)
  requestAnimationFrame(render)
}
render()

给几何体添加纹理


//添加一个盒子,并设置纹理
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({
  map: new THREE.TextureLoader().load('./1.png'),
  side: THREE.DoubleSide // 双面渲染
})
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
scene.add(cube)

VR看房

//添加一个球,并设置纹理
const spereGeometry = new THREE.SphereGeometry(2, 30, 30)
const spereMaterial = new THREE.MeshBasicMaterial({
  //side: THREE.DoubleSide,
    /*此处放开,屏闭spere.geometry.scale(1, 1, -1)也可以实现,
        相机位置应该放在camera.position.set(0, 0, 0.1)*/
  map: new THREE.TextureLoader().load('./house.jpg')
})
const spere = new THREE.Mesh(spereGeometry, spereMaterial)
spere.geometry.scale(1, 1, -1)
scene.add(spere)

点击事件添加

window.addEventListener('click', (event) => {
  let v = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5)
  v = v.unproject(camera);
  const raycaster = new THREE.Raycaster(camera.position, v.sub(camera.position).normalize())
  let intersects = raycaster.intersectObjects(scene.children)
  if (intersects.length) {
    console.log(intersects[0].object.name)
  }
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值