three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质
https://threehub.cn/#/codeMirror?navigation=ThreeJS&classify=application&id=videoModel

在这里插入图片描述

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";

const box = document.getElementById('box')

const scene = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(50, box.clientWidth / box.clientHeight, 0.1, 1000)

camera.position.set(0, 8, 30)

const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })

renderer.setSize(box.clientWidth, box.clientHeight)

box.appendChild(renderer.domElement)

const controls = new OrbitControls(camera, renderer.domElement)

controls.enableDamping = true

animate()

function animate() {

  requestAnimationFrame(animate)

  controls.update()

  renderer.render(scene, camera)

}

window.onresize = () => {

  renderer.setSize(box.clientWidth, box.clientHeight)

  camera.aspect = box.clientWidth / box.clientHeight

  camera.updateProjectionMatrix()

}

// 文件地址
const urls = [0, 1, 2, 3, 4, 5].map(k => (`https://file.threehub.cn/` + 'files/sky/skyBox0/' + (k + 1) + '.png'));

const textureCube = new THREE.CubeTextureLoader().load(urls);

scene.background = textureCube;


const video = document.createElement('video')

video.crossOrigin = 'anonymous' // 跨域

video.src = 'https://vjs.zencdn.net/v/oceans.mp4'

video.loop = true // 循环播放

video.muted = true // 静音

video.play()

const texture = await new Promise(r => video.onloadeddata = () => r(new THREE.VideoTexture(video))) // 创建视频纹理

new GLTFLoader().load(`https://file.threehub.cn/` + "models/glb/zhanguan.glb", (gltf) => {

  gltf.scene.traverse((child) => {

    if (child.isMesh) {

      child.material.map = texture

      child.material.envMap = textureCube

    }

  })

  scene.add(gltf.scene)

})

/**
 * 名称: 模型视频材质
 * 作者: 优雅永不过时 https://github.com/z2586300277
 * 参考来源:https://github.com/YCYTeam/YCY-TrainingCamp-S2/blob/main/src/day02_%E7%9B%B4%E6%92%AD%E4%BB%A3%E7%A0%81.js 
 */

three.js是一个功能强大的JavaScript库,用于创建和渲染3D图形。它提供了各种方法可以对模型进行图片贴图,从而为模型增加纹理。 首先,我们需要为模型加载一个纹理图片。有两种常用的方法来加载纹理图片。一种是使用`THREE.TextureLoader`,它可以从指定的URL加载纹理图片。例如,可以使用以下代码加载一张名为`texture.png`的纹理图片: ```javascript var loader = new THREE.TextureLoader(); loader.load('texture.png', function (texture) { // 在此处使用纹理 }); ``` 另一种方法是直接创建一个纹理对象。我们可以先将图片加载为`Image`对象,然后将其传递给`THREE.Texture`的构造函数。例如,可以使用以下代码创建一个纹理对象: ```javascript var image = new Image(); image.src = 'texture.png'; var texture = new THREE.Texture(image); ``` 无论使用哪种方法,我们都可以将纹理应用于模型材质。对于模型的每个面,我们可以将纹理设置为材质的`map`属性。例如,可以使用以下代码为一个方块模型贴上纹理: ```javascript var geometry = new THREE.BoxGeometry(); // 创建一个基本的材质,并将纹理应用于材质的map属性 var material = new THREE.MeshBasicMaterial({ map: texture }); var cube = new THREE.Mesh(geometry, material); ``` 当我们将纹理应用于模型后,模型的表面将使用纹理图片进行渲染。我们可以根据需要对纹理进行更多的调整,如旋转、重复等。可以通过设置纹理的`rotation`和`repeat`属性来实现。例如,可以使用以下代码旋转纹理: ```javascript texture.rotation = Math.PI / 4; ``` 总之,通过使用`THREE.TextureLoader`或直接创建纹理对象,我们可以将纹理图片应用于three.js模型。然后,我们可以根据需要对纹理进行进一步的调整,以实现更加逼真和个性化的渲染效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值