JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=155405ef0198056932052e29d14c713cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem bei der Darstellung von 3D-Objekt

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 04.05.2010, 15:34    Titel: Problem bei der Darstellung von 3D-Objekt Antworten mit Zitat

Guten Tag allerseits,

in meinem embrionalen C++ Programm möchte ich auch 3D-Objekte (X-files) verwenden. Leider läuft beim Rendern irgend etwas schief. Und zwar erscheinen bestimmte Teile der Objekte im Vordergrund, obwohl sie im Hintergrund sein müßten und umgekehrt. Ich dachte, das kann nur mit dem Z-buffering oder dem DepthStencil Einstellungen zu tun haben und habe das alles nachgeprüft, aber den Fehler habe ich nicht finden können.

Hier ein zwei Abschnitte aus dem Programm:
CPP:
BOOL CGrafik::Init(HWND hGriff, BOOL bWindowed)
{
    D3D = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.BackBufferWidth = Breite;
    PParams.BackBufferHeight = Hoehe;
    PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
    PParams.BackBufferCount = 0;
    PParams.MultiSampleType = D3DMULTISAMPLE_NONE;
    PParams.MultiSampleQuality = 0;
    PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow = hGriff;
    PParams.Windowed = FALSE;
    PParams.EnableAutoDepthStencil = TRUE;
    PParams.AutoDepthStencilFormat = D3DFMT_D16;
    PParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    PParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;    

    m_ClearColor  = 0x000000;
    HRESULT hr;

    if(FAILED(hr = D3D->CreateDevice(
                           D3DADAPTER_DEFAULT,
                           D3DDEVTYPE_HAL,
                           hGriff,
                           D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
                           &PParams,
                           &Grafik_Geraet)))


Hier der zweite Abschnitt, der an dem Problem schuld sein könnte:

CPP:
void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpDevice, CRechnerVerwaltung* Verwaltung)
{
 Grafikkarte = Grafik.GetDevice();
 Grafikkarte->SetFVF(SCHEITELPUNKTFORMAT_B);

 m_RVerwaltung = Verwaltung;

 D3DXMatrixIdentity(&Weltmatrix);

 Grafikkarte->SetTransform(D3DTS_WORLD,&Weltmatrix);

 Standort = D3DXVECTOR3(0.0f, 0.0f, -1000.0f);
 k_Standort = D3DXVECTOR3(0.0f, 0.0f, -8.6f);
 Blickpunkt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

 Buehne_Eins.X = 0;
 Buehne_Eins.Y = 0;
 Buehne_Eins.Width = BSchirmbreite;
 Buehne_Eins.Height = BSchirmhoehe;
 Buehne_Eins.MinZ = 0.0f;
 Buehne_Eins.MaxZ = 1.0f;

 Buehne_Zwei.X = BSchirmbreite-157;
 Buehne_Zwei.Y = BSchirmhoehe-141;
 Buehne_Zwei.Width = 120;
 Buehne_Zwei.Height = 120;
 Buehne_Zwei.MinZ = 0.0f;
 Buehne_Zwei.MaxZ = 1.0f;

 D3DXMatrixLookAtLH(&k_Perspektive,
                                       &k_Standort,
                                       &Blickpunkt,
                                       &Orientierung);

 Grafikkarte->SetTransform(D3DTS_VIEW,&k_Perspektive);

 D3DXMatrixPerspectiveFovLH( &k_Projektion, 1.0f, 1.0f, 0.2f, 12.0f );
 Grafikkarte->SetTransform(D3DTS_PROJECTION, &k_Projektion);

 D3DXMatrixLookAtLH(&Perspektive,
                                       &Standort,
                                       &Blickpunkt,
                                       &Orientierung);

 Grafikkarte->SetTransform(D3DTS_VIEW,&Perspektive);

 D3DXMatrixPerspectiveFovLH( &Projektion, 1.0f,  fAspekt, 0.0f, 1000.0f );

 Grafikkarte->SetTransform(D3DTS_PROJECTION, &Projektion);

 m_bGrossAktiv = false;
 m_bObenAktiv = false;
 m_bUntenAktiv = false;

ZeroMemory( &Material, sizeof(Material) );
Material.Diffuse.r = Material.Ambient.r = 1.0f;
Material.Diffuse.g = Material.Ambient.g = 1.0f;
Material.Diffuse.b = Material.Ambient.b = 1.0f;
Material.Diffuse.a = Material.Ambient.a = 1.0f;
Grafikkarte->SetMaterial( &Material);

ZeroMemory(&Licht_0,sizeof(D3DLIGHT9));
Licht_0.Type = D3DLIGHT_DIRECTIONAL;
Licht_0.Diffuse.r = 1.0f;
Licht_0.Diffuse.g = 1.0f;
Licht_0.Diffuse.b = 1.0f;
Licht_0.Diffuse.a = 1.0f;
Licht_0.Specular.r = 0.5f;
Licht_0.Specular.g = 0.5f;
Licht_0.Specular.b = 0.5f;
Licht_0.Specular.a = 0.5f;
Licht_0.Ambient.r = 0.0001f;
Licht_0.Ambient.g = 0.0001f;
Licht_0.Ambient.b = 0.0004f;
Licht_0.Ambient.a = 0.01f;

Licht_0.Direction = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Licht_0.Position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Licht_0.Range = 1000.0f; 
Licht_0.Attenuation0 = 1.0f;
Licht_0.Attenuation1 = 1.0f;
Licht_0.Attenuation2 = 1.0f;
Licht_0.Theta = 2.0f;
Licht_0.Phi = 1.0f;
Licht_0.Falloff = 1.0f;

Grafikkarte->SetLight(0,&Licht_0);
Grafikkarte->LightEnable(0,TRUE);
Grafikkarte->SetRenderState(D3DRS_LIGHTING,TRUE);
Grafikkarte->SetRenderState( D3DRS_AMBIENT, 0x00F0F0F0 );
Grafikkarte->SetRenderState( D3DRS_DITHERENABLE, TRUE );
Grafikkarte->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Grafikkarte->SetRenderState( D3DRS_FILLMODE,   D3DFILL_SOLID );
Grafikkarte->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE);
Grafikkarte->SetRenderState( D3DRS_CLIPPING, TRUE );
Grafikkarte->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );


