一、canvas
画布、视频作为纹理贴图
- 通过
three.ts
两个类CanvasTexture
和VideoTexture
可以分别实现把Canvas
画布、视频作为纹理贴图使用。
1. Canvas
画布作为three.ts
纹理贴图(CanvasTexture)
Canvas
画布可以通过2D API
绘制各种各样的几何形状,可以通过Canvas
绘制一个轮廓后然后作为three.ts
网格模型、精灵模型等模型对象的纹理贴图。- 一段Canvas代码javascript
const canvas = document.createElement("canvas"); canvas.width = 512; canvas.height = 128; const c = canvas.getContext('2d'); // 矩形区域填充背景 c.fillStyle = "#ff00ff"; c.fillRect(0, 0, 512, 128); c.beginPath(); // 文字 c.beginPath(); c.translate(256,64); c.fillStyle = "#000000"; //文本填充颜色 c.font = "bold 48px 宋体"; //字体样式设置 c.textBaseline = "middle"; //文本与fillText定义的纵坐标 c.textAlign = "center"; //文本居中(以fillText定义的横坐标) c.fillText("技术博客", 0, 0); document.body.appendChild(canvas)
- 把绘制了几何图案的
canvas
元素作为构造函数CanvasTexture
的参数创建一个canvas
纹理贴图。javascript/** * 创建一个canvas对象,并绘制一些轮廓 */ const canvas = document.createElement("canvas"); // 上面canvas代码省略 c.fillText("技术博客", 0, 0); // canvas画布对象作为CanvasTexture的参数重建一个纹理对象 // canvas画布可以理解为一张图片 const texture = new THREE.CanvasTexture(canvas); //打印纹理对象的image属性 // console.log(texture.image); //矩形平面 const geometry = new THREE.PlaneGeometry(128, 32); const material = new THREE.MeshPhongMaterial({ map: texture, // 设置纹理贴图 }); // 创建一个矩形平面网模型,Canvas画布作为矩形网格模型的纹理贴图 const mesh = new THREE.Mesh(geometry, material);
- Canvas画布加载图片
- 如果作为纹理贴图使用的
Canvas
画布加载了图片,注意在图片加载完成的时候更新three.ts
相关模型的纹理贴图。 如果不更新纹理,你会发现canvas
画布上的图片无法现在是three.ts
模型的纹理上。javascriptconst canvas = document.createElement("canvas"); ... const ctx = canvas.getContext('2d'); const Image = new Image(); Image.src = "./贴图.jpg"; Image.onload = function() { const bg = ctx.createPattern(Image, "no-repeat"); ... // 注意图片加载完成执行canvas相关方法后,要更新一下纹理 texture.needsUpdate = true; }
- 如果作为纹理贴图使用的
2. 视频作为three.ts
纹理贴图(VideoTexture
)
- 视频本质上就是一帧帧图片流构成,把视频作为
three.ts
模型的纹理贴图使用,就是从视频中提取一帧一帧的图片作为模型的纹理贴图, 然后不停的更新的纹理贴图就可以产生视频播放的效果。javascript// 创建video对象 let video = document.createElement('video'); video.src = "1086x716.mp4"; // 设置视频地址 video.autoplay = "autoplay"; //要设置播放 // video对象作为VideoTexture参数创建纹理对象 const texture = new THREE.VideoTexture(video) const geometry = new THREE.PlaneGeometry(108, 71); //矩形平面 const material = new THREE.MeshPhongMaterial({ map: texture, // 设置纹理贴图 }); //材质对象Material const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh scene.add(mesh); //网格模型添加到场景中
VideoTexture.js
封装了一个update
函数,three.ts
每次执行渲染方法进行渲染场景中的时候, 都会执行VideoTexture
封装的update
函数,执行update
函数中代码this.needsUpdate = true;
读取视频流最新一帧图片来更新three.ts
模型纹理贴图。