md2-files and several texture-selections

Started by Elrohir, March 03, 2009, 06:09:27 PM

Previous topic - Next topic

Elrohir

Guten Abend

Mal wieder beschäftigt mich ein kleines Problem, was die Animationen betrifft. Undzwar geht, es wie die Überschrift schon sagt, darum, wie es wohl möglich wäre, das animierte objekt, auch wieder entsprechend zu texturieren, wenn es mehrere Selektionen und somit unterschiedliche texturen für die selektionen hat?
Denn bei allen beispielen die ich fand, habe ich immer nur den einzelnen .setTexture() befehl auf das komplette objekt gesehn, aber das nutzt in diesem falle ja wohl nichts... Leider habe ich bissher immer die 3ds dateien bereits in cinema4d texturiert und somit keinerlei Erfahrung im nachträglichen texturen im quellcode :o

MfG
Elrohir

EgonOlsen

Du kannst von jedem Object3D den PolygonManager bekommen (Object3D.getPolygonManager()). Der hat Methoden, die Texturen einzelner Polygone nachträglich zu verändern. Dazu muss man aber die "ID", d.h. den Index des Polygons im Modell kennen oder raten. Das kann je nach Fall etwas komplizierter werden, aber anders geht es leider nicht...

Elrohir

hm, also bekommt man das index des polygons, nicht der selektion? o.o
ich mein, muss doch einfacher gehn als für mehrere tausend polys einzeln rauszufinden, welchen index das hat, und dann die textur zuzuweisen o.o
und für kacheln etc. dürfte das doch auch eher unzuträglich werden, oder? o.o kommt doch nen bisschen komisch, wenn die textur auf jedem poly anders liegt u.u

EgonOlsen

Was genau meinst du mit "Selektion"? Das, was die Methoden in Interact2D teilweise liefern? Wenn ja, dann ist das die Polygon-ID. Damit kannst du direkt an den PolygonManager gehen. Wenn nein, was genau meinst du dann?

Elrohir

#4
Quote from: EgonOlsen on March 03, 2009, 10:42:06 PM
Was genau meinst du mit "Selektion"? Das, was die Methoden in Interact2D teilweise liefern? Wenn ja, dann ist das die Polygon-ID. Damit kannst du direkt an den PolygonManager gehen. Wenn nein, was genau meinst du dann?


Nunja, in Cinema4D gibt es halt die Möglichkeit, mehrere Polygone zu markieren, und zu bearbeiten, und dann kann man diese Selektion auch "einfrieren", und dann kommt son Selektions-tag hinter das Objekt, mithilfe dessen man immer sofort diese Polygone zur Hand hat, anstatt sie jedesmal neu selektieren zu müssen..

EDIT: Interact2D sagt mir leider gar nichts, von daher kannich dir dazu leider nichts sagen ;)

EgonOlsen

Ich verstehe...nein, diese Selektion hast du dann nicht mehr zur Verfügung. Was konkret willst du denn umtexturieren?

Elrohir

inwiefern umtexturieren? eher überhaupt erstmal texturieren, weil die texturen doch in dem md2-file verloren gehn...
Oder kann man, wenn man die grundposition als 3ds-file speichert, dieses 3ds-file sozusagen über das md2-mesh "überschreiben" oder so? :o

EDIT: und nja, müsste dann ja bei sämtlichen charakteren, "monstern", bzw. anderen npc's und anderen animierten objekten geschehn :o

EgonOlsen

Md2 unterstützt nur eine Textur pro Objekt. Ein einfaches setTexture() auf dem geladenen Objekt reicht daher.

Elrohir

#8
uhm, ich fürchte, wir reden gerade leicht aneinander vorbei...


ich habe einen charakter wie diesen:

http://upload.worldofplayers.de/files3/kla'mher.jpg

so, und nunja, wie würdest du denn jetzt dieses Objekt mitsamt Animation einbringen? oO *gerade ein wenig verwirrt ist*

