include(PUN_ROOT.'syn/css.php'); ?>
Sie sind nicht angemeldet.
Dies hier ist der alte 3ds-Loader von meiner Delphi Nettank2-Version. Die ursprüngliche Version diese Loaders stammt von Nitrogen. Dann bekam Martin Pyka den Code in die Finger. Anschließend habe ich das Chaos vollendet...
Wer will darf gerne weiter basteln... :mrgreen:
Unterschiede zu Martins Loader:
· benutzt jetzt gemeinsamen Vertex und Indexbuffer für alle Meshes, verhindert mehrfaches laden der selben Datei (in diesem Fall teilen sich dann die Meshes den selben Speicherbereich)
· kein nachträgliches Laden (z.B. während des Spiels) möglich
· speichert Vertex/Indexdaten in D3DPOOL_DEFAULT
· optimierter Speicherverbrauch beim Laden
· rendert mit DrawIndexedPrimitive anstatt DrawPrimitiveUp.
· ein Objekt kann relativ zu einem anderen gerendert werden
· es werde viele 3ds-Funktionen nicht unterstützt (auch bei Martins Loader nicht), z.B. animierte Meshes usw...
Ich weiß das das nicht alzu konfortabel ist, aber als ich das Ding geschrieben habe, wusste ich es noch nicht besser...und es hindert euch niemand daran was besserers zu schreiben
Anwendungs-Beispiel:
meshcontrol := tobj3dcontrol.create( dx3ddev9 ); //erstes Mesh laden mesh1 := tobj3d.create( dx3ddev9, meshcontrol ); mesh1.options := obj3dopt_makevfd; mesh1.load3ds( exedir + 'meshestank_19base.3ds' ); mesh1.posd := d3dxvector3( 120, 0, 120 ); mesh1.scalefactor := 0.02; mesh1.textur := meshtex1; mesh1.vfdplanes := @vf.planes; mesh1.material := material; // Mateial setzen //zweites Mesh laden (wird realtiv zu Mesh1 gerendert) mesh1k := tobj3d.create( dx3ddev9, meshcontrol ); mesh1k.options := obj3dopt_makevfd or obj3dopt_relposition; mesh1k.load3ds( exedir + 'mesheskanone1.3ds' ); mesh1k.parentobj3d := @mesh1; mesh1k.posd := d3dxvector3( 0, 22, 0 ); mesh1k.scalefactor := 0.02; mesh1k.textur := mesh1.textur; mesh1k.vfdplanes := mesh1.vfdplanes; mesh1k.material := mesh1.material; //gemeinsamen Vertexbuffer erzeugen { nach diesem Aufrfu können keine weiteren Meshes geladen werden, vor diesem Aufruf kann nicht gerendert werden } meshcontrol.load; { ... } // Rendern mesh1.vecn := player.vecn; mesh1.vecf := player.vecf; mesh1.posd := player.posd; mesh1.draw;
Offline
Hallo,
um das Sample ans Laufen zu bekommen:
meshcontrol: tobj3dcontrol;
mesh1,mesh2: tobj3d;
meshtex1: IDirect3DTexture8;
Soweit richtig, nirwa?
Und dann was ist das hier:
mesh1.VFDPlanes := @VF.Planes;
Habe dieses versucht:
VF: PVFDPlanes;
aber dann sagt der Compiler: [Fehler] Unit1.pas(40): Record, Objekt oder Klassentyp erforderlich
Was muss ich für VF deklarieren?
Und was muss ich hierfür zum Probieren setzen am einfachsten:
mesh1.vecN := player.vecN;
mesh1.vecF := player.vecF;
mesh1.posD := player.posD;
@Coolcat: Falls du ein Sample dafür hast, kannste das nicht auch mit reinpacken?
Danke!
Firle
Offline
der Typ PVFDPlanes ist in der unit deklariert! Dabei handelt es sich um die 6 Ebenen des ViewingFrustum. Um die zu berechnen gibts die Prozedur UpdateVFD, einfach View und Projection-Matrix rein und raus kommen die ebenen....du kannst natürlich auch einfach das Array selbst füllen....
type pvfdplanes = ^tvfdplanes; tvfdplanes = array [0..5] of td3dxplane; //left, right, bottom, top, near, far
VF brauchst du nicht, sondern nur die Planes. VF enthält bei mir außerden den 6 Ebenen auch noch eine BoundingSphere um den ViewingFrustum. Aber die TObj3D-Klasse braucht die nicht...
Zitat:
meshcontrol: TObj3DControl;
mesh1,mesh2: TObj3D;
meshtex1: IDirect3DTexture8;
jep is richtig.
sry, dachte das wäre klar wenn es um diese Klassen geht und das ganze mit TObj3DControl.Create(..) initzialisiert wird.
Und da mesh1.textur vom Typ IDirect3DTexture8 ist, sollte meshtex1 auch von diesem Typ sein.
Zitat:
mesh1.vecN := player.vecN;
mesh1.vecF := player.vecF;
mesh1.posD := player.posD;
vecN ist die Normale die nach oben zeigt (also wo beim Mesh oben ist)
vecF zeigt nach vorne
posD ist die Position
Coolcat
Offline
Hi Coolcat,
kannst du mir bitte mal das Demo Projekt schicken, ich sehe nämlich nix.
Muss ich selber erst eine Textur laden und was ist mit dem Material?
Muss ich da erst was setzen?
Ich habe das einfach mal bei mir eingebaut, und leider sehe ich das Objekt nicht.
Firle
Offline
Habe das mal so in mein Projekt eingebaut:
Laden:
meshcontrol := tobj3dcontrol.create(xenscreen.device);
raumschiff[nr].g_pmesh := tobj3d.create(xenscreen.device, meshcontrol );
raumschiff[nr].g_pmesh.options := obj3dopt_makevfd;
raumschiff[nr].g_pmesh.load3ds(smesh);
raumschiff[nr].g_pmesh.posd := d3dxvector3( 0, 0, 0 );
raumschiff[nr].g_pmesh.vfdplanes := @vf; //.planes
meshcontrol.load;
Also ich verstehe nicht, warum hier noch Texturen und Materialien zugewiesen werden, die sollten doch im 3DS drin sein und müssen hier nicht explizit auch noch gesetzt werden, oder?
Und das mit dem VF.planes schluckt mein Compiler (Delphi 7 mit DX8.1) wie gesagt nicht.
Rendern:
raumschiff[0].g_pmesh.vecn := d3dxvector3( 0,1,0 ); raumschiff[0].g_pmesh.vecf := d3dxvector3( 0,0,1 ); raumschiff[0].g_pmesh.posd := d3dxvector3( x,y,z ); raumschiff[0].g_pmesh.draw;
Theoretisch kann ich dann an den beiden VECs rumdrehen, um das Raumschiff zu drehen, richtig?
Ich gucke jetzt mit meiner Kamera auf 0/0/0 und dort soll es sein, aber ich sehe nix. Mit dem X vorher an selber Stelle hat es gefunzt.
Also prima wäre ein Sample zum ausprobieren, das ich nicht hier schon was falsch gemacht habe?
:?
Firle
P.S. UpdateVFD gibt es bei mir nicht, nur ein MakeVFD ohne Parameter.
Offline
Nachtrag:
MakeVFD schalten mein _visible auf false, dann wird nix gerendert.
Habe in dem MakeVFD mal zum Spaß _Visible und Result auf true gesetzt und dann exit.
Danach sehe ich immer noch nix!
Meine Textur ist Nil und mein Material hat alle Werte auf 0, vielleicht liegt es daran? Aber warum schnappt der sich Material und Textur nicht aus dem 3DS, da habe ich beides drin?
Gruß
Eric
P.S. Selbst mit handgesetztem Material und geladener Textur sehe ich nix. *hierfehlteinheulenderSmiley*
PP.S. Hier habe ich ja SetFVF ersetzt:
// pDevice.SetFVF( D3DFVF_Obj3DVertexFormat );
pDevice.SetVertexshader( D3DFVF_Obj3DVertexFormat );
Wenn ich den Vertextshader rausnehme, sehe ich riesige sinnlose Balken, wenn ich ihn wieder reintue, nix mehr.
Offline
So ich schon wieder.
Also ein Erfolgserlebnis:
pDevice.SetVertexshader(120);
Habe einfach mal rumprobiert, und jetzt mit 120 scheint es zu gehen???
Also irgendwie futtert der meine Materialien und Texturen nicht, sehr schade, aber das Objekt sieht so erstmal ok aus? Warum weiß ich auch nicht...
Wie kriege ich da jetzt meine Texturenund Materialien rein und kriegen wir das auch für Animationen hin? Und wieso 120?
:?
Aber soweit sogut.
:thx:
Firle
Offline
Zitat:
kannst du mir bitte mal das Demo Projekt schicken, ich sehe nämlich nix.
Es gibt kein Demo, die Klasse wird so 1:1 in Nettank2 verwendet (also in der alten Delphi-Version)
Zitat:
Also ich verstehe nicht, warum hier noch Texturen und Materialien zugewiesen werden, die sollten doch im 3DS drin sein und müssen hier nicht explizit auch noch gesetzt werden, oder?
Der Loader lädt nur Vertices, Indices und TexKoords sonst nichts. Daher muss man den Rest setzen. Aber du kannst natürlich das gerne erweitern...(dürfte so schwer nicht sein)
Zitat:
Und das mit dem VF.planes schluckt mein Compiler (Delphi 7 mit DX8.1) wie gesagt nicht.
Was hast du immer mit dem VF ? VF ist bei mir einfach nur eine Klasse die zufällig auch die Planes hat die ich dafür brauche...
Erstell dir einfahc dein TVFDPlanes mit der Prozedur UpdateVFD(...) und geb dem TObj3D einen Pointer darauf.
Zitat:
Ich gucke jetzt mit meiner Kamera auf 0/0/0 und dort soll es sein, aber ich sehe nix. Mit dem X vorher an selber Stelle hat es gefunzt.
Dann musst du auch das Objekt an der Stelle rendern
raumschiff[0].g_pMesh.posD := D3DXVector3( 0,0,0 );
Zitat:
Theoretisch kann ich dann an den beiden VECs rumdrehen, um das Raumschiff zu drehen, richtig?
jep
Zitat:
pDevice.SetVertexshader(120);
Das hier dürfte schon richtig sein:
pDevice.SetVertexshader( D3DFVF_Obj3DVertexFormat );
Coolcat
Offline