Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

soxx

Frischling

  • »soxx« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

1

09.03.2006, 11:09

Modell realistischer gestalten

Hallo,

ich habe folgendes Problem:
ich rendere ein modell in directx, nur sieht dieses absolut spartanisch aus...

hier ein bild wie das modell derzeit gerendert wird:
http://www.edu.uni-klu.ac.at/~c1schwar/hier.JPG

kann man es mit hilfe von licht schaffen, das modell so auf den bildschirm zu bringen:
http://www.edu.uni-klu.ac.at/~c1schwar/so.JPG


wie schaffe ich das ?
das modell besitzt schon alle materialeigenschaften (habe diese mittlerweile geändert - sieht also nicht mehr so aus wie auf dem oberen bild)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
D3DMATERIAL9 material;
D3DCOLORVALUE rgbaDiffuse = {1.0, 1.0, 1.0, 0.0,};
D3DCOLORVALUE rgbaAmbient = {1.0, 1.0, 1.0, 0.0,};
D3DCOLORVALUE rgbaSpecular = {0.0, 0.0, 0.0, 0.0,};
D3DCOLORVALUE rgbaEmissive = {0.0, 0.0, 0.0, 0.0,};
float rPower = 0;

material.Diffuse = rgbaDiffuse;
material.Ambient = rgbaAmbient;
material.Specular = rgbaSpecular;
material.Power = rPower;
material.Emissive = rgbaEmissive;
m_pDevice->SetMaterial(&material);


ich hoffe ich habe das problem klar geschildert.

mfg

Anonymous

unregistriert

2

09.03.2006, 11:16

Deine Beispielbilder sind nicht abrufbar...

Grüße
Stefan

soxx

Frischling

  • »soxx« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

3

09.03.2006, 11:19

ist der server...... nach ein paar refreshes gehts.
derzeit habe ich folgendes zum thema licht implementiert...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Licht

ZeroMemory(&g_light, sizeof(D3DLIGHT9));
g_light.Type = D3DLIGHT_POINT;
g_light.Diffuse.r = g_light.Diffuse.g = g_light.Diffuse.b = 1.0f;
g_light.Ambient.r = g_light.Ambient.g = g_light.Ambient.b = 1.0f;
g_light.Range = 100.0f;

g_light.Position.x = 0.0f;
g_light.Position.y = 3.0f;
g_light.Position.z = -5.0f;
g_light.Direction.x = 0.0f;
g_light.Direction.y = 0.0f;
g_light.Direction.z = 0.0f;
g_pD3DDevice->SetLight(0, &g_light);
g_pD3DDevice->LightEnable(0, TRUE);


resultat ist, dass alles weiß ist :(
die lichtquelle ist genau an der position der kamera positioniert - müsste also eine auswirkung haben.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

09.03.2006, 11:41

Zitat von »"soxx"«

ist der server...... nach ein paar refreshes gehts.
derzeit habe ich folgendes zum thema licht implementiert...


Nein, astreiner 403 ...

soxx

Frischling

  • »soxx« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

5

09.03.2006, 12:00

okay... habs verschoben

Anonymous

unregistriert

6

09.03.2006, 12:03

Ich bin nicht fit darin wie DirectX das ganz macht, aber dass die drei
Werte für die Richtung des Lichts alle auf "0" stehen macht mich skeptisch...

Und: Ich würde mal probieren Diffuse und Ambient auf (0,0,1)=blau zu
setzen und Specular auf (1,1,1)=Weiss.

Grüße
Stefan

soxx

Frischling

  • »soxx« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

8

09.03.2006, 13:05

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
harvesterXMeshManager::it = harvesterXMeshManager::vMeshes.begin();
while( harvesterXMeshManager::it != harvesterXMeshManager::vMeshes.end() ) {
D3DXVECTOR3 vDirection;
vDirection = ((harvesterXMesh*)*it)->getPosition();
// liefert mir die position des Modells x,y,z


setLight(vDirection);
((harvesterXMesh*)*it)->Render(); // rendere das Modell


harvesterXMeshManager::it++; // gehe im vector um eins weiter

}


// setLight

void setLight(D3DXVECTOR3 vDirection)
{
// ######################################################################

// Lichtmanagement

// ######################################################################

ZeroMemory(&g_light, sizeof(D3DLIGHT9));
g_light.Type = D3DLIGHT_POINT;
g_light.Diffuse.r = 0.0f;
g_light.Diffuse.g = 0.0f;
g_light.Diffuse.b = 1.0f;
g_light.Ambient.r = 0.0f;
g_light.Ambient.g = 0.0f;
g_light.Ambient.b = 1.0f;
g_light.Specular.r = 1.0f;
g_light.Specular.g = 1.0f;
g_light.Specular.b = 1.0f;
g_light.Attenuation0 = 0.05;
g_light.Attenuation1 = 0.025;
g_light.Attenuation2 = 0.0;

g_light.Range = 100.0f;

g_light.Position.x = 0.0f;
g_light.Position.y = 3.0f;
g_light.Position.z = -5.0f;

D3DXVec3Normalize( (D3DXVECTOR3*)&g_light.Direction, &vDirection );

g_pD3DDevice->SetLight(0, &g_light);
g_pD3DDevice->LightEnable(0, TRUE);

g_pD3DDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020 );
g_pD3DDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE);
}



// render funktion

VOID harvesterXMesh::Render()
{
// die Weltmatrix des Objektes zum Zeichnen verwenden

harvesterXMesh::m_pDevice->SetTransform(D3DTS_WORLD, &m_mMeshMatrix);

m_pDevice->BeginScene();

// In dieser Schleife werden nach und nach alle Teilmeshes 

// gezeichnet

for( DWORD i=0; i<m_dMaterials; i++ )
{ 
// Material und Texturen setzen

m_pDevice->SetTexture(0,m_pMeshTextures[i]);
m_pDevice->SetMaterial(&m_pMeshMaterials[i]);

// Zeichnen des aktuellen Teilmesh

m_pMesh->DrawSubset(i);
// Ende des Zeichnens


}
m_pDevice->EndScene();
}


habe mir mal ein tutorial vorgenommen... noch immer zwecklos.
ich hole mir die position des modells (x,y,z) mit getPosition()
danach initialisiere ich das licht und beginne zu rendern.

was stimmt da nicht ???
mfg
soxx

Anonymous

unregistriert

9

09.03.2006, 13:10

Zitat

ich hole mir die position des modells (x,y,z) mit getPosition()


Du setzt die Licht-Position so, dass sie INNERHALB des Objekts liegt? Dann
dürfte es daran liegen dass die Flächen die die Kamera sieht gar nicht
beleuchtet werden...

Hast du mal die Lichtquelle weiter weg gestellt? Z.B. links oben von der
Kamera?

Stefan

soxx

Frischling

  • »soxx« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

10

09.03.2006, 13:21

C-/C++-Quelltext

1
2
3
g_light.Position.x = 0.4f;
g_light.Position.y = 0.4f;
g_light.Position.z = -0.4f;

Das mit getPosition() ist nur für die Richtung gedacht

C-/C++-Quelltext

1
D3DXVec3Normalize( (D3DXVECTOR3*)&g_light.Direction, &vDirection );

also wohin das Ding leuchtet.

keine ahnung warum das nicht funktioniert ?

Werbeanzeige