EDIT: mir ist grad ne verrückte Idee gekommen...
was wäre, wenn man parallel zu der md2-datei ne 3ds-file mit dem objekt hat...
und dann geht man die poly-IDs einfach durch, holt sich für jede Poly-ID die textur und packt sie auf die Poly-ID des animierten Objektes... ginge sowas? :o (also, vom code her, klar, wüsst' ich auch, wie ich's machen muss, nur halt ob die theorie stimmt... kann es selber halt leider grad nicht überprüfen, da er die nächsten ca. 14 stunden wohl mit rendern von ner kleinen scene beschäftigt ist...)


EDIT2: ok, war schneller als gedacht..
habe es jetzt so probiert:
for(int i = 0; i<=animated.getPolygonManager().getMaxPolygonID();i++){
        animated.getPolygonManager().setPolygonTexture(i, mesh.getPolygonManager().getPolygonTexture(i));
     }

nur leider  kommt da texturtechnisch nur shice bei raus...

EgonOlsen

Quote from: Elrohir on March 04, 2009, 12:21:40 PM
uhm, ich fürchte, wir reden gerade leicht aneinander vorbei...
Ja mag sein...aber ich verstehe echt nicht, was du machen willst. Du hast diesen Kla'mger-Typen als Beispiel...ok, das ist ein MD2? Warum lädst du es dann nicht einfach als solches? Dann die entsprechende Texture zuweisen und fertig. Da es nur eine gibt, reicht das setTexture() in Object3D. Was genau willst du jetzt mit dem 3DS anstellen?  ???

Elrohir

Quote from: EgonOlsen on March 04, 2009, 07:42:43 PMJa mag sein...aber ich verstehe echt nicht, was du machen willst. Du hast diesen Kla'mger-Typen als Beispiel...ok, das ist ein MD2? Warum lädst du es dann nicht einfach als solches? Dann die entsprechende Texture zuweisen und fertig. Da es nur eine gibt, reicht das setTexture() in Object3D. Was genau willst du jetzt mit dem 3DS anstellen?  ???

uhm, ok, also ich habe diesen kla'mher tyen halt in cinema 4d gespeichert fertig texturiert und animiert...
so, das halt als md2 exportiert....
so, du sagst, es gibt nur eine Textur? das ist ja das problem, es gibt ja mehrere Texturen... eine für den körper an sich, eine für die augen auf beiden seiten und eine für diese metallklammer die vom Auge aus zur Seite führt...


und mit dem 3ds...
ich habe die animation wieder weggeschnitten, und das reine modell als 3ds exportiert...
dann beide dateien in je eine Instanz von Object3D geladen
dann die polygonmanager von beiden genommen
und für jede polygon-id von dem objekt aus dem 3ds file die textur geholt und auf die polygon-id von dem objekt aus dem md2-file gelegt.

EgonOlsen

