Punkt auf Oberfläche generieren

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

__deets__ hat geschrieben: Mittwoch 28. Oktober 2020, 23:29 Ich würde wirklich nicht selbst sowas programmieren. Hier ist eine andere Bibliothek & ein Beispiel wie man da Körper mit strahlen schneidet. https://trimsh.org/examples/ray.html
Ok das ist ja schonmal super.
Mein Problem ist nun, wenn ich diese Biblitothek anwende, funktioniert das irgendwie nicht mit dem Koordinatensystem meiner .OBJ-Datei...
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

🤷‍♂️ Ohne konkreten Code und Obj Dateien und so kann man dazu nix sagen.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Ich hab verschiedene .OBJ-Dateien versucht. Hier eine ganz einfache mit vier Wänden.
https://drive.google.com/file/d/1f4izVx ... sp=sharing
(Wusste nicht, wie ich sonst die Datei hier einfügen sollte.

Code: Alles auswählen

import pywavefront
import trimesh
import numpy as np

scene = pywavefront.Wavefront('C:/.../4waende.obj', collect_faces=True)

print(scene.vertices)

for mesh in scene.mesh_list:
    print(mesh.faces)

mesh = mesh.faces

ray_origins = np.array([[1, 1, 1])

ray_directions = np.random.rand(10000, 3)

print(mesh.ray.intersects_location.__doc__)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber du schneidest doch gar nichts. Und die Zufallsstrahlen sind ja nur in einem der 8 Quadranten.

Du musst den Punkt von dem du ausgehst schon irgendwie angeben, passend zur Objekt-Datei. Der ist ja unmöglich zu raten. Bestenfalls kannst du den Schwerpunkt aller Punkte im Objekt nehmen, aber das ist eine ziemlich maue Heuristik.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Ich habe den Punkt mehrmals variiert und egal was ich dort eingebe, es kommt immer Syntax Fehler. Auch wenn ich weiß, dass der Punkt mitten im Raum liegt.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist wieder ein Fall von 🤷‍♂️ Wenn wir den Code nicht sehen, und den dazu passenden Fehler, kann man dazu doch auch nichts sagen.

Ich kann hier den Code betrachten, den Fehler besprechen, und auch das OBJ-File mal einladen in zB mesh lab, um das zum code ins Verhältnis zu setzen.

Aber 2h meiner Zeit damit zu verbringen, eine schlüsselfertige Lösung bereitzustellen, ist nicht möglich.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Hier ist die Ausgabe, wenn ich den Code laufen lasse:

Code: Alles auswählen

C:\ProgramData\Anaconda3\envs\Punktwolke_3D\python.exe C:/Users/Darija/PycharmProjects/untitled1/Test.py
  File "C:/Users/Darija/PycharmProjects/untitled1/Test.py", line 14
    ray_origins = np.array([[1, 1, 1])
                                     ^
SyntaxError: invalid syntax

Process finished with exit code 1
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir fehlt eine schliessende Klammer genau an der Stelle, die der Interperter da mit dem ^ anzeight. Oder etwas weiter links davon eine zu viel.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Oh Gott...Ich habe 1000 mal geguckt, ob mit den Klammern alles in Ordnung ist und dann das...super...:-D Ich danke dir.
Jetzt kommt leider folgendes:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/Darija/PycharmProjects/untitled1/Test.py", line 18, in <module>
    print(mesh.ray.intersects_location.__doc__)
AttributeError: 'list' object has no attribute 'ray'
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das mesh ist eine Liste. Und eine Liste hat kein Attribut ray. Das liegt wahrscheinlich daran, dass du weiter vorher mesh mit mesh.faces ueberschreibst. Ein Grund, gute Variablennamen zu nehmen. Also stattdessen mesh_faces = mesh.faces. Wenn ueberhaupt. Du kannst ja auch einfach mesh.faces benutzen. Nur eben nicht hier. Ich nehme jedenfalls mal an, dass man da mesh nehmen muss. Dazu musst du in die Dokumentation schauen.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Man muss hier mesh nehmen...Wie könnte ich dieses Problem denn lösen?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe die Frage nicht. Du hast doch irgendwoher die Idee, dass es ein solches ray-Ding gibt. Woher denn?

Und mesh ist ein Objekt, das alle Flaechen eines Netzes beinhaltet. So wie ein Auto eine Reihe von Reifen hat. Und du kannst sagen "mach die Tuer am Auto auf". Aber nicht "Sei Auto die Reifen des Autos. Nun mach die Tuer am Auto, das eigentlich eine Liste von Reifen ist, auf". Das geht ja auch in die Hose.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Jetzt bin ich komplett verwirrt...
Ich dachte die Rays sind die Strahlen, die generiert werden, die dann die Meshes schneiden... und ich habe ja eine Liste mit den Meshes vorher schon erstellt, die in mesh.faces gespeichert ist. Wieso sollte das ray-Ding denn da drin sein?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast ein Mesh. Dann sagst du

mesh = mesh.faces

woraufhin mesh eine Liste von Flaechen ist. Und von dem probierst du ein ray zu bekommen. Das hast du dir doch ausgedacht. Nicht ich. Woher nimmst du denn die Information, dass die Flaechen ein solches Attribut ray haben? Ich habe mal das pywavefront-Modul durchsucht, und ausser in einem Kommentar kommt da nicht einmal ray im Code vor: https://github.com/pywavefront/PyWavefront/search?q=ray

Woher also kommt das? Das hast du doch in den Code geschrieben.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Herzdame2608 hat geschrieben: Dienstag 24. November 2020, 10:30
__deets__ hat geschrieben: Mittwoch 28. Oktober 2020, 23:29 Ich würde wirklich nicht selbst sowas programmieren. Hier ist eine andere Bibliothek & ein Beispiel wie man da Körper mit strahlen schneidet. https://trimsh.org/examples/ray.html
Ok das ist ja schonmal super.
Mein Problem ist nun, wenn ich diese Biblitothek anwende, funktioniert das irgendwie nicht mit dem Koordinatensystem meiner .OBJ-Datei...
Das kommt aus dieser Bibliothek...
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber die benutzt du doch nirgends. Du importierst die, aber du rufst keine ihrer Funktionalitaeten auf, denn sonst muesste da Code der Form

Code: Alles auswählen

 trimesh.irgendwas()
stehen. Tut aber nicht.
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Muss ich um ein richtiges mesh zu bekommen zunächst die vertices und faces unter mesh einspeichern?
Bsp.:

Code: Alles auswählen

mesh = trimesh.Trimesh(vertices=[[0, 0, 0], [0, 0, 1], [0, 1, 0]],
                       faces=[[0, 1, 2]])
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Ja gut, bin da gerade selber drauf gekommen, leider bisschen spät. Vielen dank dir..
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Wenn ich jetzt den ganzen Code der Bibliothek laufen lasse kommt folgender Fehler:

Code: Alles auswählen

[(0.19995470506696, 0.199980986871306, 0.0), (0.19995470506696, 0.199980986871306, 2.6), (0.19995470506696, 6.59998098687132, 0.0), (0.19995470506696, 6.59998098687132, 2.6), (0.19995470506696, 6.59998098687132, 0.0), (0.19995470506696, 6.59998098687132, 2.6), (-4.52949330401187e-05, 6.59998098687132, 0.0), (-4.52949330401187e-05, 6.59998098687132, 2.6), (-4.52949330401187e-05, 6.59998098687132, 0.0), (-4.52949330401187e-05, 6.59998098687132, 2.6), (-4.52949330401187e-05, 0.199980986871306, 0.0), (-4.52949330401187e-05, 0.199980986871306, 2.6), (-4.52949330401187e-05, 0.199980986871306, 0.0), (-4.52949330401187e-05, 0.199980986871306, 2.6), (0.19995470506696, 0.199980986871306, 0.0), (0.19995470506696, 0.199980986871306, 2.6), (0.19995470506696, 0.199980986871306, 0.0), (0.19995470506696, 6.59998098687132, 0.0), (-4.52949330401187e-05, 6.59998098687132, 0.0), (-4.52949330401187e-05, 0.199980986871306, 0.0), (0.19995470506696, 0.199980986871306, 2.6), (0.19995470506696, 6.59998098687132, 2.6), (-4.52949330401187e-05, 6.59998098687132, 2.6), (-4.52949330401187e-05, 0.199980986871306, 2.6), (8.69995470506695, 0.19998098687131, 0.0), (8.69995470506695, 0.19998098687131, 2.6), (-4.52949330507576e-05, 0.19998098687131, 0.0), (-4.52949330507576e-05, 0.19998098687131, 2.6), (-4.52949330507576e-05, 0.19998098687131, 0.0), (-4.52949330507576e-05, 0.19998098687131, 2.6), (-4.52949330507576e-05, -1.90131286900014e-05, 0.0), (-4.52949330507576e-05, -1.90131286900014e-05, 2.6), (-4.52949330507576e-05, -1.90131286900014e-05, 0.0), (-4.52949330507576e-05, -1.90131286900014e-05, 2.6), (8.69995470506695, -1.90131286900014e-05, 0.0), (8.69995470506695, -1.90131286900014e-05, 2.6), (8.69995470506695, -1.90131286900014e-05, 0.0), (8.69995470506695, -1.90131286900014e-05, 2.6), (8.69995470506695, 0.19998098687131, 0.0), (8.69995470506695, 0.19998098687131, 2.6), (8.69995470506695, 0.19998098687131, 0.0), (-4.52949330507576e-05, 0.19998098687131, 0.0), (-4.52949330507576e-05, -1.90131286900014e-05, 0.0), (8.69995470506695, -1.90131286900014e-05, 0.0), (8.69995470506695, 0.19998098687131, 2.6), (-4.52949330507576e-05, 0.19998098687131, 2.6), (-4.52949330507576e-05, -1.90131286900014e-05, 2.6), (8.69995470506695, -1.90131286900014e-05, 2.6), (8.49995470506695, 6.7999809868713, 0.0), (8.49995470506695, 6.7999809868713, 2.6), (8.49995470506695, 0.199980986871296, 0.0), (8.49995470506695, 0.199980986871296, 2.6), (8.49995470506695, 0.199980986871296, 0.0), (8.49995470506695, 0.199980986871296, 2.6), (8.69995470506695, 0.199980986871296, 0.0), (8.69995470506695, 0.199980986871296, 2.6), (8.69995470506695, 0.199980986871296, 0.0), (8.69995470506695, 0.199980986871296, 2.6), (8.69995470506695, 6.7999809868713, 0.0), (8.69995470506695, 6.7999809868713, 2.6), (8.69995470506695, 6.7999809868713, 0.0), (8.69995470506695, 6.7999809868713, 2.6), (8.49995470506695, 6.7999809868713, 0.0), (8.49995470506695, 6.7999809868713, 2.6), (8.49995470506695, 6.7999809868713, 0.0), (8.49995470506695, 0.199980986871296, 0.0), (8.69995470506695, 0.199980986871296, 0.0), (8.69995470506695, 6.7999809868713, 0.0), (8.49995470506695, 6.7999809868713, 2.6), (8.49995470506695, 0.199980986871296, 2.6), (8.69995470506695, 0.199980986871296, 2.6), (8.69995470506695, 6.7999809868713, 2.6), (-4.52949330362884e-05, 6.5999809868713, 0.0), (-4.52949330362884e-05, 6.5999809868713, 2.6), (8.49995470506695, 6.5999809868713, 0.0), (8.49995470506695, 6.5999809868713, 2.6), (8.49995470506695, 6.5999809868713, 0.0), (8.49995470506695, 6.5999809868713, 2.6), (8.49995470506695, 6.7999809868713, 0.0), (8.49995470506695, 6.7999809868713, 2.6), (8.49995470506695, 6.7999809868713, 0.0), (8.49995470506695, 6.7999809868713, 2.6), (-4.52949330362884e-05, 6.7999809868713, 0.0), (-4.52949330362884e-05, 6.7999809868713, 2.6), (-4.52949330362884e-05, 6.7999809868713, 0.0), (-4.52949330362884e-05, 6.7999809868713, 2.6), (-4.52949330362884e-05, 6.5999809868713, 0.0), (-4.52949330362884e-05, 6.5999809868713, 2.6), (-4.52949330362884e-05, 6.5999809868713, 0.0), (8.49995470506695, 6.5999809868713, 0.0), (8.49995470506695, 6.7999809868713, 0.0), (-4.52949330362884e-05, 6.7999809868713, 0.0), (-4.52949330362884e-05, 6.5999809868713, 2.6), (8.49995470506695, 6.5999809868713, 2.6), (8.49995470506695, 6.7999809868713, 2.6), (-4.52949330362884e-05, 6.7999809868713, 2.6)]
[[1, 0, 2], [3, 1, 2], [5, 4, 6], [7, 5, 6], [9, 8, 10], [11, 9, 10], [13, 12, 14], [15, 13, 14], [18, 17, 16], [19, 18, 16], [20, 21, 22], [20, 22, 23], [25, 24, 26], [27, 25, 26], [29, 28, 30], [31, 29, 30], [33, 32, 34], [35, 33, 34], [37, 36, 38], [39, 37, 38], [42, 41, 40], [43, 42, 40], [44, 45, 46], [44, 46, 47], [49, 48, 50], [51, 49, 50], [53, 52, 54], [55, 53, 54], [57, 56, 58], [59, 57, 58], [61, 60, 62], [63, 61, 62], [66, 65, 64], [67, 66, 64], [68, 69, 70], [68, 70, 71], [73, 72, 74], [75, 73, 74], [77, 76, 78], [79, 77, 78], [81, 80, 82], [83, 81, 82], [85, 84, 86], [87, 85, 86], [90, 89, 88], [91, 90, 88], [92, 93, 94], [92, 94, 95]]
Traceback (most recent call last):
  File "C:/Users/Darija/PycharmProjects/untitled1/Test.py", line 23, in <module>
    ray_directions = ray_directions)
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 107, in intersects_location
    **kwargs)
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 66, in intersects_id
    triangles_normal=self.mesh.face_normals)
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 240, in ray_triangle_id
    tree=tree)
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 344, in ray_triangle_candidates
    bounds=tree.bounds)
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 390, in ray_bounds
    for i, a in enumerate(axis)]).reshape((-1, 1))
  File "C:\ProgramData\Anaconda3\envs\Punktwolke_3D\lib\site-packages\trimesh\ray\ray_triangle.py", line 390, in <listcomp>
    for i, a in enumerate(axis)]).reshape((-1, 1))
