2015-09-07 26 views
6

Mam w tej scenie 27 oczek, z których każda ma przypisany numer. Ten z największą liczbą będzie miał skalę 1. Pozostałe będą miały kolejno wartość mniejszą niż 1.Jak skalować siatkę bez zmiany pozycji?

Następnie chcę, aby odpowiednio wspinać się po każdej z pętli. Mój problem występuje, gdy zmienia się pozycja każdej siatki.

Rzeczywiście jest skalowany do wymaganego rozmiaru, ale zmienia położenie. Walczę, gdy kilka ekranów się układa.

Muszę tylko do wznoszenia i pozostać w tej samej pozycji jak w poniższym przykładzie:

stanach USA są skalowane, ale wciąż utrzymując swoją pozycję. Myślę, że skalują się do środka figury.

stworzyłem oczka (każde zwane „municipios”)

for(var s=0; s< features.features[x].geometry.coordinates[0].length; s=s+1){      
    geometria[x].vertices.push(new THREE.Vector3((((features.features[x].geometry.coordinates[0][s][0])+75.5)*10),(((features.features[x].geometry.coordinates[0][s][1])-5.5)*10),0));         
} 
forma_figura[x]=new THREE.Shape(geometria[x].vertices); 
extrude_geometria[x]=new THREE.ExtrudeGeometry(forma_figura[x],datos_extrusion); 
municipios[x] = new THREE.Mesh(extrude_geometria[x], materialExtrude[x]); 
scene.add(municipios[x]); 

// so I change the scale: 
//formula is the value of scale. The biggest number has escale 1. 
new TWEEN.Tween(municipios[x].scale).to({ x: formula, y: formula }, 1000).start(); 
//this ultimate line is the same: municipios[x].scale.set(formula,formula,formula); 
+0

, więc zwykle przed zmianą skali. http://i.imgur.com/okQQ5Ue.png?1 – velez11

Odpowiedz

6

Ponieważ pozycja oczka nie jest w jej środku, czy cokolwiek odniesienie ma to być: jeśli tworzysz geometrię z przeciętnych wierzchołków x Składnik powyżej 100, jego widoczną pozycją będzie jego rzeczywista pozycja plus (100,0,0). Jeśli nie określiłeś pozycji siatki ((0,0,0) domyślnie), to będzie ona wyglądała dokładnie (100,0,0). Skalowanie go o .5 na przykład spowoduje, że średnia pozycja będzie równa (100,0,0) *. 5 = (50,0,0), co spowoduje, że oczko zmieni swoją pozycję.

Co należy zrobić, to:

  • odjąć współrzędne środka ze wszystkich wierzchołków. Wierzchołki są wewnątrz geometrii, więc po wykonaniu tej czynności należy ustawić geometry.verticesNeedUpdate = true.

  • następnie dodać współrzędne centrum do oczek, aby to zrekompensować.

Wynikowa siatka zostanie umieszczona w środku bez przesunięcia.

Istnieją trzy różne możliwości definiowania centrum:

  • Three.js mogą Centrum siatki automatycznie w oparciu o centrum obwiedni z geometry.center() i THREE.GeometryUtils.center(geometry).
  • Można obliczyć wartość centroid, przechodząc przez wierzchołki po raz pierwszy, aby uzyskać ich średnie współrzędne.
  • Nie możesz chcieć ani środka pudełka, ani środka ciężkości, ale niestandardowego . Na przykład, jeśli skalujesz siatkę "ludzi" i chcesz, aby ich stopy dotykały ziemi w dowolnej skali: na płaszczyźnie poziomej centrum, które chcesz, może być jednym z dwóch pierwszych, ale jego pionowa współrzędna musi być najniższą znalezioną pionową współrzędną (bardzo dół stóp).

Oczywiście, jeśli twoje siatki są importowane z edytora 3D, możesz to zrobić również wewnątrz niego.

+0

Przepraszam za moją ignorancję, ale nie rozumiem. Zrozumiałem, że muszę przesunąć cały punkt siatki lokalnych współrzędnych 0,0,0. http://i.imgur.com/jXM7t63.png. Zrobiłem to: – velez11

+0

municipios [i] .position.x = offsetArray [i] .x; municipios [i] .position.y = offsetArray [i] .y municipios [i] .position.z = offsetArray [i] .z; // offsetArray [i] 0,0,0 jest lokalne dla każdej siatki. – velez11

+0

ze wszystkim, co dostaję umieścić w 0,0,0, po zastosowaniu skali dla każdej siatki i wreszcie zrobiłem: municipios [i] .translate.x = 0; municipios [i] .translate.y = 0; municipios [i] .translate.z = 0; – velez11