Seite 1 von 1
Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 11:08
von Herzdame2608
Hallo zusammen,
ich habe in "locations" die Koordinaten gespeichert, wo die Rays die erste Oberfläche treffen.
Der Richtungsvektor von locations[0] ist ray_directions[index_ray[0]]. (glaub ich)
Wie kann ich nun zu jeder Koordinate in locations eine zufällige Streuung IN RICHTUNG DES RICHTUNGSVEKTORS zwischen z.B. -5 und +5mm hinzufügen?
Vielen Dank vorab für eure Hilfe.
Hier der Code:
Code: Alles auswählen
import pywavefront
import trimesh
import numpy as np
scene = pywavefront.Wavefront('Modell_asbuilt.obj', collect_faces=True)
print(scene.vertices)
for mesh in scene.mesh_list:
print(mesh.faces)
mesh = trimesh.Trimesh(scene.vertices, mesh.faces)
ray_origins = np.tile(np.array([2.0,6.5,1.5]), (65000,1))
ray_directions = np.random.uniform(-1, 1, (65000,3))
print(mesh.ray.intersects_location.__doc__)
print(ray_directions)
locations, index_ray, index_tri = mesh.ray.intersects_location(
ray_origins = ray_origins, ray_directions = ray_directions, multiple_hits=False)
print('Strahl trifft Mesh bei folgender Koordinate:\n', locations)
ray_visualize = trimesh.load_path(np.hstack((ray_origins,
ray_origins + ray_directions*5.0)).reshape(-1, 2, 3))
mesh.unmerge_vertices()
mesh.visual.face_colors = [255,255,255,255]
mesh.visual.face_colors[index_tri] = [255, 0, 0, 255]
scene = trimesh.Scene([mesh,
ray_visualize])
scene.show()
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 16:42
von __deets__
Indem du entsprechend mehr Strahlen verschießt. Den notwendigen Öffnungswinkel kannst du aus der Entfernung des ersten Strahls und der gewünschten Dispersion berechnen.
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 16:48
von Herzdame2608
Ne ich glaube ich habe mich falsch ausgedrückt...
Ich habe die Locations, wo jede Zeile quasi einen richtungsvektor hat. Jetzt möchte ich zu dieser Zeile einen Zufallswert innerhalb eines bestimmten Intervalls hinzuaddieren, der auf dem schon dazugehörigen Strahl liegt.
Quasi sowas in der Art:
Locations2 = locations[0] + ray_directions[index_ray[0]] (in einem bestimmten Intervall)
Ist das bisschen verständlicher ?
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 16:56
von __blackjack__
@Herzdame2608: IMHO nicht wirklich verständlicher. Wenn Du das Ergebnis auf dem Strahl liegen soll, dann ist das ja nicht wirklich eine Addition sondern eine Multiplikation der Länge damit die sich um irgendwas um ±5mm ändert. Ich hätte die Ausgangsfrage wie __deets__ verstanden. Kannst Du eventuell eine (räumliche) Zeichnung machen welche die gegebenen Daten und das gewünschte Ergebnis illustrieren?
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:13
von einfachTobi
Wenn du die Richtungsvektoren hats, normiere sie und Multipliziere das mit der gewünschten Länge. Dann kannst du sie zu deinen Punkten addieren.
Beispiel:
Code: Alles auswählen
import numpy as np
points = np.array([[1, 1],[-1, -1]])
origins = np.array([[0,0 ], [0,0]])
directions = points - origins
new_points = points + 3 * directions/np.linalg.norm(directions, axis=0) # Hier Verschiebung um 3. Wahlweise durch Zufallszahl ersetzen
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:13
von Herzdame2608
Hier ist ein Foto, so wie ich es meine..habe es jetzt mal schnell in Paint skizziert. Da wo der orangene Punkt ist, also auf dem Richtungsvektor möchte ich quasi die Streuung haben.
https://drive.google.com/file/d/1PUythy ... sp=sharing
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:21
von __blackjack__
@Herzdame2608: Reicht mir persönlich nicht um das Problem zu verstehen. Wie kommt die Position des orangenen Punkts zustande? Und wie soll von dort aus dann gestreut werden? Soll der Kegel(?) von Ausgangspunkt aus in dem die Streuung liegt an dem Punkt einen Radius von 5mm haben?
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:30
von Herzdame2608
__blackjack__ hat geschrieben: Montag 18. Januar 2021, 17:21
@Herzdame2608: Reicht mir persönlich nicht um das Problem zu verstehen. Wie kommt die Position des orangenen Punkts zustande? Und wie soll von dort aus dann gestreut werden? Soll der Kegel(?) von Ausgangspunkt aus in dem die Streuung liegt an dem Punkt einen Radius von 5mm haben?
Das ist auch kein Kegel. Das sind Stahlen, die auf eine Wand treffen. Der Schnittpunkt der Strahlen mit der Wand wird unter locations gespeichert. Der orangene Punkt ist ein Beispiel wohin ich den Schnittpunkt quasi verschieben möchte (mit einer Zufallszahl). Also entlang des Richtungsvektors soll eine Verschiebung stattfinden.
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:54
von __blackjack__
@Herzdame2608: Das mit den Strahlen war mir schon klar, aber ich hatte das so verstanden das ein neuer entstehen soll der auf dem Ziel irgendwo in einem Radius von 5mm auftreffen soll. Und die möglichen Strahlen dafür würden den erwähnten Kegel beschreiben.
Also willst Du die Länge eines Vektors der vom Ausgangs- zum Schnittpunkt geht, mit einem Faktor multiplizieren der diesen Vektor irgendwas zwischen ±5mm verlängert/verkürzt.
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:55
von Herzdame2608
einfachTobi hat geschrieben: Montag 18. Januar 2021, 17:13
Wenn du die Richtungsvektoren hats, normiere sie und Multipliziere das mit der gewünschten Länge. Dann kannst du sie zu deinen Punkten addieren.
Beispiel:
Code: Alles auswählen
import numpy as np
points = np.array([[1, 1],[-1, -1]])
origins = np.array([[0,0 ], [0,0]])
directions = points - origins
new_points = points + 3 * directions/np.linalg.norm(directions, axis=0) # Hier Verschiebung um 3. Wahlweise durch Zufallszahl ersetzen
Das habe ich gerade versucht, aber gebracht hat es leider nichts.
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 17:59
von Herzdame2608
__blackjack__ hat geschrieben: Montag 18. Januar 2021, 17:54
@Herzdame2608: Das mit den Strahlen war mir schon klar, aber ich hatte das so verstanden das ein neuer entstehen soll der auf dem Ziel irgendwo in einem Radius von 5mm auftreffen soll. Und die möglichen Strahlen dafür würden den erwähnten Kegel beschreiben.
Also willst Du die Länge eines Vektors der vom Ausgangs- zum Schnittpunkt geht, mit einem Faktor multiplizieren der diesen Vektor irgendwas zwischen ±5mm verlängert/verkürzt.
JAAAAAAAAAAAAAAAAAAA BITTEE

Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 18:56
von kbr
Wenn die Vermutung von __blackjack__, was Du eigentlich möchtest, korrekt ist und die Daten des Vektors liegen in Polarkoordinaten vor (ggf. transformieren), dann wird die Aufgabe ziemlich einfach. (Habe jetzt mal angenommen, dass es ein 3D-Vektor ist.)
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 19:04
von Herzdame2608
kbr hat geschrieben: Montag 18. Januar 2021, 18:56
Wenn die Vermutung von __blackjack__, was Du eigentlich möchtest, korrekt ist und die Daten des Vektors liegen in Polarkoordinaten vor (ggf. transformieren), dann wird die Aufgabe ziemlich einfach. (Habe jetzt mal angenommen, dass es ein 3D-Vektor ist.)
Es sind 3D-Vektoren...
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 19:44
von einfachTobi
Auch wenn die Doku dazu etwas dürftig ist, würde ich davon ausgehen, dass die Reihenfolge nicht von intersects_location geändert wird. index_ray dürfte eher einen trimesh-internen Index enthalten. Also ist ray_directions[0] der Richtungsvektor von locations[0].
Was genau hat denn nicht funktioniert?
Oh, ich sehe gerade, dass vermutlich bei np.linalg.norm(directions, axis=1) sein müsste. Aber ich bin mir nicht sicher wie bei dir die Punkte gespeichert sind.
Re: Streeung in Richtung des Richtungsvektors
Verfasst: Montag 18. Januar 2021, 19:47
von Herzdame2608
einfachTobi hat geschrieben: Montag 18. Januar 2021, 19:44
Auch wenn die Doku dazu etwas dürftig ist, würde ich davon ausgehen, dass die Reihenfolge nicht von intersects_location geändert wird. index_ray dürfte eher einen trimesh-internen Index enthalten. Also ist ray_directions[0] der Richtungsvektor von locations[0].
Was genau hat denn nicht funktioniert?
Ich weiß nicht genau, was nicht funktioniert hat, aber die punktwolke sieht genauso aus wie vorher. Man sieht keine Veränderung wenn ich sie darstelle und ich habe es sogar mit viel größeren werten versucht...