Three JS - Finden Sie alle Punkte, an denen ein Netz eine Ebene schneidet

8

Ich habe eine three.js-Szene erstellt, die eine Ebene enthält, die ein Gitter schneidet. Was ich tun möchte, ist eine Anordnung von Punkten für alle Orte, an denen eine Kante des Gitters die Ebene kreuzt. Ich habe mich nach Lösungen umgesehen und kann scheinbar nichts finden.

Hier ist ein Bild von dem, was ich gerade habe:

Und hier habe ich die Koordinaten hervorgehoben, die ich sammeln möchte:

Wenn mich jemand in die richtige Richtung weisen kann, wäre das sehr zu begrüßen.

Danke,

S

    
user1961104 20.02.2017, 15:32
quelle

1 Antwort

16

Dies ist nicht die ultimative Lösung. Dies ist nur ein Punkt, wo Sie beginnen können.

UPD: Hier ist eine Erweiterung dieser Antwort, wie man Konturen von gegebenen Punkten.

Es wird auch auf diese SO-Frage mit großartigen Antworten von WestLangley und Lee Stemkoski über die .localToWorld() -Methode verwiesen THREE.Object3D() .

Stellen Sie sich vor, Sie möchten Schnittpunkte einer gewöhnlichen Geometrie finden (z. B. THREE.DodecahedronGeometry() ).

Die Idee:

  1. THREE.Plane() hat die Methode .intersectLine ( line, optionalTarget )

  2. Ein Netz enthält Gesichter ( THREE.Face3() )

  3. Jede Seite hat a, b, c Eigenschaften, wo Indizes von Vertices gespeichert sind.

  4. Wenn wir Indizes von Scheitelpunkten kennen, können wir sie aus dem Array von vertices

  5. beziehen
  6. Wenn wir Koordinaten von Eckpunkten eines Gesichts kennen, können wir drei THREE.Line3() -Objekte

  7. erstellen
  8. Wenn wir drei Zeilen haben, können wir überprüfen, ob unsere Ebene sie schneidet.

  9. Wenn wir einen Schnittpunkt haben, können wir ihn in einem Array speichern.

  10. Wiederholen Sie die Schritte 3 bis 7 für jede Seite des Netzes

Einige Erklärung mit Code:

Wir haben plane , was THREE.PlaneGeometry() und obj ist, was THREE.DodecahedronGeometry()

ist

Lassen Sie uns also ein THREE.Plane() :

erstellen %Vor%

Hier sind drei Scheitelpunkte einer beliebigen Fläche von plane koplanar. Daher können wir mathPlane aus ihnen mit der Methode .setFromCoplanarPoints() erstellen.

Dann werden wir die Gesichter von obj :

durchlaufen %Vor%

wo

%Vor%

und

%Vor%

Am Ende werden wir unsere Punkte sichtbar machen:

%Vor%

jsfiddle Beispiel. Drücken Sie den Knopf dort, um die Schnittpunkte zwischen der Ebene und dem Dodekaeder zu erhalten.

    
prisoner849 20.02.2017, 20:13
quelle

Tags und Links