Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 21:41

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Blender und Python
BeitragVerfasst: Do Aug 23, 2007 21:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Wir versuchen, ein zu exportierendes Objekt zu triangulieren, ohne das Objekt an sich zu verändern.

Dabei gehen wir wie folgt vor:
- Objekt kopieren
- Kopiertes Objekt triangulieren
- Daten des kopierten, triangulierten Objekts exportieren
- Kopiertes Objekt löschen

Beim letzten Punkt liegt unser Problem:
DAS KOPIERTE OBJEKT LÄSST SICH NICHT MEHR ENTFERNEN
(SIEHE ROTE UMKREISUNG)

Die Bilder im Anhang veranschaulichen das.


Wir haben folgenden Python-Code benutzt:

Code:
  1. # ob = Blender-Standard-Cube
  2. ob = Object.GetSelected()[0]
  3.  
  4. # Instanz der aktuellen Szene erstellen
  5. scn = Scene.GetCurrent()
  6.  
  7. # Kopie des selektierten Objekts (inkl. Mesh) erstellen
  8. tmpob = scn.objects.new(ob.getData(0, 1).__copy__())
  9.  
  10. # Instanz des Meshs des kopierten Objekts erstellen
  11. me = tmpob.getData(0, 1)
  12.  
  13. # Cube triangulieren
  14. me.quadToTriangle(0)
  15.  
  16. # Objekt von der Szene abtrennen
  17. scn.objects.unlink(tmpob)
  18.  
  19. # Bewirkt, dass Mesh von Material abgetrennt wird
  20. me.verts = None



Vielen Dank im Voraus für jede Hilfe!

MatReno, Conan


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 24, 2007 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Du könntest die Konvertierung doch On the fly lösen.
Einfach beim durchgehen der Faces prüfen, ob 3 oder 4 Vertice vorliegen und dann dem entsprechend in deine Liste dann 3 oder 6(4 Punkte) Vertice eintragen.
Code:
  1. def ProcessMesh(Mesh,file,matrix):
  2.   faces=Mesh.faces
  3.   verts=[]
  4.   norms=[]
  5.   uvs=[]
  6.   for f in faces:
  7.     if len(f.v)==4:
  8.       verts.append(f.v[0].co)
  9.       norms.append(f.normal)
  10.       uvs.append(f.uv[0])
  11.       verts.append(f.v[1].co)
  12.       norms.append(f.normal)
  13.       uvs.append(f.uv[1])
  14.       verts.append(f.v[2].co)
  15.       norms.append(f.normal)
  16.       uvs.append(f.uv[2])
  17.  
  18.       verts.append(f.v[0].co)
  19.       norms.append(f.normal)
  20.       uvs.append(f.uv[0])
  21.       verts.append(f.v[2].co)
  22.       norms.append(f.normal)
  23.       uvs.append(f.uv[2])
  24.       verts.append(f.v[3].co)
  25.       norms.append(f.normal)
  26.       uvs.append(f.uv[3])
  27.     if len(f.v)==3:
  28.       for vert in f.v:
  29.         verts.append(vert.co)
  30.         norms.append(f.normal)
  31.       uvs.append(f.uv[0])
  32.       uvs.append(f.uv[1])
  33.       uvs.append(f.uv[2])
  34.   file.write(struct.pack("I",len(faces)))
  35.   for f in faces:
  36.     file.write(struct.pack("B",len(f.image.name)))
  37.     file.write(f.image.name)
  38.     if len(f.v)==4:
  39.       file.write(struct.pack("B",6))
  40.     if len(f.v)==3:
  41.       file.write(struct.pack("B",3))
  42.   file.write(struct.pack("I",len(verts)))
  43.   for v in verts:
  44.     file.write(struct.pack("fff",v[0],v[1],v[2]))
  45.   for no in norms:
  46.     file.write(struct.pack("fff",no[0],no[1],no[2]))
  47.   for uv in uvs:
  48.     file.write(struct.pack("ff",uv[0],uv[1]))


Sonnst ist noch zu sagen, dass alle Änderungen an einem Blender Mesh erstmal On the fly sind und erst mit dem manuellen Update auf das Objekt übernommen werden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 24, 2007 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ja, das haben wir uns auch schon überlegt.
Aber da es ja eine Methode in Blender gibt, die das erledigt, kann man die ja auch nutzen, so bleibt das Script klein und übersichtlicher. Außerdem sind meine Python Kenntnisse nicht so überragend, dass ich das mal so eben hätte coden können.
Aber mal sehen wir verwenden vllt deine Methode, wenn's dir nix ausmacht :wink:

