MD2-Format skaliert!?
-
Hi Leute,
ich hab eine Frage. Und zwar würd ich mal gern wissen, warum man das MD2-Format
erst skalieren muss, anstatt es gleich auszulesen und in Bytes zu packen. Hat das einen bestimmten Grund? Man könnte das Model doch dann gleich nach dem modellieren
komprimieren und skalieren oder nicht?
Danke im Voraus!
-
ich komme da irgendwie nicht mit. wann muss man was skalieren? beziehst du dich auf irgend nen speziellen artikel oder sourcecoder oder...?
-
Allgemein bei der Implentierung der Frames. Jedes Frame wird ja in einem
Byte gespeichert, welches nicht wirklich die Texturkoordinaten enthält. Deswegen
skaliert man die Bytes um die richtigen Koordinaten zu bekommen. Später addiert man ja noch zur skalierung den translate Wert der Texturen. Leider finde ich nur selten Vermutung wie zum Beispiel:"Die Bytes werden skaliert um das Model klein zu halten und jedes Frame in einem Byte zu speichern". Bezogen habe ich mich auf CppJunkys Tutorial: http://home.arcor.de/cppjunky/tutorials/md2/tutor_md2.htm"frameSize" Grösse eines Frames in Bytestruct MD2_Vertex { BYTE vertex[3]; BYTE lightNormalIndex; };
-
WiredCoder schrieb:
Allgemein bei der Implentierung der Frames. Jedes Frame wird ja in einem
Byte gespeichert, welches nicht wirklich die Texturkoordinaten enthält. Deswegen
skaliert man die Bytes um die richtigen Koordinaten zu bekommen. Später addiert man ja noch zur skalierung den translate Wert der Texturen. Leider finde ich nur selten Vermutung wie zum Beispiel:"Die Bytes werden skaliert um das Model klein zu halten und jedes Frame in einem Byte zu speichern". Bezogen habe ich mich auf CppJunkys Tutorial: http://home.arcor.de/cppjunky/tutorials/md2/tutor_md2.htm"frameSize" Grösse eines Frames in Byteich glaube das hast du vielleicht nur falsch interpretiert, hier wird nicht ein frame in einem byte gespeichert, der wert gibt lediglich an wieviel byte ein frame braucht.
Und ja, man macht das ganze um speicher zu sparen, du hast locker ein paar hundert frames und wenn jedes ein paar KB zieht, sprengst du die megabyte grenze, dabei sollte das spiel ab 8MB ram laufen wenn ich mich recht erinnere.
-
Ich wusste gar nicht, das überhaupt jemand meine Tutorials liest
Wie schon gesagt dient dies zur Daten-Komprimierung. So verbraucht man lediglich 3x1 Byte pro Vertex im Vergleich zu den gängigen 3 floats o.ä. BTW brauchst du dir bei meiner Implementierung über die Framesize keine Gedanken machen.
-
Also ist es doch richtig, dass mit den "virtuellen Bytes" die echten Bytes verkleinert, also komprimiert werden!?
-
nix virtuell..
byte = byte = byte = byte..
Der Vorteil des md2-Formats ist der, dass es unkomprimiert ist. Es versucht den besten Kompromiss zwischen Rechenzeit und Speicherverbrauch zu schließen. Alles wird möglichst in Byteform gespeichert.@junky: Deine Beschreibung ist zuar ganz ordentlich, aber damit man den Aufbau der md2-Dateien (und ich sag ja immer, das isn Format aus dem letzten Jahrtausend) besser versteht, solltest du deine grafischen Fähigkeiten nutzen..
Hier mal grob skizziert, wie die Datei aufgebaut ist..
[HEADER] ... [SKINS] ... [TEXCOORDS] ... [TRIANGLES] [TRIANGLE0] [TRIANGLE1] ... [FRAMES] [FRAME0] [VERTEX0] [VERTEX1] [VERTEX2] [VERTEX3] [VERTEX4] [FRAME1] [VERTEX0] [VERTEX1] [VERTEX2] [VERTEX3] [VERTEX4] ... [FRAMExx] [VERTEX0] [VERTEX1] [VERTEX2] [VERTEX3] [VERTEX4] [GLCOMMANDS] ...@Wired : Ich sag doch immer Pen & Paper sind die beste IT.. Setz dich hin und skizzier dir was du verstanden hast. Der bildhafte Lerntyp ist am weitesten verbreitet

-
Erstmal danke euch allen, meiner Meinung nach hab ich es jetzt aber verstanden.
Zumindest einen kleinen Teil, ich fang mal an, könnt mich gerne korrigieren!
Also,
ein Frame ist ein Punkt eines Triangles, welches mit einem
BYTE-Typ skaliert wird, weil die Speicheradresse(!?) damit
kleiner ist und nicht so viel Bit anfordert. Das heisst unsere
Punkte werden schneller in den Binären Speicher geladen und damit
auch schneller verfügbar. Ein Vertex ist in diesem Falle ein
von im Dreickliegender Punkt. Weil jeder Vertex 3 eigene Koordinaten
hat, setzt man hier eine Variable in einem BYTE(!) an, nämlich:BYTE vertex[3];Da dieser Speicherzugriff Binär und so klein wie möglich sein
sollte, wird er in einem BYTE-Speicher gespeichert und später skaliert!Aber meine Frage ist dabei, warum wird ein Frame skaliert, anstatt
direkt den BYTE, der die Koordinaten hat zu skalieren? Das ist doch
eigentlich nur eine Variablenzeiger.Seh ich das falsch?