IndexError: invalid index to scalar variable.

        Return unique cartesian locations where rays hit the mesh.
        If you are counting the number of hits a ray had, this method
        should be used as if only the triangle index is used on- edge hits
        will be counted twice.

        Parameters
        ------------
        ray_origins : (m, 3) float
          Ray origin points
        ray_directions : (m, 3) float
          Ray direction vectors

        Returns
        ---------
        locations : (n) sequence of (m,3) float
          Intersection points
        index_ray : (n,) int
          Array of ray indexes
        index_tri: (n,) int
          Array of triangle (face) indexes
        

Process finished with exit code 1
Irgendwas stimmt mit den numpy arrays nicht, aber was genau?
Herzdame2608
User
Beiträge: 62
Registriert: Donnerstag 18. Juni 2020, 12:04

Code: Alles auswählen

import pywavefront
import trimesh
import numpy as np

scene = pywavefront.Wavefront('C:/Users/Darija/Desktop/Projekt1-Kopie.obj', collect_faces=True)

print(scene.vertices)  # gibt dir alle Punkte aus

for mesh in scene.mesh_list:  # Die Flächen "faces" stecken in den "meshes"
    print(mesh.faces)

mesh = trimesh.Trimesh(scene.vertices, mesh.faces)

ray_origins = np.tile(np.array([2,2,1]), (100,1))
print(ray_origins)

ray_directions = np.random.uniform(-1, 1, (100,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)


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()
Das ist der Code nun und es funktioniert:-) Ich danke euch allen für eure Hilfe.
Antworten