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

11

16.06.2005, 15:33

OK.
Aber könnte ich das Level nicht in vielen kleinen Models laden? Weil ein Model ja auch in Groups unterteilt ist (zumindest in Milkshape).
Sonst muss ich ja die Position jedes Blockes im Quelltext angeben.
Mein Projekt: Rise of the Sylvan

12

22.06.2005, 16:24

Also die Kollision funktioniert jetzt soweit mit D3DXIntersect. Aber beim Sliden klappt's noch nicht.
Ich hab hier mal einen Codeabschnitt:

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
D3DXVECTOR3 vNewCamDir;
    BOOL bHit;
    DWORD dwFaceIndex;
    float fDist;
    D3DXVECTOR3* avVertices;
    D3DXVECTOR3 avTri[3];
    D3DXVECTOR3 vNormal;
    D3DXIntersect(Level.m_Model.pMesh,&vLook,&vCamDir ,&bHit,&dwFaceIndex,
                NULL,NULL,&fDist,NULL,NULL);
    if (!bHit) fDist=10.0f;
    if (fDist>m_fBSphereRadius*3.0f) 
    {   
        m_vPosition[0]=vLook;
    }
    else 
    {
        Level.m_Model.pMesh->LockVertexBuffer(D3DLOCK_READONLY,(void**)&avVertices);
        avTri[0]=avVertices[dwFaceIndex*3+0];
        avTri[1]=avVertices[dwFaceIndex*3+1];
        avTri[2]=avVertices[dwFaceIndex*3+2];
        D3DXVECTOR3 e1=avTri[1]-avTri[0], e2=avTri[2]-avTri[0];
        D3DXVec3Cross(&vNormal,&e1,&e2);
        D3DXVec3Normalize(&vNormal,&vNormal);
        Level.m_Model.pMesh->UnlockVertexBuffer();
                D3DXVec3Cross(&m_vVelocity,&vNormal,&D3DXVECTOR3(0.0f,1.0f,0.0f));
    }
Mein Projekt: Rise of the Sylvan

Anonymous

unregistriert

13

23.06.2005, 12:52

Es sieht alles gut aus bis auf die zeile in der die geschwindigkeit berechnet wird. Die rigchtige Formel ist:

geschw = geschw + normale * (normale * geschwindigkeit).

normale * (normale * geschwindigkeit) ist (minus) die Komponente von Geschwindigkeit in Normalen Richtung, da (normale * geschwindigkeit) deren Länge ist.

Tschüss,
Osram.

14

23.06.2005, 16:52

Irgendiw verstehe ich die Formel nicht so ganz.
geschw = geschw + normale * (normale * geschwindigkeit).
normale*normale ist ja dann normale^2. und wenn ich zwei vektoren addiere, gibt mir VC eine Fehlermeldung aus.
Aber trotzdem schon mal Danke für die Antwort.
Mein Projekt: Rise of the Sylvan

Anonymous

unregistriert

15

24.06.2005, 17:55

Die Klammern sind wichtig. Die Reihenfolge des Ausrechnens ist also:

normale * geschwindigkeit Also Vektor mal Vektor (Skalarprodukt), ergibt einen Skalar (eine Zahl). Dies ist die Länge der Projektion der Geschwindigkeit auf die Richtuing der Normale. Bitte versuche, z.B. im Internet Infos zum Skalarprodukt zu finden. Sorry, aber ich muss momentan m Telegramstil schreiben.

normale * (normale * geschwindigkeit) ist also Vektor * Skalar, also ein Vektor. Dies ist die Projecktion der Geschwindigkeit auf Normalenrichtung oder anders ausgedrückt die Komponente der geschwindigkeit in Normalenrichtrung.

geschw + normale * (normale * geschwindigkeit). Sagen wir Geschwidigkeit ist vn + vs, nämlich v_Normale + v_senkrecht zur Normale (d.h. entlang dser Wand). Du will sliden, also keine vn

normale * (normale * geschwindigkeit) ist aber gerade -vn, also ist die Formel
vn +vs + (-vn) also wie gewünscht vs.

Zitat


wenn ich zwei vektoren addiere, gibt mir VC eine Fehlermeldung aus.


Das addieren zweier Vektoren überlasse ich dem Leser als Aufgabe :P


Osram, der sein Passwort zu Hause hat :-/.

16

24.06.2005, 18:23

Also ich hab jetzt die Berechnung von m_vVelocity so umgeändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
float ScalarProduct(D3DXVECTOR3 v1,D3DXVECTOR3 v2)
{
    return  v1.x*v2.x+
            v1.y*v2.y+
            v1.z*v2.z;
}
m_vVelocity+=vNormal*ScalarProduct(vNormal,m_vVelocity);


Aber meine Spielfigur bleibt noch hängen.
Mein Projekt: Rise of the Sylvan

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

17

25.06.2005, 01:04

