Streeung in Richtung des Richtungsvektors

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du entsprechend mehr Strahlen verschießt. Den notwendigen Öffnungswinkel kannst du aus der Entfernung des ersten Strahls und der gewünschten Dispersion berechnen.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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 ?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

__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.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

__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 :-D
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.)
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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...
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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.
Zuletzt geändert von einfachTobi am Montag 18. Januar 2021, 19:48, insgesamt 1-mal geändert.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

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...
Antworten