2013-05-10 11 views
8

Ich versuche, verschiedene Material auf Vorder-und Rückseite der extrudierten Form anwenden, aber nicht herausfinden, wo side: THREE.FrontSide und side: THREE.BackSide setzen. Wo sollten sie putten?Unterschiedliches Material auf der Rückseite und Vorderseite der extrudierten Form

Mein entsprechenden Code-Teil ist:

 
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:

 
// ... 
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' bezieht sich auf die Vorderseite eines' face', nicht die Vorderseite eines '' mesh' oder shape'. Was genau funktioniert nicht? – WestLangley

+0

Mit dem obigen Code, wenn ich das Mesh von der Rückseite aus, ist die 'materialFront 'auch da. Ich möchte ein anderes Material auf der Rückseite des Gitters hinzufügen, wie den Würfelwürfel in http://stemkoski.github.io/Three.js/Textures.html. –

+1

In der three.js-Quelle gibt es "Material: // Materialindex für Vorder- und Rückseite". Dies scheint zu bedeuten, dass die Vorder- und Rückseite nicht unterschiedliche Materialien haben können, da sie nur einen Index haben. Dies ist der Kern des Problems. Ich sollte in der Lage sein, einen Index für Rückseite und einen Index für Vorderseite zu verwenden. –

Antwort

7

Nachdem Sie Ihre Netzgeometrie erstellen, und vor dem ersten Aufruf-render(), müssen Sie die materialIndex bis 2 für die Rückseiten ändern. Fügen Sie dann ein drittes Material in Ihrem Materialarray hinzu.

Sie können die Rückseiten anhand ihrer Flächennormalen identifizieren. Flächennormalen für Flächen auf der Rückseite der Geometrie sollten alle in die gleiche Richtung zeigen.

Three.js r.58

+0

Danke für die Antwort! Ich habe f3() und f4() überprüft, aber sie haben keine Antwort darauf gegeben, wie "materialIndex auf 2 für die Rückseiten zu setzen". Könnten Sie das klären? –

+0

OK. Wenn Sie mir dabei helfen könnten, wäre ich sehr glücklich. Bis jetzt sind alle meine Versuche gescheitert. –

+0

Danke dafür! Ich habe meine Frage mit dem gewünschten Code aktualisiert: http://stackoverflow.com/q/16484835/1691517. Ich werde diese Antwort akzeptieren. –

1

Versuchen Sie es mit: Nach WestLangley Kommentar ich in Hinzufügen der andere Textur zu Rückseiten gelang

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

sollten Sie Ihren Umgebungsbeitrag wahrscheinlich senken und dem FrontSide-Material einen color geben.

Dann:

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

In meinem Code ist 'materialSide' an extrusionSettings.extrudeMaterial angehängt. Also kann ich es nicht für Backside verwenden. Ich kann nicht sehen, wie Ihr Vorschlag funktionieren könnte. –

Verwandte Themen