javascript - 如何使用三个 JS 在魔方上的每个小方块上加载图像
问题描述
我要开发一个 5x5 的魔方,魔方有 6 个面,所以我必须在每个面上的每个小盒子上显示 25 张图像(整个 5x5 立方体中总共有 150 张图像)。魔方显示完美,但是当我插入图像时,连魔方都没有显示。
//5x5x5 rubik cube is constructed here...
for(var i = 0; i < dimensions; i ++) {
for(var j = 0; j < dimensions; j ++) {
for(var k =
0; k < dimensions; k ++) {
var x = (i - positionOffset) * increment,
y = (j - positionOffset) * increment,
z = (k - positionOffset) * increment;
newCube(x, y, z);
}
}
}
//newCube function...
function newCube(x, y, z) {
const loader = new THREE.TextureLoader();
const cubeMaterials = [
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-1.jpg')}),
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-2.jpg')}),
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-3.jpg')}),
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-4.jpg')}),
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-5.jpg')}),
new THREE.MeshBasicMaterial({map: loader.load('https://threejsfundamentals.org/threejs/resources/images/flower-6.jpg')}),
];
var cubeGeometry = new THREE.CubeGeometry(cubeSize, cubeSize, cubeSize);
const loader = new THREE.TextureLoader();
var cube = new THREE.Mesh(cubeGeometry,cubeMaterials);
cube.castShadow = true;
cube.position = new THREE.Vector3(x, y, z);
cube.rubikPosition = cube.position.clone();
cube.on('mousedown', function(e) {
onCubeMouseDown(e, cube);
});
cube.on('mouseup', function(e) {
onCubeMouseUp(e, cube);
});
cube.on('mouseout', function(e) {
onCubeMouseOut(e, cube);
});
scene.add(cube);
allCubes.push(cube);
}
解决方案
1) 仅将多个材质作为数组传递是不够的,您应该创建一个实例MeshFaceMaterial
并将其作为最终材质传递给您的网格:
var cubeMaterials = [
new THREE.MeshBasicMaterial({map: image1}),
new THREE.MeshBasicMaterial({map: image2}),
new THREE.MeshBasicMaterial({map: image3}),
new THREE.MeshBasicMaterial({map: image4}),
new THREE.MeshBasicMaterial({map: image5}),
new THREE.MeshBasicMaterial({map: image6}),
];
cubeMaterials = new THREE.MeshFaceMaterial( cubeMaterials );
另一个需要注意的重要事情是拥有 5x5x5 立方体 - 它是对纹理加载器的750次调用。在实际使用之前预加载您的资产。
推荐阅读
- azure-table-storage - Azure 数据工厂的表存储源中的列名重复
- ampl - 在ampl中声明变量的默认值
- android - 如何将图像从 Odoo 11 上传到 Android 应用程序?
- sql - 两个日期之间的工作日与日历表
- php - 在 laravel 中包含 js 文件的最佳方法是什么?
- java - 允许两个类共享变量和方法
- angular - 使用嵌套订阅返回布尔值的函数
- bash - 生成命令(unimrcp 客户端)的 Unix shell 脚本不返回
- javascript - 为什么来自 nextElementSibling.tagName 的 TypeError?
- java - Java- 使用多个测试用例和每个测试用例中的多个值扫描以下输入的代码片段