2016-05-03 7 views
0

, wenn ich an einem THREE.BoxGeometry Objekt einen Punkt Licht setzte sie wie folgt aussehen: THREE.BoxGeometry with point lightUneinheitliche Oberflächenverhalten in Three.js

var light = new THREE.PointLight (0xffffff, 1, 100); 
light.position.set (10, 10, 10); 
scene.add (light); 
var geometry = new THREE.BoxGeometry (1, 1, 1); 
var material = new THREE.MeshPhongMaterial(); 
var cube = new THREE.Mesh (geometry, material); 
scene.add (cube); 

Wenn ich jetzt einen Punkt Licht in einem THREE.PolyhedronGeometry Objekt festgelegt es wie folgt aussieht: THREE.PolyhedronGeometry with point light

var light = new THREE.PointLight (0xffffff, 1, 100); 
light.position.set (10, 10, 10); 
scene.add (light); 
var geometry = new THREE.PolyhedronGeometry (vertices, faces, 1, 0); 
var vertices = [-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1]; 
var faces = [2,1,0,0,3,2,0,4,7,7,3,0,0,1,5,5,4,0,1,2,6,6,5,1,2,3,7,7,6,2,4,5,6,6,7,4]; 
var material = new THREE.MeshPhongMaterial(); 
var cube = new THREE.Mesh (geometry, material); 
scene.add (cube); 

ich wissen will, wo dieses Verhalten herkommt und wie ich Polyeder Gesichter wie boxs so schön zu machen verwalten zu verhalten?

Ich habe gelesen, dass es mit geometry.computeFaceNormals() verwandt sein könnte.

Also habe ich es ausprobiert, aber es macht keinen Unterschied.

Antwort

0

, wenn etwas mit, wie Licht verhält sich auf einer Oberfläche unterschiedlich ist, erste Kandidaten sind Normalen suchen

diese

für die Box Gesicht wahr ist
boxGeometry.faces[i].normal.equals(boxGeometry.faces[i].vertexNormals[j]);//true 

so hat Kasten für jedes Gesicht nur einfache normale

das Polyeder hat unterschiedliche Flächennormale von den normalen Scheitels

polyhedronGeo.faces[i].normal.equals(polyhedronGeo.faces[i].vertexNormals[j]);//not true 

und einige der Vertex-Normalen sind untereinander

polyhedronGeo.faces[i].vertexNormals[j].equals(polyhedronGeo.faces[i].vertexNormals[k]); 
//not true for some j,k 

nicht gleich, dass das Licht Deshalb sieht ~ schemenhaft - normal für den Shader aus vertexNormals interpoliert wird das Polyeder zu ändern wie eine Schachtel sehen nur die ändern Vertex notmals das Gesicht normal passen

wie für

geometry.computeFaceNormals(); 

es werden nur die Flächennormalen berechnen, nicht die vertexNormals

gibt es eine andere Funktion

geometry.computeVertexNormals(); 

aber das würde Vertex Normale erzeugen, wie in Polyeder

0

Dank Derte ist. Ihr Nachdenken brachte mich näher an den Punkt. Also mit erweiterten Keywords fand ich diese: https://github.com/mrdoob/three.js/issues/1982

Die Antwort auf meine Frage ist diese Linie, Abflachung Beschattung für „freie Formen“:

material.shading = THREE.FlatShading;