Threejs - materiał dla Geometry

0

Mam problem. Utworzyłem sobie nowy obiekt typu THREE.Geometry() i nie działa przypisanie do niego materiału jak do innych figur (poza THREE.MeshBasicMaterial - to działa). Co znaczy, że nie działa? Widzę tylko czarny kolor bez reakcji na światło. Co robię źle?

Mój kod:

            table.add(function(){
                var vertices = [
                    new THREE.Vector3(0.5,0.2,-0.5),
                    new THREE.Vector3(0.3,0.2,0.5),
                    new THREE.Vector3(-0.3,0.2,0.5),
                    new THREE.Vector3(-0.5,0.2,-0.5),
                    new THREE.Vector3(0.5,-0.2,-0.5),
                    new THREE.Vector3(0.3,-0.2,0.5),
                    new THREE.Vector3(-0.3,-0.2,0.5),
                    new THREE.Vector3(-0.5,-0.2,-0.5)
                ];
                var faces = [
                    new THREE.Face3(1,0,3),
                    new THREE.Face3(2,1,3),
                    new THREE.Face3(5,7,4),
                    new THREE.Face3(5,6,7),
                    new THREE.Face3(1,2,6),
                    new THREE.Face3(5,1,6),
                    new THREE.Face3(0,1,4),
                    new THREE.Face3(4,1,5),
                    new THREE.Face3(6,2,7),
                    new THREE.Face3(2,3,7),
                    new THREE.Face3(3,0,7),
                    new THREE.Face3(0,4,7)
                ];
                var geom = new THREE.Geometry();
                geom.vertices = vertices;
                geom.faces = faces;
                var o = new THREE.Mesh(
                    geom,
                    new THREE.MeshLambertMaterial({color: 0xFF0000})
                );
                return o;
            }());

Będę bardzo wdzięczny za pomoc. W dokumentacji trudno mi się odnaleźć (poza tym miejscami wydaje mi się nieaktualna).

0

A masz jakieś światło w scenie? Przypuszczam, że MeshBasicMaterial nie reaguje na światło tylko wyświetla kolor (dawno nie pisałem w ThreeJS ale pamiętam, że był taki materiał). Inne materiały mogą potrzebować stworzenia obiektów światła.

0

Mam. Obok mam stół z nałożonymi materiałami i wszystko działa. Ale tak, masz racje - basic nie potrzebuje światła.
Okazało się jednak (dopiero się uczę), że da się tą figurę zrobić łatwiej niż budować z trójkątów i dodatkowo reaguje prawidłowo na tekstury.

/**
 * Zwraca obiekt (bryłę) w kształcie trapezu (widok od góry)
 * ------------------
 *  \              /
 *   \            /
 *    ------------
 * @param {Integer} maxWidth - długość dłuższego boku (na rysunku górny)
 * @param {Integer} minWidth - długość krótszego boku (na rysunku dolny)
 * @param {Integer} length - długość elementu (na rysunku jako wysokość trapezu)
 * @param {Integer} height - wysokość elementu w 3D (na rysunku nie widać - jest to widok od góry elementu)
 * @param {Object} material - materiał (nieobowiązkowe)
 * @returns {THREE.Mesh}
 */
var horizonMesh = function(maxWidth, minWidth, length, height, material){
    var o = new THREE.Mesh(
        new THREE.CubeGeometry(maxWidth, height, length),
        (typeof material === 'undefined')?(new THREE.MeshLambertMaterial({color: 0xFF0000})):material
    );
    var difference = (maxWidth - minWidth) / 2;
    o.geometry.vertices[7].x += difference;
    o.geometry.vertices[5].x += difference;
    o.geometry.vertices[2].x -= difference;
    o.geometry.vertices[0].x -= difference;
    return o;
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1