2014-01-30 10 views
5

Ich habe herum gesucht und habe keine wirklich gute Antwort auf meine Frage noch gefunden .. Die Sache ist, dass ich diese Kugel habe .. nur eine grundlegende Kugel, und ich will Um die Normalen zu spiegeln, die Kugel bekommt die Art von "hohlen/geschnitzten Effekt" und dann Plater auf meine Texturen auf die "Innenseite" der Kugel anwenden. irgendwelche Ideen wie man die Normalen umdreht?Flip Normale in three.js auf Kugel

Auch .. wenn es nicht möglich ist, dies in three.js zu tun .. wäre es möglich, ein Modell zu importieren, wo die Normalen bereits umgedreht sind und den gewünschten Effekt bekommen?

+5

Versuchen Sie 'materials.side = THREE.BackSide' und sehen Sie, ob das Ergebnis für Sie akzeptabel ist. – WestLangley

+0

Das könnte funktionieren Ich schätze ... alle anderen Ideen sind auch sehr willkommen :) Ich werde versuchen, die oben genannten und krank zurück mit, wie es ging – Inx

+0

Tanks für The hela .. scheint bis haben den gewünschten Effekt :-) – Inx

Antwort

3

Wenn Sie Material für Ihre Kugel erstellen, geben Sie {side: THREE.DoubleSide} an. Dadurch werden Gesichter von beiden Seiten sichtbar.

Sie können dies jederzeit ändern, nachdem das Material erstellt wurde.

16

Sie können die Normalen in Ihrer Geometrie spiegeln, indem Sie die Wicklungsreihenfolge Ihrer Gesichter umkehren. Sie müssen dann UVs reparieren.

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; 

} 

Sie können jedoch die gleiche Wirkung erhalten, indem einfach Material.side = THREE.BackSide Einstellung oder Material.side = THREE.DoubleSide.

In beiden Fällen wird Ihre Textur umgedreht dargestellt. Sie können Ihre Textur entweder vorher spiegeln oder ein Modell außerhalb von three.js erstellen und importieren.

three.js r.65

+0

Nun , es verwirrt mich, Code oben in einer Skybox verwendend, muss ich 'side: THREE.FrontSide' einstellen, aber die Textur wird immer noch umgedreht.Wird die Textur geflippt, bekomme ich alias.So muss ich noch eine BoxGeometry erstellen? BoxGeometry, das aus dem Scheitelpunkt erstellt wurde, macht es rendern ohne Textur zu spiegeln? – aboutqx

+1

@aboutqx Wenn Sie eine Frage haben, müssen Sie sie in einem neuen Post fragen. – WestLangley

+0

Diese Lösung ist der Weg, um den Ray Caster zum Laufen zu bringen. Ray Caster sieht nur auf der Seite, doubleSide funktioniert nicht. – arpo

-1

Eine andere Möglichkeit besteht darin, einfach die Normalen Flip manuell Objektgeometrie dynamisch, indem sie.

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' wurde vor 3 Jahren aus der Bibliothek entfernt. Sie verwenden eine alte Version der Bibliothek. – WestLangley