Zu dem Problem mit den nichtgelöschten Objekt inkl. Mesh:
Wenn man die .Blend-Datei speichert, und sie neulädt, wird das Objekt [Cube.001] gelöscht (rote umkreisung, unten), aber das Mesh [Cube.001] (rote umkreisung, oben) bleibt erhalten. Nach nochmaligem speichern/reloaden, ist auch dieses von Blender entfernt worden.

Anscheinend entfernt Blender alle Datablocks, die keinen User haben (keine farbe/trasparent im OOPs-Schematic) nach einem save/reload.
Wenn das Objekt gelöscht wurde, so hat das Mesh keine User mehr (entsprechende Farbe (rot) wird transparent).
Erneutes save/reload löscht es daher.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 25, 2007 17:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Du kannst auch auf das orginal die Funktion anwenden und dann
Code:
  1. if editmode: Window.EditMode(1)
machen.
Damit geht Blender wieder in den normalen Objektmodus und alles darauf angewendete wird übernommen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 08:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ja, aber dann würde ja das original verändert.
Aber für einen Exporter will ich das nicht unbedingt haben.
Dann wäre nach dem Export das gesamte Mesh trianguliert.
Und rückgängigmachen geht ja auch nicht unbedingt und ist auch störend...

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 28, 2007 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hallo,

nun haben wir obiges Problem gelöst, stehen jedoch diesmal vor einem, wie es uns scheint, weit größeren Problem:

Jetzt geht es um das Exportieren der Bones und Keyframes.
Die Bone-Struktur (mit parent und childs) haben wir bereits erfolgreich exportieren können.
Nun wollen wir pro IPO-Curve-Editor-Node ein KeyFrame mit allen Bone-Matrizen exportieren.
Dazu wollten wir folgende Funktion benutzen:

Code:
  1. ...
  2. # arm ist ein Armature Object
  3. act = arm.getAction()
  4. act.getFrameNumbers()  # <-- hier stürtzt Blender, mit einer "Senden/Nicht Senden" Meldung, ab
  5. ...


Ist das überhaupt der richtige Weg, oder gibt es da eine bessere Möglichkeit,
an die Matrizen der Bones zu gelangen?

Gibt es eine equivalente Funktion zu getFrameNumbers()?

Vielen Dank für eure Hilfe,
MatReno, Conan

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 29, 2007 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Dazu kann dir oc2k1 wohl mehr sagen, ich mach ihn mal auf den Topic aufmerksam.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 31, 2007 14:16 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Man muss ein object nicht kopieren, solange man blender in dem script nicht sagt das die änderungen übernommen werden sollen. Man kann so viel wie man will am mesh verändern ohne das es auswirkungen auf das model hat. lediglich bei matrizen sollte man immer kopien erstellen, da diese teilweisedirekte auswirkungen haben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 31, 2007 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
achja,
dann muss ich da noch mal schauen, ob ich es auch ohne hinbekomme ;)
Aber weißt du wie das mit den Matrizen der Bones bei Animationen abläuft?

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 31, 2007 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Schau in meinen Lumina exporter auf http://lumina.sf.net Dort ist am ende ein wenig auskommentierter code der die bonematrizen der keyframes verarbeitet


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 14:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hi oc2k1!

Wenn ich das richtig sehe (ich beziehe mich auf den besagten, auskommentierten Code), dann benutzt du die Funktion act.getFrameNumbers() (wobei "act" eine Action der Armature ist), um an die Posen per Frame der Armature zu gelangen. Rufe ich die Funktion jedoch in meinem Code auf, stürzt Blender ab :( . Dabei wäre das genau die passende Funktion und ich finde leider keine andere, die diese Aufgabe übernimmt.
Kannst du dir vorstellen, warum der Aufruf dieser Funktion Blender zum Absturz bringt?

Vielen Dank,
Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 21, 2007 11:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
MatReno hat geschrieben:
Code:
  1. ...
  2. # arm ist ein Armature Object
  3. act = arm.getAction()
  4. act.getFrameNumbers()  # <-- hier stürtzt Blender, mit einer "Senden/Nicht Senden" Meldung, ab
  5. ...

Jetzt zitiere ich mich schon selber... ;)
Egal, auf jedenfall ist obiges Problem nicht mehr relevant.
Mit der neuen Blender-Version (2.45) ist dieser Absturz-Bug offensichtlich behoben worden :D
D.h. getFrameNumbers liefert nun eine Liste aller Key-Frames zurück, so wie es sein sollte.
Nun kann es weitergehen 8)

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]