#1 29.03.2005 13:39:31

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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... wink
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:

Code: delphi

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;

Attachments:
Attachment Icon unitTObj3D.pas, Größe: 30,561 bytes, Downloads: 1,246

My software never has bugs. It just develops random features.

Offline

 

#2 30.03.2005 06:45:00

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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?  wink

Danke!

Firle

Offline

 

#3 30.03.2005 08:36:43

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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....

Code: delphi

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. wink

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


My software never has bugs. It just develops random features.

Offline

 

#4 30.03.2005 08:50:38

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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

 

#5 30.03.2005 09:42:42

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

Habe das mal so in mein Projekt eingebaut:

Laden:

Code: delphi

  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:

Code: delphi

      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

 

#6 30.03.2005 11:49:17

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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

 

#7 30.03.2005 12:25:09

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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

 

#8 30.03.2005 13:39:13

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Klassen TObj3D und TObj3DControl (ein 3ds-Loader)

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


My software never has bugs. It just develops random features.

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson