Threejs は、さまざまなテクスチャのインポートをサポートしてテクスチャを生成するだけでなく、キャンバスを使用して絵をテクスチャとして描画することもできます。これは、canas オブジェクトを受け入れる CanvasTexture を使用します。キャンバスを描画する限り、テクスチャとして使用できます。ここでは、この効果を実現するために画像を使用します。
基本コード:
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import * as Dat from "dat.gui";
// 导入Three.js库
// import * as THREE from "three";
// 创建场景、相机、渲染器等
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const control = new OrbitControls(camera, renderer.domElement);
// 创建立方体的几何体
const geometry = new THREE.BoxGeometry(3, 3, 3);
// 创建动态Canvas并在其中绘制图像
const canvas = document.createElement("canvas");
canvas.width = 512;
canvas.height = 512;
const context = canvas.getContext("2d");
const image = new Image();
image.src = "src/assets/css.jpg"; // 替换为你的图片路径
image.onload = function() {
context.drawImage(image, 0, 0, canvas.width, canvas.height);
// 将Canvas创建为贴图
const texture = new THREE.CanvasTexture(canvas);
// 创建贴图材质
const materials = [
new THREE.MeshBasicMaterial({ color: "#f90" }),
new THREE.MeshBasicMaterial({ map: texture }),
new THREE.MeshBasicMaterial({ color: "#63a" }),
new THREE.MeshBasicMaterial({ color: "#e2d" }),
new THREE.MeshBasicMaterial({ color: "#c57" }),
new THREE.MeshBasicMaterial({ color: "#f00" })
];
// 创建几何体网格对象
const cube = new THREE.Mesh(geometry, materials);
// 将网格对象添加到场景中
scene.add(cube);
};
// 设置相机位置
camera.position.z = 5;
// 渲染场景
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
最終的な表示効果は次のとおりです。
ここでは、テクスチャの非同期性の問題に特別な注意を払う必要があります。drawImageで絵を描く場合、img.onload()内でscene.add(cube)の操作を行わないと絵が表示されません。