C# D3D Lichtquellen Position - Help

MPi

Cadet 2nd Year
Registriert
Mai 2011
Beiträge
23
Hallo!

ich beschäftige mich nun seit einigen Tagen mit Direct3D und haben ein Problem mit der Position der D3D Lichtquellen. Die Lichtquelle (hier Nr.1 *) beleuchtet nicht den Bereich um Ihre Position in der Welt, sondern scheint sich irgendwie mit der Camera zu bewegen.

Ich habe mich Stunden in Foren/im Web suchend bewegt und den Hinweis gefunden, ich soll die Lichtquellen Position/Direction auch transformieren. Eine Antwort darauf "wie" das funktionieren soll habe ich bisher nicht entdecken können :(

Auch der Hinweis D3DTS_VIEW anstatt D3DTS_WORLD zu nutzen brachte mich nicht weiter, da ich mit der VIEW Variante keine akzeptable Steuerung in der Welt auf die Reihe gebracht habe.

Kann mir jemand sagen, was ich hier falsch mache? (Den relevanten Quellcodebereich habe ich unten angehängt und ein wenig mit Kommentaren versehen)

Danke!


//Set projection Values
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(60.0f ), (float)Screen_sx/(float)Screen_sy, 5.0f, 4000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

//D3D Licht an
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);

//Worldmatrix
D3DXMatrixLookAtLH(&matWorld,&D3DXVECTOR3 (Scene.x , Scene.y , Scene.z ), // camera position
&D3DXVECTOR3 (Scene.dx, Scene.dy, Scene.dz), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

//Lights 0- directional, 1- point light
g_pd3dDevice->SetLight( 0, &g_light[0] );
g_pd3dDevice->SetLight( 1, &g_light[1] ); //*

g_pd3dDevice->LightEnable( 0, TRUE );
g_pd3dDevice->LightEnable( 1, TRUE );

//d3d Light active
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);


//Zbuffer active
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
//Cullmode CounterClockWise
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW );


for (i=0; i<NUM_SCENE_OBJECTS; i++)
{
if (Scene.object_active)
{
//Translation of Object in Scene
D3DXMatrixTranslation ( &matObjectTrans,Scene.object_x ,Scene.object_y ,-Scene.object_z );
//Rotation of Object in Scene
D3DXMatrixRotationYawPitchRoll( &matObjectRot ,Scene.object_rx,Scene.object_ry, Scene.object_rz);
//Scaling of Object in Scene
D3DXMatrixScaling ( &matObjectScale,Scene.object_sx,Scene.object_sy, Scene.object_sz);

matObject = matObjectScale * matObjectRot * matObjectTrans * matWorld;
//SetTransform to Object in World
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matObject );

//Render Object
g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer[Scene.object_nr], 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( Vertex::FVF_Flags );

g_pd3dDevice->SetMaterial( &g_Material[Object[Scene.object_nr].material]);
g_pd3dDevice->SetTexture (0,g_pTexture[Object[Scene.object_nr].texture]);

for (j=0; j<Object[Scene.object_nr].stripes; j++)
{
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, Object[Scene.object_nr].stripes_s[j], Object[Scene.object_nr].stripes_n[j]);
}
}
}
 
Ich bin mir nicht sicher, weil ich OpenGL statt D3D nutze, aber in OpenGL musst du beim Setzen der Lichtposition einen 4ten Parameter übergeben, welcher angibt, ob die Lichtquellenposition oder -richtung gesetzt werden soll. Standardmäßig ist dieser Parameter auf Richtung gestellt und die lichtquelle bewegt sich dann mit der kamera mit.
 
Zuletzt bearbeitet:
Leider habe ich einen solchen Parameter nicht gefunden und soweit ich sehen kann gibt einen solchen unter D3D auch nicht.

Es sieht alles danach aus, als würden die Lichtquellenpositionen nicht mit transformiert, nur irgendwie bekomme ich es nicht hin, eben diese entsprechend der "WORLD" Matrix mitzubewegen.
 
OK! Ich stelle fest ich werde noch viel lesen und lernen müssen. ;)

Nachdem ich beide D3DTS_WORLD -> D3DTS_VIEW geändert habe, sind alle Objekte wieder da wo sie sein sollen. Auch das Licht bewegt sich nun nicht mehr mit der Kamera mit. (Die WORLD wird ja auch nicht mehr manipuliert, soweit klar)

Edit:

//Worldmatrix
D3DXMatrixLookAtLH(&matWorld,&D3DXVECTOR3 (Scene.x , Scene.y , Scene.z ), // camera position
&D3DXVECTOR3 (Scene.dx, Scene.dy, Scene.dz), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matWorld );


for (i=0; i<NUM_SCENE_OBJECTS; i++)
{
D3DXMatrixTranslation ( &matObjectTrans,Scene.object_x ,Scene.object_y ,-Scene.object_z );
D3DXMatrixRotationYawPitchRoll( &matObjectRot ,Scene.object_rx,Scene.object_ry, Scene.object_rz);
D3DXMatrixScaling ( &matObjectScale,Scene.object_sx,Scene.object_sy, Scene.object_sz);
matObject = matObjectScale * matObjectRot * matObjectTrans;
g_pd3dDevice->SetTransform(D3DTS_WORLD &matObject );

"Render Polygons here"
}

Diese Variante löst das Problem :)

Danke für Eure Zeit!
 
Zuletzt bearbeitet:
Zurück
Oben