Hoffentlich weiß jemand Rat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 04.05.2010, 19:16    Titel: Antworten mit Zitat

Der Initialisierungscode sieht in Ordnung aus.
Möglicherweise stimmt der Rendercode noch nicht:
- BeginSzene / EndSzene benutzt?
- Backbuffer gecleart?

Such mal dort!

MfG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 05.05.2010, 20:49    Titel: Dank Antworten mit Zitat

Wärmsten Dank für die Antwort. Hier noch die Stelle, wo die Szene gerendert wird:

CPP:
if (Bild_erstellt && !globus)
     Grafikkarte->StretchRect(Vordergrund, 0, Hintergrund, 0, D3DTEXF_NONE);

else
   {
     Grafikkarte->Clear(0,NULL,  D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0);
     Grafikkarte->BeginScene();

     D3DXMatrixLookAtLH(&Perspektive,
                                      &Standort,
                                      &Blickpunkt,
                                      &Orientierung);

     Grafikkarte->SetTransform(D3DTS_VIEW, &Perspektive);
     Grafikkarte->SetTransform(D3DTS_PROJECTION, &Projektion);

     Flugzeug.Zeichnen(); //Das ist das X-file

     Grafikkarte->EndScene();
     Grafikkarte->Present(0,0,0,0);
   }


Ich schnalls nicht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 10.05.2010, 21:42    Titel: Antworten mit Zitat

Du hast die Kamera nicht Positioniert?
Die Kamera befindet sich genau IM Modell (xFile)?
Das Flugzeug (xFile) hat einige Flächen, welche "verkehrt herum" gezeichnet werden (Aussen- und Innenseite einer Fläche)?

Der Code scheint wiederum in Ordnung zu sein.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 14.05.2010, 15:06    Titel: Antworten mit Zitat

Hallo MVP und die anderen, die versucht haben zu helfen,

Alle Deine Fragen, MVP, kann ich verneinen.

Ich bin zu einer früheren Version meines Programms zurückgegangen und dort funktioniert die Darstellung einwandfrei. Ich werde die beiden Versionen genau untersuchen. Da ich die frühere Version mit Funtionen der neueren ausstatten will um auf die gleiche Funktionalität zu kommen, die ich bereits erreicht habe, werde ich bei jeder größeren Veränderung des Programms darauf achten, ob die Darstellung der X-Files weiterhin funktioniert. Sobald ich herausgefunden habe, was für die Falschdarstellung verantwortlich ist, melde ich es hier.

Einstweilen erst einmal Danke für die Bemühungen. Don't
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 14.05.2010, 15:47    Titel: Antworten mit Zitat

Okay
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 31.05.2010, 15:40    Titel: Problem gelöst Antworten mit Zitat

Ich habe das Problem beheben können. Merkwürdig ist nur, daß es tatsächlich an dem ZPuffer gelegen hat, was ich ja bereits versucht hatte.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum