Как использовать несколько материалов в кубе Three.js?
Я пытаюсь использовать Three.js для рендеринга куба с 6 различными изображениями на лицах.
Конструктор THREE.CubeGeometry выглядит следующим образом:
THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides )
Из кода видно, что "материалы" должны быть либо материалом, либо массивом из 6 разных материалов, но материалы, переданные здесь, никогда не используются при рендеринге.
Вместо этого единственный материал, предоставленный конструктору Mesh, используется для всех 6 граней.
var face_materials = ... <load 6 textures here>...
var cube_g = new THREE.CubeGeometry(400,400,400,1,1,1, face_materials); // <= ignored?
var cube = new THREE.Mesh(cube_g, some_material); // <= this is used instead
Даже если я передаю null или undefined как "some_material", он, кажется, переопределяет face_materials и ничего не отображает.
Есть ли способ сделать эту работу с помощью CubeGeometry? Или мне нужно создать 6 граней отдельно и добавить их в сцену?
Ответы
Ответ 1
Вам нужно использовать THREE.MeshFaceMaterial для сетки. Вот пример кода:
var materials = [];
for (var i=0; i<6; i++) {
var img = new Image();
img.src = i + '.png';
var tex = new THREE.Texture(img);
img.tex = tex;
img.onload = function() {
this.tex.needsUpdate = true;
};
var mat = new THREE.MeshBasicMaterial({color: 0xffffff, map: tex});
materials.push(mat);
}
var cubeGeo = new THREE.CubeGeometry(400,400,400,1,1,1, materials);
var cube = new THREE.Mesh(cubeGeo, new THREE.MeshFaceMaterial());
Ответ 2
Для примера использования нескольких материалов в кубе для последней версии версии 3..sys 56 (март 2013 г.) проверьте исходный код примера на http://stemkoski.github.com/Three.js/Textures.html - самое большое последнее изменение заключается в том, что THREE.MeshFaceMaterial
необходимо передать массив материалов, которые будут использоваться в CubeGeometry
.
Ответ 3
MeshFaceMaterial теперь устарела, поэтому вместо использования вы должны передать массив MeshBasicMaterials.
Однако... если, как и я, вы все равно хотите визуализировать разные цвета на каждом лице, то есть другой способ, описанный в ответе WestLangley здесь. Основная идея заключается в том, что вы устанавливаете цвет на гранях объекта geometry
, а не в виде массива материалов.
var geo = new THREE.BoxGeometry( 5, 2, 5 );
var mat = new THREE.MeshBasicMaterial( { color:0xff0ff0, vertexColors: THREE.FaceColors } );
var mesh = new THREE.Mesh( geo, mat );
mesh.geometry.faces[ 5 ].color.setHex( 0x00ffff );
Это действительно эффективный способ ведения дел.