2013-05-10 10 views
8

Próbuję zastosować różne materiały na przedniej i tylnej stronie wytłaczanego kształtu, ale nie mogę określić, gdzie umieścić side: THREE.FrontSide i side: THREE.BackSide. Gdzie należy je ułożyć?Różne materiały z tyłu i przedniej części wytłoczonego kształtu

Moja odpowiednia część kodu jest:

 
var materialFront = new THREE.MeshPhongMaterial({ ambient: 0xffffff, map: frontTexture }); 

var materialSide = new THREE.MeshPhongMaterial({color: 0xE68A00, ambient: 0xffffff}); 

var extrusionSettings = { 
      amount: 10, 
      bevelEnabled: false, 
      bevelThickness: 0.2, 
      bevelSize: 0.2, 
      bevelSegments: 8, 
      material: 0, 
      extrudeMaterial: 1 
}; 

var geometry = new THREE.ExtrudeGeometry(shapes, extrusionSettings); 

var materials = [materialFront, materialSide]; 

var material = new THREE.MeshFaceMaterial(materials); 

mesh = new THREE.Mesh(geometry, material); 

UPDATE: Według komentarza WestLangley za udało mi się dodając inną teksturę backfaces:

 
// ... 
var materials = [materialFront, materialSide, materialBack]; 
// ... 
for (var face in mesh.geometry.faces) { 
if (mesh.geometry.faces[ face ].normal.z == 1) mesh.geometry.faces[ face ].materialIndex = 2; 
} 
+0

'THREE.FrontSide' odnosi się do przedniej strony' face', a nie do przodu ma 'mesh' lub 'shape'. Co dokładnie nie działa? – WestLangley

+0

Korzystając z powyższego kodu, gdy patrzę na siatkę z tyłu, znajduje się również "materialFront". Chciałbym dodać inny materiał z tyłu siatki, jak kostka kostki w http://stemkoski.github.io/Three.js/Textures.html. –

+1

W źródle three.js znajduje się "materiał: // indeks materiałowy dla powierzchni przedniej i tylnej". Wydaje się to oznaczać, że przednia i tylna strona twarzy nie mogą mieć różnych materiałów, ponieważ mają tylko jeden indeks. To jest sedno problemu. Powinienem móc użyć jednego indeksu dla tyłu i jednego indeksu dla przodu. –

Odpowiedz

7

Po utworzeniu geometrii siatki i przed pierwszym wywołaniem do render(), trzeba zmienić materialIndex do 2 na powierzchniach tylnych. Następnie dodaj trzeci materiał do swojej macierzy materiałów.

Możesz zidentyfikować ściany tylne według normalnych powierzchni twarzy. Ściany normalne dla ścian z tyłu geometrii powinny być skierowane w tym samym kierunku.

Three.js r.58

+0

Dzięki za odpowiedź! Sprawdziłem f3() i f4(), ale nie dali oni odpowiedzi na pytanie "jak ustawić materialindex na 2 dla ścian". Czy możesz to wyjaśnić? –

+0

OK. Jeśli mógłbyś mi w tym pomóc, byłbym bardzo szczęśliwy. Jak dotąd wszystkie moje próby zawiodły. –

+0

Dzięki za to! Zaktualizowałem swoje pytanie żądanym kodem: http://stackoverflow.com/q/16484835/1691517. Przyjmuję tę odpowiedź. –

1

Spróbuj użyć:

var materialFront = new THREE.MeshPhongMaterial({ ambient: 0xffffff, map: frontTexture, side: THREE.FrontSide }); 
var materialSide = new THREE.MeshPhongMaterial({ color: 0xE68A00, ambient: 0xffffff, side: THREE.BackSide }); 

, mimo że prawdopodobnie należy obniżyć wkład otoczenia i dać color materiałowi FrontSide.

Następnie:

var materials = [materialFront, materialSide]; 
scene.add(THREE.SceneUtils.createMultiMaterialObject(geometry, materials)); 
+0

W moim kodzie 'materialSide' jest dołączony do extusionSettings.extrudeMaterial. Więc nie mogę go użyć do backSide. Nie widzę, jak mogłaby działać Twoja propozycja. –

Powiązane problemy