Ok, verstehe. Ob das klappt, hängt vom Exporter ab. Und da es scheinbar nicht klappt, exportieren die wohl in beide Formate anders. Alternativ könntest du die Animationsstufen einzeln als 3ds exportieren, einzeln laden (nicht vergessen, hier false zu setzen: http://www.jpct.net/doc/com/threed/jpct/Loader.html#setVertexOptimization(boolean)) und dann zu einer Animation zusammenfügen. Das machen einige hier so. Es gibt auch irgendwo ein paar Threads dazu. Damit erhältst du deine verschiedenen Texturen pro Objekt. Das MD2-Format selber kann wirklich nur eine.

Elrohir

#12
Nja, uhm, wenn es noch ein anderes animationsformat gibt, das von jPCT unterstützt wird, wäre das ja auch möglich... also, wie würdest du das denn machen, wenn du ne ani von nem objekt mit mehreren texturen hast?

und wenn ich doch mehrere 3dsfiles nehmen muss, wie könnte man diese denn dann zu der animation zusammenfügen?
und nja, wäre eigentlich eher unpraktisch, da dies ein uhm... relativ großes projekt wird, und auch so habe ich schon öfters nen heap-overflow, und wenn so viele 3ds-files geladen werden, wird das sicher nicht zuträglich sein :o und vor allem würden das halt hunderte von 3ds-files werden...

Und  wenn es ja nciht möglich ist, über die obige schleife einfach die texturen zu übertragen von dem 3ds-file auf das md2, wäre es denn dann vielleicht möglich, einfach das grundmesh sozusagen zu ersetzen?
also, die vertexe sind ja die gleichen etc. also könnte man doch eigentlich auf den ersten keyframe das objekt von dem 3ds-file legen oder nicht? und wenn ja, wie ginge das?^^
hab's schon über getMesh() und setMesh() versucht, aber danach war's immer noch untexturiert...

oder war vielleicht die von mir verwendete schleife falsch? also, dass dieser int-wert nicht ausreicht, sondern man mit der setTexture(polyid, textureinfo) arbeiten muss? nur wenn ja, wie bekomme ich die instanz von textureinfo zu der polyid von dem objekt aus dem 3ds-file?:o

EgonOlsen

Generell ist jPCT eine der wenigen Engines (die einzige, die ich kenne...), die mehrere Texturen pro Objekt und Texture Stage grundsätzlich erlaubt. Üblich sind eine Textur/Stage/Objekt. Von daher wäre es im Prinzip durchaus sinnvoll, die Texturen irgendwie zu einer zu machen. Ist das keine Option?

Die Kollegen, die mit 3DS für die Animationen arbeiten, laden die einzeln, bauen aus den Meshes der Einzelobjekte die Animationen zusammen und serialisieren  meistens die fertige Animation. Damit umgeht man das aufwändige Laden der einzelnen Meshes bei Starten.
Der Weg ist:


  • Alle Objekte laden
  • Eine neue Animation erstellen
  • die Meshes alles Objekte an diese Animation hängen
  • die Animation dem ersten Objekt der Menge zuweisen und dieses serialisieren
  • ...oder eben ohne Serialisierung, dieses einfach mal animiertes Objekt benutzen

setMesh() und getMesh() gehen nicht, weil im Mesh die Texturinformationen nicht hinterlegt sind. Die hängen direkt im einzelnen Objekt, damit ein Mesh für unterschiedlich texturierte Objekte benutzt werden kann.

Deine Kopierschleife sieht mir ok aus. Das Problem wird sein, dass das 35. Polygon im MD2 einfach nicht das 35. Polygon im 3DS ist. Aber das liegt dann am Exporter.

Elrohir

#14
Quote from: EgonOlsen on March 05, 2009, 08:14:59 AM
Generell ist jPCT eine der wenigen Engines (die einzige, die ich kenne...), die mehrere Texturen pro Objekt und Texture Stage grundsätzlich erlaubt. Üblich sind eine Textur/Stage/Objekt. Von daher wäre es im Prinzip durchaus sinnvoll, die Texturen irgendwie zu einer zu machen. Ist das keine Option?
hm, müsste ich gucken, wie das gehen soll :o



Quote from: EgonOlsenDie Kollegen, die mit 3DS für die Animationen arbeiten, laden die einzeln, bauen aus den Meshes der Einzelobjekte die Animationen zusammen und serialisieren  meistens die fertige Animation. Damit umgeht man das aufwändige Laden der einzelnen Meshes bei Starten.
Der Weg ist:


  • Alle Objekte laden
  • Eine neue Animation erstellen
  • die Meshes alles Objekte an diese Animation hängen
  • die Animation dem ersten Objekt der Menge zuweisen und dieses serialisieren
  • ...oder eben ohne Serialisierung, dieses einfach mal animiertes Objekt benutzen

uhm, was heißt das serialisieren, und wie kann man denn ne neue animation erstellen und die daranhängen?^^ also,weil das doch per objekt3d.animate(index etc) funktioniert.... aber einfach mergen die objekt3Ds kann doch nicht richtig sein, doer?^^


also wär ganz nett, wenn du vllt. nen beispielcode hättest, wie das ginge :-o