Seite 1 von 2

Re: Punkt auf Oberfläche generieren

Verfasst: Dienstag 24. November 2020, 10:30
von Herzdame2608
__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...

Re: Punkt auf Oberfläche generieren

Verfasst: Dienstag 24. November 2020, 12:18
von __deets__
🤷‍♂️ Ohne konkreten Code und Obj Dateien und so kann man dazu nix sagen.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 11:48
von Herzdame2608
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__)

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 13:26
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 13:30
von Herzdame2608
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 13:45
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 13:57
von Herzdame2608
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

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:01
von __deets__
Dir fehlt eine schliessende Klammer genau an der Stelle, die der Interperter da mit dem ^ anzeight. Oder etwas weiter links davon eine zu viel.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:21
von Herzdame2608
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'

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:29
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:35
von Herzdame2608
Man muss hier mesh nehmen...Wie könnte ich dieses Problem denn lösen?

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:42
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:51
von Herzdame2608
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?

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 14:56
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 15:00
von Herzdame2608
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...

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 15:19
von __deets__
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.

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 15:22
von Herzdame2608
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]])

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 15:23
von Herzdame2608
Ja gut, bin da gerade selber drauf gekommen, leider bisschen spät. Vielen dank dir..

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 15:49
von Herzdame2608
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?

Re: Punkt auf Oberfläche generieren

Verfasst: Freitag 27. November 2020, 17:50
von Herzdame2608

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.