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

22.03.2007, 16:51

Kameraposition berechnen

Hallo Ich habe mal eine Frage zur berechnung der Kammera
position:

Ich rendere mein Objekt und platziere meine Kammera dahinter wenn ich jetzt mein Objekt rotieren lasse soll meine Kammera immer dahinter bleiben also das Objekt bleibt an der gleichen position es rotiert nur.

C-/C++-Quelltext

1
2
Objekt->SetPosition(posX,posY,posZ);
Objekt->SetRotation(rotX,rotY,rotZ);

also in der SetRotation änere ich die Werte und muss diese ja auf die Kammera berechnen könntet Ihr mir da eine Hilfe geben wie ich die neue Position berechen.
Danke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

22.03.2007, 20:37

Du nimmst den Ausrichtungsvektor des Objektes und die Objektposition sowie den Abstand der Kamera vom Objekt sowie Winkel usw.
Dann rechnest du:

Kamerapos = Ausrichtungsvektor * den Winkel der Kamera zum Objekt(als matrix o.ä.) * Abstand der Kamera vom Objekt + Objektposition

die Ausrichtung der Kamera kann du dann einfach per

normalize(Objektpos - Kamerapos)

ermitteln
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

22.03.2007, 23:29

Ok so ganz verstanden hab ich es noch nicht aber ich schreibe einfach mal die daten die ich habe hier rein.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Position der Kammera

m_vPosition.x = 0.0f;
m_vPosition.y = 0.0f;
m_vPosition.z = 0.0f;
m_vLookAt.x = sinf(m_fRotAngleY) + m_vPosition.x;
m_vLookAt.z = cosf(m_fRotAngleY) + m_vPosition.z;
m_vLookAt.y = sinf(m_fRotAngleX) + m_vPosition.y;

//Position des Objektes

Objekt.Move(x,y,z);
Objekt.Rotation(rotX, rotY,rotZ);
D3DXMatrixLookAtLH(&m_ViewMatrix,&m_vPosition,&m_vLookAt,&m_vUp);

also ich habe die Kammeraposition m_vPosition und die Ausrichtung m_vLookAt wenn es so stimmt
und Obejekt Move verschiebt ja mein Objekt und mit Rotation rotiert es um die eigene Achse.
Kann ich mit diesen Werten die Kammera Position berechnen oder brauche ich noch welche?

4

24.03.2007, 00:32

Weiß keiner wie es geht?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

24.03.2007, 13:12

Ist lange her, dass ich mit der Mathematik wirklich beschäftigt habe^^. Könnte jemand der fitter mal schauen ob das so passt?

P.S: soll das eine Art RGP 3rd person Kamera werden?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.03.2007, 13:23

hast du zugriff auf die objektmatrix deines objektes?

wenn ja, dann könntest du einfach hergehen, deine kameraposition relativ zum ojekt festlegen und diese dann mit der objektmatrix transformieren -> kameraposition in weltkoordinaten. ich denk man sollte da auch direkt eine transformation für eine kameramatrix mit einer objektmatrix finden können, aber da muss ich mir noch gedanken drüber machen (inverse welt x view matrix!?)

vorteil ist, dass das allgemein funktioniert (also nicht nur mit rotation, sondern mit alle affinen transformationen)

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

7

24.03.2007, 19:12

Hier ein paar Tips:
Du willst ja Kamerapostion und "lookat". Als "lookat" würde ich einfach die Objekt position nehmen. Die kameraposition bekommst Du als lookat-a*n wobei der skalar a der konstante Abstand ist und n ein Vektor der Länge eins ist, in derRichtung in der das Objekt schaut. Überleg Dir wann ein vektor die Länge eins hat, unabhängig von den Winkeln. Tipp sin**2 + cos**2 = 1. Also bei einem Winkel ist (sin(x), cos(x), 0) ein Einheitsvektor. Wie geht das bei zwei Winkeln ;) ?
"Games are algorithmic entertainment."

