2013-05-29 6 views
5

Я клонировал и перевернул объект, используя отрицательный масштаб, что заставляет мои односторонние лица инвертироваться. Мой вопрос: как я могу перевернуть нормали?Three.js: Как перевернуть нормали после отрицательного масштаба

Я не хочу использовать material.side = THREE.DoubleSide по причинам: 1) не работает должным образом (некоторые оттенки сделаны изнутри) и 2) хотят сохранить как можно больше производительности. Поэтому DoubleSide не вариант для меня.

То, как мой объект, если перевернулся.

mesh.scale.x = - scale_width; 

Заранее благодарен!

+0

Я тоже прочитал ваш ответ на этот вопрос, и я подумал, что еще один выбор: «перевернуть» мои объекты, чем отрицательное масштабирование? Может быть, вы можете посоветовать мне лучшее решение, чем масштабирование негативно? Моя задача - создать симметричный объект: рамку для изображения для виртуальной галереи. Поэтому у меня есть геометрия с одной стороны кадра, они могут даже варьироваться в их форме. Каждая сторона рамы имеет два угла 45 градусов, круглые или острые, что угодно. Поэтому я создаю один угол и клонирую его, чем негативно масштабирую его, чтобы получить полный флип. Любое предложение, как справиться с этим без отрицательного масштаба? –

ответ

5

Я бы посоветовал против отрицательного масштаба для целого ряда причин, как описан в этой ссылке: Transforming vertex normals in three.js

Вы можете вместо этого применить матрицу инверсии к вашей геометрии, как так

geometry.scale(- 1, 1, 1); 

Как объяснены в ссылка, следствием этого, однако, является то, что грани геометрии больше не будут иметь порядок намотки против часовой стрелки, но по часовой стрелке.

Вы можете вручную перемещать геометрию и переворачивать порядок намотки каждого лица. Это может сработать для вас - если вы не используете текстуру и не используете UV. Если ваша геометрия должна быть текстурирована, необходимо также скорректировать UV-элементы.

На самом деле утилита инверсии геометрии была бы приятным дополнением к three.js. В настоящее время то, что вы хотите сделать, не поддерживается библиотекой.

Three.js R.72

+0

Спасибо за объяснение, поэтому его ободряюще подумать о реализации этой функции :) –

3

Этот вопрос состоит из двух лет, но в случае, если кто проходит мимо. Вот неразрушающий способ сделать это:

Вы можете войти в режим «грязные вершины/нормалей», и флип нормалей вручную:

mesh.geometry.dynamic = true 
mesh.geometry.__dirtyVertices = true; 
mesh.geometry.__dirtyNormals = true; 

mesh.flipSided = true; 

//flip every vertex normal in mesh by multiplying normal by -1 
for(var i = 0; i<mesh.geometry.faces.length; i++) { 
    mesh.geometry.faces[i].normal.x = -1*mesh.geometry.faces[i].normal.x; 
    mesh.geometry.faces[i].normal.y = -1*mesh.geometry.faces[i].normal.y; 
    mesh.geometry.faces[i].normal.z = -1*mesh.geometry.faces[i].normal.z; 
} 

mesh.geometry.computeVertexNormals(); 
mesh.geometry.computeFaceNormals(); 

+1 @WestLangley, я предлагаю вам никогда не использовать отрицательный масштаб.

+0

Интересно. Но учтите, что .flipSided больше не является частью THREE.js. См. U/WestLangley здесь: http://stackoverflow.com/questions/19673913/three-js-flipsided-property. – steveOw

+0

геометрия .__ dirtyVertices & geometry .__ dirtyNormals также устарели. См. Https://github.com/mrdoob/three.js/wiki/Updates – Reimund