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

1

01.12.2008, 09:05

Modelle folgen der Kamera

Hallo, ich hatte mich vor längerer Zeit schonmal mit der Spieleprogrammierung beschäftigt. Habe alles uninteressante übersprungen und direkt aus dem Buchbeispiel Breakanoid 'n Pong hingeklart. Nun weiter zu machen war ohne die Theorie dann irgendwie schwer^^
Nun hab ich nochmal neu angefangen und lese das Buch fleißig von vorn bis hinten. Nebenbei versuche ich so 'ne Art Testlevel zu programmieren. Eine kleine Stadt, in der ich parallel zum Lesen des Buchs die grundlegenden Dinge ausprobieren will (Also später dann Dinge wie KI usw.). Man kann sich durch diese Stadt bewegen und auch die Kamera drehen.
Allerdings kriege ich schon beim Darstellen des Testlevels ein Problem. Ich habe mir in Cinema 4D eine Ebene(als Untergrund) und einen einfachen Block als eine Art Haus erstellt. Mit Texturen aus dem Internet versehen, nach .3ds exportiert und mit dem Model Converter eine .tbm erstellt. Nun lade ich dieses Model, und rendere es. Der Untergrund wird auch korrekt angezeigt, aber das Haus folgt der Kamera wenn ich diese bewege. Es ist auch nicht immer zu sehen. Die Textur ist teilweise auch verzogen. Ist etwas schwer zu beschreiben.

Hier mal die Render Methode des Spiels:

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
tbResult CGame::Render(float fTime)
{
    
    tbMatrix    mCamera;
    tbMatrix    mProjection;
    DWORD       dwNumVectors;
    D3DLIGHT9   CamLight;
    char        acText[256];


    // Puffer leeren und Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

    // ------------------------------------------------------------------


    // Projektionsmatrix erstellen und aktivieren

    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), 0.1f, 30000.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix erstellen und aktivieren

    vCameraLookAt = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
    mCamera = tbMatrixCamera(vCameraPos, vCameraPos+vCameraLookAt);
    D3D.SetTransform(D3DTS_VIEW, mCamera);
    


    // ------------------------------------------------------------------


    // Richtungslicht mit der Richtung der Kamera erstellen und aktivieren

    ZeroMemory(&CamLight, sizeof(D3DLIGHT9));
    CamLight.Type = D3DLIGHT_DIRECTIONAL;
    CamLight.Diffuse = tbColor(1.0f, 1.0f, 1.0f);
    CamLight.Specular = tbColor(1.0f, 1.0f, 1.0f);
    CamLight.Direction = tbVector3(0.0f,0.0f,0.0f);
    D3D->SetLight(0, &CamLight);
    D3D->LightEnable(0, TRUE);
    

    // ------------------------------------------------------------------


    // Level rendern

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());
    m_pStadt->Render();

    // ------------------------------------------------------------------



    // Szene beenden

    D3D->EndScene();

    return TB_OK;
}


Da der Untergrund und das Haus aus einem Model bestehen, verstehe ich auch nicht, wie es sein kann das sie sich unterschiedlich verhalten.

Anonymous

unregistriert

2

01.12.2008, 13:11

Zitat

...das Haus folgt der Kamera wenn ich diese bewege

Mal mit glPush- und PopMatrix() versucht?

3

01.12.2008, 13:26

Zitat

Mal mit glPush- und PopMatrix() versucht?

Ich vermute, Grabgewalt verwendet Direct3D.

@Grabgewalt: Bist du sicher, dass sich nur das Haus und nicht der Untergrund mitbewegt? Wenn das ein Modell ist, dann kann das meiner Meinung nach gar nicht sein.

4

01.12.2008, 16:59

Also, so wie ich das sehe bewegt sich der Untergrund nicht mit. Ich kann mich z.b. ans Ende des Untergrundes bewegen.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

01.12.2008, 18:21

Ähm Weltmatrix vergessen?

Socke

6

01.12.2008, 19:54

D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

Das ist doch die Weltmatrix oder?

