Drei JS – Finden Sie alle Punkte, wo ein mesh schneidet eine Ebene
Habe ich eine three.js Szene umfasst eine Ebene schneidet eine Masche. Was ich tun möchte ist bekommen ein array von Punkten für alle Orte, an denen eine Kante des Netzes durchquert die Ebene. Ich habe einen guten Blick für Lösungen und kann nicht scheinen, etwas zu finden.
Hier ist ein Bild von dem, was ich derzeit habe:
Und hier habe ich markiert die Koordinaten, die ich bin versucht zu sammeln:
Ob jemand kann mich in die richtige Richtung, das würde am meisten geschätzt.
Dank,
S
Dies ist nicht die ultimative Lösung. Dies ist nur ein Punkt, wo man aus starten.
UPD: Hier ist eine Erweiterung von dieser Antwort, wie form Konturen aus gegebenen Punkte.
Außerdem ist es gemäß diese Frage ALSO mit tollen anwers von WestLangley und Lee Stemkoski über die
.localToWorld()
Methode derTHREE.Object3D()
.Nehmen wir an, Sie wollen zu finden, die Schnittpunkte der gewöhnlichen geometrie (zum Beispiel
THREE.DodecahedronGeometry()
).Die Idee:
THREE.Plane()
hat die.intersectLine ( line, optionalTarget )
MethodeEinem Netz enthält Flächen (
THREE.Face3()
)Jedes Gesicht hat
a, b, c
Eigenschaften, wo die Indizes der Eckpunkte gespeichert sind.Wenn wir wissen, dass die Indizes der Scheitelpunkte, wir können Ihnen aus der fülle der
vertices
Wenn wir wissen, dass die Koordinaten der Eckpunkte von einem Gesicht können wir den Bau von drei
THREE.Line3()
ObjekteWenn wir drei Zeilen, können wir überprüfen, ob unser Flugzeug schneidet Sie.
Wenn wir einen Schnittpunkt, dann bewahren wir es in einem array.
Wiederholen Sie die Schritte 3 – 7 für jede Seite des mesh
Einige Erklärung mit code:
Wir haben
plane
dieTHREE.PlaneGeometry()
undobj
dieTHREE.DodecahedronGeometry()
So, lassen Sie uns ein
THREE.Plane()
:Hier drei Eckpunkte jeder Fläche von
plane
koplanar sind, so können wir erstellenmathPlane
aus, indem Sie die.setFromCoplanarPoints()
Methode.Dann werden wir in einer Schleife durch Gesichter unserer
obj
:wo
und
Am Ende werden wir unsere Punkte sichtbar:
jsfiddle Beispiel. Drücken Sie die Taste, um die Punkte der Schnittpunkt zwischen der Ebene und den Dodekaeder.
var shape = new THREE.Shape(); shape.triangulateShape ( contour);
wenn ja, es könnte funktionieren, für ein Teil, ist aber immer noch das Problem mit den Löchern 🙂 aber vielen Dank, dass mir bewusst ist der Letzte Teil 🙂THREE.Shape()
(wenn Sie bereits haben Ihre Haupt-Kontur und Löcher), die Sie verwenden könnenTHREE.ShapeGeometry()
oderTHREE.ShapeBufferGeometry()
.