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 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]);
}
}
}