2013-05-10 2 views
8

Я пытаюсь применить различные материалы на передней и задней сторонах экструдированной формы, но не могу определить, куда положить side: THREE.FrontSide и side: THREE.BackSide. Где их нужно положить?Различные материалы на задней и торцевой поверхности экструдированной формы

Моей соответствующий код часть:

 
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: Согласно комментарию WestLangley, я преуспел в добавлении различных текстур для 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' относится к передней стороне' face', а не на передней стороне '' mesh' или shape'. Что не работает, точно? – WestLangley

+0

Используя приведенный выше код, когда я смотрю сетку с обратной стороны, здесь также находится 'materialFront'. Я хотел бы добавить другой материал на обратной стороне сетки, например куб кубика в http://stemkoski.github.io/Three.js/Textures.html. –

+1

В источнике three.js есть «материал: // индекс материала для лицевой и задней поверхностей». Это означает, что передняя и задняя стороны не могут иметь разные материалы, потому что они имеют только один индекс. Это ядро ​​проблемы. Я должен иметь возможность использовать один индекс для спины и один индекс для фронта. –

ответ

7

После создания геометрии сетки, и перед первым вызовом к render(), вы должны изменить materialIndex к 2 для задних граней. Затем добавьте третий материал в массив материалов.

Вы можете идентифицировать задние лица по их нормали. Лицевые нормали для граней на обратной стороне геометрии должны указывать в одном направлении.

Three.js R.58

+0

Спасибо за ответ! Я проверил f3() и f4(), но они не дали ответа на вопрос, как «установить materialIndex на 2 для задних лиц». Не могли бы вы прояснить это? –

+0

OK. Если бы вы могли помочь мне в этом, я был бы очень доволен. Пока все мои попытки потерпели неудачу. –

+0

Спасибо за это! Я обновил свой вопрос с помощью желаемого кода: http://stackoverflow.com/q/16484835/1691517. Я приму этот ответ. –

1

Попробуйте использовать:

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

, хотя вы, вероятно, должны снизить свой вклад и дать color материалу FrontSide.

Тогда:

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

В моем коде 'materialSide' прилагается к extrusionSettings.extrudeMaterial. Поэтому я не могу использовать его для backSide. Я не вижу, как ваше предложение может работать. –

Смежные вопросы