2014-01-30 9 views
5

Я искал вокруг и еще не нашел действительно хорошего ответа на мой вопрос. Дело в том, что у меня есть эта сфера .. просто базовая сфера, и я хочу чтобы перевернуть нормали, так что сфера получает вид «полый/резной эффект», а затем plater накладывает мои текстуры на «внутри» сферы. любые идеи о том, как перевернуть нормали?Flip normals in three.js on sphere

Также .., если его невозможно сделать в three.js .. было бы возможно импортировать модель, где нормали уже перевернуты и получить эффект, который я ищу?

+5

Попробуйте 'material.side = THREE.BackSide' вместо этого и посмотрите, подходит ли вам результат. – WestLangley

+0

Это могло бы сработать, я думаю ... любые другие идеи тоже приветствуются :) Я попробую выше, и я вернусь с тем, как это получилось – Inx

+0

Танки для гели .. кажется, до тех пор, пока у них не будет эффект desiered :-) – Inx

ответ

3

Когда вы создаете материал для своей сферы, укажите {side: THREE.DoubleSide}. Это сделает лица видимыми с обеих сторон.

Вы также можете изменить его в любое время после создания вашего материала.

16

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

for (var i = 0; i < geometry.faces.length; i ++) { 

    var face = geometry.faces[ i ]; 
    var temp = face.a; 
    face.a = face.c; 
    face.c = temp; 

} 

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

var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; 
for (var i = 0; i < faceVertexUvs.length; i ++) { 

    var temp = faceVertexUvs[ i ][ 0 ]; 
    faceVertexUvs[ i ][ 0 ] = faceVertexUvs[ i ][ 2 ]; 
    faceVertexUvs[ i ][ 2 ] = temp; 

} 

Однако, вы можете получить тот же эффект, просто установив Material.side = THREE.BackSide или Material.side = THREE.DoubleSide.

В любом случае ваша текстура будет отображена. Вы можете либо перевернуть текстуру раньше, либо создать модель за пределами three.js и импортировать ее.

Three.js R.65

+0

Well , это смущает меня, используя код выше в skybox, я должен установить 'side: THREE.FrontSide', но текстура все еще отображается flipped.With fliping текстуры, я получаю alias.So мне нужно построить еще одну BoxGeometry? BoxGeometry, построенная из вершины, будет отображать ее без переворачивания текстуры? – aboutqx

+1

@aboutqx Если у вас есть вопрос, вам нужно задать его в новом сообщении. – WestLangley

+0

Это решение - способ заставить лучевого заклинателя работать. Ray caster видит только на стороне, doubleSide не работает. – arpo

-1

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

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(); 
+2

'__dirtyVertices' был удален из библиотеки 3 года назад. Вы используете старую версию библиотеки. – WestLangley