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

51

08.09.2010, 23:37

Ja, pAt wird wie oben beschrieben berechnet. Wieso fragst, ist das Ergebnis nicht richtig? Wenn ja, fällt mir auf, dass du zuerst die ViewMatrix berechnest, und dann den Punkt transformierst :P

52

08.09.2010, 23:39

naja jetzt seh ich gar nichts mehr^^ Auch wenn ich es andersrum mache. Deswegen frag ich ob an dem code was falsch ist?
Metal ist keine Musik sondern eine Religion.

53

08.09.2010, 23:43

Wo liegt das Objekt und welchen Wert hat g_vCameraPos? Ich schau mir das nochmal genau an, bei mir hat diese Methode mit dem Transformieren immer gut funktioniert.

Falls ich den Fehler diese Nacht nicht mehr find, bilde ich morgen (relativ) früh mal das Beispiel nach...

54

08.09.2010, 23:46

Das ist mein gesamter code:

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
#include <Framework.h>
#include "main.h"
#include "Game.h"
#include "Quests.h"
#include "RenderVillage.h"

D3DXVECTOR3 g_vCameraPos = D3DXVECTOR3(-1.0f, -40.0f, -5.0f);
D3DXVECTOR3 pAt = D3DXVECTOR3(-1.0f,-16.0f,0.0f);

float rotx = 0.0f, roty = 5.0f * D3DX_PI/180, rotz = 0.0f;
D3DXVECTOR3 p(-1.0f,-16.0f,0.0f);

HRESULT CGame::Render(float stime)
{
    D3DXMATRIX ViewMatrix; 
    D3DXMATRIX ProjectionMatrix; 

    cd3d.GetDevice()->SetRenderState(D3DRS_LIGHTING,TRUE);
    cd3d.GetDevice()->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
    cd3d.GetDevice()->SetRenderState(D3DRS_DITHERENABLE,TRUE);
    cd3d.GetDevice()->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);

    
    D3DXMATRIX matrix; 
    D3DXMatrixRotationYawPitchRoll(&matrix, roty, rotx, rotz);

    D3DXVec3TransformCoord(&p, &p, &matrix);
    pAt = g_vCameraPos + p; 

    D3DXMatrixLookAtLH(&ViewMatrix, 
                       &g_vCameraPos,
                       &pAt,
                       &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); 
    
    D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, 
                               D3DX_PI/4, 
                               static_cast<float>(cwind.GetWidth()) / static_cast<float>(cwind.Getheight()), 
                               1.0f, 
                               1000.0f ); 

    cd3d.GetDevice()->SetTransform(D3DTS_VIEW, &ViewMatrix); 
    cd3d.GetDevice()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix); 

    cd3d.BeginRendering(0x00ffff00);

    rendervil.RenderBuildings(cd3d.GetDevice());

    cd3d.EndRendering();

    return 0;
}

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
HRESULT CRenderVillage::RenderBuildings(LPDIRECT3DDEVICE9 device)
{
    D3DXVECTOR3 TranslationVec = D3DXVECTOR3(3.0f,0.0f,0.0f);
    D3DXVECTOR3 ScalVec = D3DXVECTOR3(5.0f,5.0f,5.0f);

    D3DXMATRIX Translation;
    D3DXMATRIX Scaling;
    D3DXMATRIX World;

    //Erste Häuserreihe
    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x,TranslationVec.y,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x-0.5f,TranslationVec.y+3.0f,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x-1.0f,TranslationVec.y+6.0f,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    //Zweite Häuserreihe
    TranslationVec = D3DXVECTOR3(-3.0f,0.0f,0.0f);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x,TranslationVec.y,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x+0.5f,TranslationVec.y+3.0f,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x+1.0f,TranslationVec.y+6.0f,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);

    //Das Gehöft
    TranslationVec = D3DXVECTOR3(0.0f,9.0f,0.0f);

    D3DXMatrixScaling(&Scaling,ScalVec.x,ScalVec.y,ScalVec.z);
    D3DXMatrixTranslation(&Translation,TranslationVec.x,TranslationVec.y,TranslationVec.z);

    World = Translation*Scaling;
    device->SetTransform(D3DTS_WORLD,&World);

    Building->DrawSubset(0);
    
    return 0;
}
Metal ist keine Musik sondern eine Religion.

55

08.09.2010, 23:59

Wie in meiner "Anleitung" geschrieben wird die Richtung gedreht. In deinem Beispiel befinden sich die Häuser (nahe) (3/0/0), die Kamera bei (-1/-40/-5), also muss der Richtungsvektor p (4/40/5) sein.

--> Den Vektor p, der transformiert wird, auf (4/40/5) ändern, der Rest müsste stimmen. Wenn du immernoch nichts siehst, spiel ein bisschen mit der Rotation rum, bei rotx = roty = rotz = 0.0 sollte man auf jeden Fall was sehen (aber dann ist nat. auch nichts gedreht). - Einfach aufpassen, dass du nicht zu weit drehst.
--> Du schreibst world = translation * scaling; nimmt man nicht normalerweise die Reihenfolge scaling,( rotation,) translation?

56

09.09.2010, 00:09

Ja es dreht sich zwar aber immer noch nicht so wie ich will -.- wie schaffe ich es jetzt das die Kamera um einen bestimmten Punkt kreist?
Metal ist keine Musik sondern eine Religion.

57

09.09.2010, 00:21

:lol: Ich habe das jetzt immer unter "Kamera drehen" verstanden. -- Wenn du die Kameraposition auf einem Kreis drehen lassen willst, wobei sie immer auf den gleichen Punkt schaut, musst du im Grunde nur g_vCameraPos drehen, wie es eben mit pAt gemacht wurde.

Neuer Lösungsweg für "neues" Problem:
1. pAt auf Objekt setzen (3/0/0)
2. p (Richtungsvektor) neu setzen, von pAt in Richtung g_vCameraPos, also p = g_vCameraPos - pAt
3. p drehen
4. g_vCameraPos = pAt + p

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
D3DXVECTOR3 pAt = D3DXVECTOR3(3.0f,0.0f,0.0f); // auf diesen Punkt starrt die Kamera und um diesen Punkt dreht sie sich 
// die 3 rotation-floats wie immer 
D3DXVECTOR3 g_vCameraPos = D3DXVECTOR3(-1.0f, -40.0f, -5.0f); // beliebig 
D3DXVECTOR3 p = g_vCameraPos - pAt; 

// CGame::Render() 
    D3DXMATRIX matrix; 
    D3DXMatrixRotationYawPitchRoll(&matrix, roty, rotx, rotz); 

    D3DXVec3TransformCoord(&p, &p, &matrix); 
    g_vCameraPos = pAt + p; 



Edit: So wie es war, wie du es nicht wolltest, hat es aber funktioniert? Also, dass sich die Kamera mit der Drehung wie in FPS Spieler verhielt?

58

11.09.2010, 16:02

Ich schau ja von oben auf das geschehen. Also über meine y-Achse. Wie schaffe ich es jetzt das sich die Kamera Kreisförmig um einen Punkt bewegt. So wie bei dir geht es ja nur über eine Achse. Wie schaffe ich das jetzt?
Metal ist keine Musik sondern eine Religion.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

59

11.09.2010, 16:31

Was meinst du mit dem, dass du über die Y-Achse schaust? defaultplayer^^ hat es ja eigentlich ganz gut erklärt. Wenn du die Position der Kamera um alle Achsen drehen willst, solltest du den Punkt mittels Matrizen transformieren.

Werbeanzeige