Skip to content

全面讲解UV与应用

代码

js
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
import  * as TWEEN from 'three/examples/jsm/libs/tween.module.js';

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
)


const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

let uvTexture = new THREE.TextureLoader().load('./texture/uv_grid_opengl.jpg')
// 创建平面几何体
const planeGeometry = new THREE.PlaneGeometry(2, 2)
// 创建材质
const planeMaterial = new THREE.MeshBasicMaterial({
  // color: 0xffffff,
  map: uvTexture // 设置纹理贴图
})
// 创建平面
const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)
scene.add(planeMesh)
planeMesh.position.x = -3

// 创建几何体
const geometry = new THREE.BufferGeometry()
// 使用索引绘制
const vertices = new Float32Array([
  -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0
])

// 创建顶点属性
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3))

// 创建索引
const indices = new Uint16Array([0, 1, 2, 2, 3, 0]) 

// 创建索引属性
geometry.setIndex(new THREE.BufferAttribute(indices, 1))

// 设置 uv 坐标
const uv = new Float32Array([
  0, 0, 1, 0, 1, 1, 0, 1, // 正面
])

// 设置 uv 属性
geometry.setAttribute('uv', new THREE.BufferAttribute(uv, 2))


// 创建材质
const material = new THREE.MeshBasicMaterial({
  map: uvTexture, // 设置纹理贴图
})

const plane = new THREE.Mesh(geometry, material)
scene.add(plane)
plane.position.x = 3

camera.position.z = 15;
camera.position.y = 2;
camera.position.x = 2;
camera.lookAt(0, 0, 0)

const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;

function animate() {
  requestAnimationFrame(animate)
  controls.update()
  renderer.render(scene, camera)

  TWEEN.update()
}

animate()

window.addEventListener('resize', () => {
  renderer.setSize(window.innerWidth, innerHeight)
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
})

let eventObj = {
  Fullscreen: function () {
    document.body.requestFullscreen()
  },
  ExitFullscreen: function () {
    document.exitFullscreen()
  }
}

// 创建GUI
const gui = new GUI()
// 添加按钮
gui.add(eventObj, 'Fullscreen').name('全屏')
gui.add(eventObj, 'ExitFullscreen').name('退出全屏')

Released under the MIT License.