Sieht eigentlich gut aus.
Hast Du noch anderen Code, der verhindern soll, dass die Figur durch die Wand geht? Hast Du mal durchdebuggt? Das Vorzeichen in der Formel hängt davon ab, wie rum die Normal zeigt (nach "innen" oder nach "außen"). Probier mal beide Möglichkeiten aus. Falls das durchdebuggen nicht hilft, poste mal hier die Werte (Normale, Geschwindigkeit vorher und nacher etc)
"Games are algorithmic entertainment."

18

25.06.2005, 10:00

Danke, Osram! Ich wusste, auf dich ist Verlass!
Ein bisschen hakt's aber trotzdem noch.
Was mir allerdings noch bei der Move-Funktion aufgefallen ist, ist folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
D3DXVECTOR3 vLook=m_vPosition[0];
    if (aKey[DIK_LEFT]  & 0x80) m_fAngle-=160.0f*D3DX_PI/180.0f*g_fTimePassed;
    if (aKey[DIK_RIGHT] & 0x80) m_fAngle+=160.0f*D3DX_PI/180.0f*g_fTimePassed;
    
    D3DXVECTOR3 vCamDir(sinf(m_fAngle),0.0f,cosf(m_fAngle));
    
    if (aKey[DIK_UP]    & 0x80) m_vVelocity-=vCamDir*10*g_fTimePassed;
    if (aKey[DIK_DOWN]  & 0x80) m_vVelocity+=vCamDir*10*g_fTimePassed;

    m_vVelocity*=powf(0.1f,g_fTimePassed);

    if (m_vVelocity.x> 1.0f) m_vVelocity.x= 1.0f;
    if (m_vVelocity.y> 1.0f) m_vVelocity.y= 1.0f;
    if (m_vVelocity.z> 1.0f) m_vVelocity.z= 1.0f;
    if (m_vVelocity.x<-1.0f) m_vVelocity.x=-1.0f;
    if (m_vVelocity.y<-1.0f) m_vVelocity.y=-1.0f;
    if (m_vVelocity.z<-1.0f) m_vVelocity.z=-1.0f;

Mich wundert es, warum m_vVelocity verringert werden muss, wenn ich [Pfeil oben] drücke. Hat aber eher nichts mit dem Prob zu tun.

Eine Vermutung, warum es noch hakt, ist, dass die Spielfigur vielleicht zu tieg in der Wand hängt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vCamDir=D3DXVECTOR3(sinf(m_fAngle),0.0f,cosf(m_fAngle));
D3DXVECTOR3 vNewCamDir;
    BOOL bHit;
    DWORD dwFaceIndex;
    float fDist;
    D3DXVECTOR3* avVertices;
    D3DXVECTOR3 avTri[3];
    D3DXVECTOR3 vNormal;
    D3DXVec3Normalize(&vNewCamDir,&vCamDir);
    D3DXIntersect(Level.m_Model.pMesh,&vLook,&vNewCamDir,&bHit,&dwFaceIndex,
                    NULL,NULL,&fDist,NULL,NULL);
    //dwFaceIndex*=3;

    if (!bHit) fDist=10.0f;
    if (fDist>m_fBSphereRadius*3.0f) 
    {   
        m_vPosition=vLook;
    }
    else 
    { Kollision ...}

Fällt jemandem da ein Fehler auf?
Mein Projekt: Rise of the Sylvan

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

19

26.06.2005, 17:36

Zitat


warum m_vVelocity verringert werden muss, wenn ich [Pfeil oben] drücke


Ja, das ist komisch. Es wird wahrscheinlich am Code liegen, der m_vVelocity nutzt.


Sorry, ich kenne D3DXIntersect ncht und weiss nicht was vLook ist und kann daher nichts zu Deinem Code sagen. Ich denke, hier müssen Dir andere helfen.

Übrigens ist mir noch ein Poblem mit "meinem" Algorithmus eingefallen:
Nachdem die Wand getroffen wurde, setzt es die weitere Bewegung auf eine Paralelle, d.h der Abstand zur Wand bleibt konstant. Der Abstand bei dem aber zum 1. mal eine Kollision (für den nachsten Zeitschritt) gefunden wird, kann aber variieren.
"Games are algorithmic entertainment."

20

05.07.2005, 14:31

Hmm, das mit D3DXIntersect funktioniert doch nicht so gut.
Weiß jemand vielleicht, wie eine Kugel-Dreiecks-Kollision berechnet werden kann? Dann könnte ich eine Bounding-Sphere für den Spieler berechnen lassen und dann jedes Dreieck des Levels prüfen.

Noch eine andere Frage: Wie hat David das denn bei Blocks 2001 gemacht? Der hat das Level ja in viele kleine Teile geteilt. Aber hat der dann die ganzen Positionen im Quelltext angegeben?
Mein Projekt: Rise of the Sylvan

Werbeanzeige