2013-02-12 21 views
10

Wykreśliłem, jak narysować linię w trojkach, problemem jest to, że muszę dynamicznie dodawać wierzchołki do linii. Kiedy dodam wierzchołki do linii dynamicznie, scena nie aktualizuje się.Dynamiczne dodawanie wierzchołków do linii w Three.js

Próbowałem już geometry.verticesNeedUpdate = true, co wydaje się nie działać.

Odpowiedz

12

EDYCJA: Korzystając z BufferGeometry i drawcalls można teraz wdrożyć równoważną funkcjonalność. Zobacz Drawing a line with three.js dynamically.

Three.js r.71


Dynamicznie dodawanie wierzchołków do linii nie jest obsługiwany. Jak stwierdzono w Wiki:

można aktualizować tylko zawartość buforów, nie można zmienić rozmiar buforów (jest to bardzo kosztowne, w zasadzie równoważne tworząc nową geometrię).

Można emulować zmianę rozmiaru, wstępnie alokując większy bufor, a następnie ukrywając/ukrywając niepotrzebne wierzchołki.

Three.js r.55

+0

thanks.i Chyba będę po prostu usunąć i ponownie dodać nową linię każdą klatkę ... po prostu wydaje się bardziej nieefektywne – K2xL

+0

myślę punkt WestLangley robił to, że staramy się robić to dynamicznie jest basicaly jako nieefektywne jak tylko tworząc w ten sposób całkowicie nową geometrię, dzięki czemu nie jest tak samo wydajna. – 0xor1

+1

Dodałem wszystkie punkty do geometrii przez ten wiersz kodu: linegeometryX.vertices.push (nowy THREE.Vertex (nowe THREE.Vector3 (x, y, z))); Jak ukryć/zwinąć niepotrzebne wierzchołki? – Dipak

4

wpadłem na to kilka dni temu też. Jak powiedział WestLangley, nie można wykonywać prawdziwej dynamicznej geometrii po wyjęciu z pudełka, ale alteredq ma kilka strategii "fałszowania" i osiągnięcia pożądanego efektu na https://github.com/mrdoob/three.js/issues/342.

W odniesieniu do komentarza dotyczącego ostatniej odpowiedzi, , nie po prostu usuń i ponownie dodaj nową linię ze sceny z każdą klatką - najprawdopodobniej otrzymasz potężne trafienie. Musisz użyć pierwszej lub drugiej strategii zastępczej alteredq.

W mojej aplikacji użyłem opcji 1 tak:

  1. Tworzenie obiektu THREE.Geometry z góry i zainicjować go z jak największą liczbą wierzchołków, jak myślisz musisz (lub inaczej to dość duża liczba wierzchołków). (Będziesz także musiał je jakoś ukryć, zanim chcesz je wyświetlić - ustawiam ich pozycje tak, aby były poza ekranem.)

  2. Utwórz obiekt THREE.Line z tą geometrią i dodaj do sceny.

  3. Teraz, gdy chcesz dodać nowy punkt do linii, musisz indeksować wierzchołki obiektu geometrii, znaleźć ostatni nieużywany tam i zaktualizować go - zmienić współrzędne na rzeczywiste, i ustaw geometry.verticesNeedUpdate = true; (w przeciwnym razie nic nie zmieni). (Patrz How to do updates na wiki).

jestem nadal dopracowujemy jeszcze pewne szczegóły na moim podejściem, ale powinny przynajmniej pozwalają uzyskać rysowanie linii na ekranie.

Three.js R55

+0

Jak zapobiec podłączaniu punktów poza ekranem do "rzeczywistych" punktów, które chcesz renderować? –

+0

Max, minęło już trochę czasu, więc nie pamiętam dokładnie, ale myślę, że zmieniłem kolor punktów (lub linii łączących) na taki sam, jak kolor tła sceny. Tak więc połączenie nadal istnieje, ale nie jest widoczne. – user1475135

2

Jako odpowiedź WestLangley mówi, że nie może tego zrobić.Oto prawda hacky obejście zdecydowałem się użyć:

  • przeznaczyć więcej wierzchołków niż muszę wypełnić geometry.vertices z punktu początkowego linii mojego
  • Jako nowe punkty przyjść że chcę dodać, przesunąć zawartość tablicy w lewo i napisać nowy punkt w ostatnim wpisie matrycy geometry.vertices

Kod: aby utworzyć nowy wiersz:

function createNewLine(startingPoint){ 
    var geometry = new THREE.Geometry(); 
    for (i=0; i<MAX_LINE_POINTS; i++){ 
    geometry.vertices.push(startingPoint.clone()); 
    } 
    myLine = new THREE.Line(geometry, lineMaterial); 
    myLine.geometry.dynamic = true; 
    scene.add(myLine); 
    render(); 
} 

Aby dodać punkt do linii:

function addPoint(myPoint) { 
    myLine.geometry.vertices.push(myLine.geometry.vertices.shift()); //shift the array 
    myLine.geometry.vertices[maxLinePoints-1] = myPoint; //add the point to the end of the array 
    myLine.geometry.verticesNeedUpdate = true; 
    render(); 
} 

Co w końcu z czym jest linia, która ma kilka punktów ułożone na wierzchu od siebie nawzajem, a następnie przez punkty rzeczywiście chcą render. Przesłałem problem do repozytorium git three.js, aby uzyskać prostsze rozwiązanie tego problemu. https://github.com/mrdoob/three.js/issues/4716

Powiązane problemy