8

25.03.2007, 00:15

Ok also momentan ist es so dass sich die Kammera um das Objekt bewegt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
m_vLookAt.x = sinf(m_fRotAngleY) + m_vPosition.x;
m_vLookAt.z = cosf(m_fRotAngleY) + m_vPosition.z;
m_vLookAt.y = sinf(m_fRotAngleX) + m_vPosition.y;

x = sinf(m_fRotAngleY )+ m_vLookAt.x;
y = sinf(m_fRotAngleX )+ m_vLookAt.y;
z = cosf(m_fRotAngleY )+ m_vLookAt.z;

Spieler.Move(x,y,z);

aber das bekomme ich schon noch irgendwie hin.
Achso es soll so ein Weltraumschooter geben wo man eben die Ansicht wchseln kann zwichen innen und außen wobei ich noch ein kleines Problem habe und zwar wenn ich mich um die Y-Achse drehen will müssen ja alle Objekte und die Skybox sich drehen jetzt hat meine Skybox eine eigene WorldMatrix und meine Objekte haben eine WorldMatrix

hier mal das Rendern von Objekten

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
void CModel::Render(void)
{   
    D3DXMATRIX TransMatrix;
    D3DXMATRIX RotMatrix;
    D3DXMATRIX RotMatrixX, RotMatrixY, RotMatrixZ;
    //D3DXMATRIX WorldMatrix;


    // Rotationsmatrizen anlegen

    D3DXMatrixRotationX(&RotMatrixX,m_RotX);
    D3DXMatrixRotationY(&RotMatrixY,m_RotY);
    D3DXMatrixRotationZ(&RotMatrixZ,m_RotZ);
 
    D3DXMatrixIdentity(&RotMatrix);
    // und miteinander multiplizieren

    D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixX);
    D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixY);
    D3DXMatrixMultiply(&RotMatrix,&RotMatrix,&RotMatrixZ);
    
    
    // Transformations und Rotationsmatrix zur Weltmatrix zusammenfassen

    D3DXMatrixMultiply(&WorldMatrix,&RotMatrix,&TransMatrix);

    D3DXMatrixTranslation(&TransMatrix,m_vPosition.x,m_vPosition.y,m_vPosition.z);

    D3DXMatrixMultiply(&WorldMatrix,&RotMatrix,&TransMatrix);

    m_lpD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);

    // durch alle Materialien/Texturen laufen

    for(unsigned int i=0;i<m_nNumMaterials;i++)
    {
        // Material setzen

        m_lpD3DDevice->SetMaterial(&m_lpMeshMaterials[i]);
        
        // Textur setzen

        if(NULL != m_lpMeshTextures[i])
        {
            m_lpD3DDevice->SetTexture(0,m_lpResManager->GetTexture(m_lpMeshTextures[i]));
        }
        else
        {
            m_lpD3DDevice->SetTexture(0,NULL);
        }
        
        // Mesh rendern

        m_lpMesh->DrawSubset(i);
    }

    m_lpD3DDevice->SetTexture(0,NULL);
}

kann ich Theoretisch alles wieder in eine eigene WorldMatrix zusammenfassen und diese dann mit

D3DXMatrixRotationY verschieben oder liege ich da ganz falsch?

Danke schonmal für die Hilfe!!!

9

27.03.2007, 12:51

1. Spielfigur bleibt am Ursprung (0,0,0) und wird nur gedreht,
2. Kamera bleibt in festem Abstand dahinter und schaut auf den Ursprung.

Dann

ändert sich m_vLookAt nicht (wegen 1.)

und

die Kamera kann man einfach um den Urspung rotieren lassen mit derselben
Rotationsmatrix, mit der man die Spielfigur dreht
(wegen 2.):
MatrixKamera = TranslationKamera * RotationSpielfigur (in dieser Reihenfolge!).

10

28.03.2007, 11:59

OK Danke

Werbeanzeige