Ich werd versuchen morgen (heute schaff ichs nicht mehr) 'n Video zu machen. Man kann das einfach echt schlecht beschreiben, da sich das Haus nicht generell einfach mit der Kamera bewegt. Nur bei bestimmter Kamera Position und einem bestimmten Blickwinkel taucht das Objekt überhaupt auf. Beim Verändern der Kamera Position folgt das Haus dann einer Weile der Kamera. Verändert sich dabei in der Größe und generell sieht es so aus als ob es sich mehr hinter dem Untergrund befindet (Je nach Blickwinkel). Irgendann ist es dann nicht mehr zu sehen. Außerdem ist die Textur auf 2 Seiten des Hauses merkwürdig verzehrt.
Also, ist ziemlich schwer zu beschreiben... Ich mach morgen mal 'n Video und lad das bei youtube hoch. Nich die schönste Methode aber auf Bildern kann man das nich so gut erkennen.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

7

01.12.2008, 21:23

Oh sry hatte es nur überflogen und die Zeile übersehen. Welchen typ hat m_pStadt?

Socke

8

01.12.2008, 21:30

tbModel
Ich arbeite eben mit dem Buch von David Scherfgen und benutze die TriBase Engine.

9

03.12.2008, 09:46

Ok also hab mal 'n Video gemacht. Ich poste aber mal noch meine move Funktion, da ich denke, dass es damit was zu tun hat. Bin halt wirklich noch Anfäner auf dem Gebiet. Wahrscheinlich ist es 'n ganz logischer Fehler...

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
tbResult CGame::Move(float fTime)
{

    // Levelzeit erhöhen

    m_fLevelTime += fTime;

    // ------------------------------------------------------------------


    // Esc->Hauptmenu

    if(g_pbButtons[TB_KEY_ESCAPE]) g_pDXTest->SetGameState(GS_MAIN_MENU);
    

//KameraBewegung

    vCameraLookAt = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));

    if(g_pfButtons[TB_KEY_LEFT])        g_fCameraRot -= 3.0f * fTime;
    if(g_pfButtons[TB_KEY_RIGHT])       g_fCameraRot += 3.0f * fTime;
    if(g_pfButtons[TB_KEY_UP])          g_fCameraUpDown -= 3.0f * fTime;
    if(g_pfButtons[TB_KEY_DOWN])        g_fCameraUpDown += 3.0f * fTime;
    if(g_pfButtons[TB_KEY_W])           vCameraPos += vCameraLookAt * 500.0f * fTime;
    if(g_pfButtons[TB_KEY_S])           vCameraPos -= vCameraLookAt * 500.0f * fTime;

    if(g_fFOV >= TB_DEG_TO_RAD(180.0f)) g_fFOV = TB_DEG_TO_RAD(179.9f);
    else if(g_fFOV <= TB_DEG_TO_RAD(0.0f)) g_fFOV = TB_DEG_TO_RAD(0.1f);

    return TB_OK;
}


Hier das Video. Für mich sieht das so aus, als wenn sich nur die Häuser bewegen und nicht der Untergrund.

http://www.youtube.com/watch?v=YdTwHST2EZo
(Die Qualität hat beim Upload extrem gelitten. Ich hoffe man kann irgendwie erkennen was ich meine...sorry)

10

03.12.2008, 16:32

Habe das Problem nun mehr oder weniger gelöst. Es liegt irgendwie daran das ich für die "Häuser" und den Untergrund unterschiedliche Texturen benutzt habe. Wenn ich für alle 3 Objekte die gleiche Textur benutze dann bewegen sich die Objekte nicht mehr. Erklären kann ich mir das allerdings nicht so ganz. Des Weiteren habe ich immernoch das Problem das die Textur an 2 Seiten der Würfel verzerrt sind.

Dazu fällt mir noch ne Frage ein: Wie machen das die Profis wenn die ein level modellieren? Basteln die ALLE Objekte einzeln und fügen diese dann im Spiel an die richtige Stelle ein?

Werbeanzeige