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

30.10.2003, 08:39

Nicht dass mit den Animationen. Ich hab mir überlegt, ich mache mir die Arbeit und erweitere den tb3dsReader, so dass er Animationen unterstützt. Irgendjemand muss es ja mal machen. Und mein Modell werde ich in einer Hierachie aufbauene, wobei jedes Objekt eine Animation hat. So könnte ich z.B. Sagen.

Quellcode

1
2
m_Player->m_Ear1->Wackeln();
m_pPlayer->Run(2);


Aber als erstes muss ich mir wohl 3dsMax anschaffen. Vielleicht wünsche ich mir das ja zu Weihnachten. Naja...

Meine eigentliche Frage war ja das, wie man einen Spieler auf den Boden "halten" kann. Dafür gibt es aber auch sicher irgendeine Lösung.

Nochmals danke an alle,

Schüssi :huhu: ,

Chrissi

jube

Frischling

Beiträge: 36

Beruf: Schüler

  • Private Nachricht senden

12

01.11.2003, 20:30

Hallo,
kriegst du sowas zu weihnachten? Des kostet glaub ich so um die 2000 Euro.
Ciao,
Julian

13

02.11.2003, 13:35

Nöö,

aber ich dachte da an die Studentenversion. Aber, ich bin Schüler, und bis ich Student bin, dauert es noch 6 oder mehr Jahre.

Das Problem mit dem Octree habe ich schon selbst gelöst. Nochmals danke an alle,

Schüssi :huhu: ,

Chrissi

14

02.11.2003, 18:40

Scheiße :crying: ,

ich kann nicht mehr. Ich will nicht mehr. Was ist an diesem Code falsch. Die Framerate geht von 40fps auf 0.57 runter. :crying: . Ich weiß nicht mehr weiter. Man...

Hier der Code:

Quellcode

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
// Spieler zum Test ein bisschen runter setzen
    SetPosition(tbVector3(GetPosition().x,GetPosition().y-0.02f,GetPosition().z));
    
    // "Steht" die Kamera nicht auf dem Boden?
    if(!tbModelHitsOctree(m_pType->m_pCollisionModel,
                        m_mMatrix,
                        m_mInvMatrix,
                        g_pNNP->m_pGame->m_pOctree))
    {       
        // Positionsänderung für einen neuen Test ändern
        SetPosition(tbVector3(GetPosition().x,GetPosition().y+0.02f-0.4f,GetPosition().z));
    
        // Trifft die Kamera den Octree, wenn der Spieler fällt
        if(tbModelHitsOctree(m_pType->m_pCollisionModel,
                        m_mMatrix,
                        m_mInvMatrix,
                        g_pNNP->m_pGame->m_pOctree))
        {
            
            // Positionsänderung rückgängig machen 
            SetPosition(tbVector3(GetPosition().x,GetPosition().y+0.4f,GetPosition().z));           

            // Ja. Berechnung, dass der Spieler auf dem Boden aufkommt und nicht durch den Octree durchfällt
            for(float f=0.0f;f<0.4f;f+=0.1f)
            {
                // Positionsänderung für einen neuen Test ändern
                SetPosition(tbVector3(GetPosition().x,GetPosition().y-0.1,GetPosition().z));                

                if(tbModelHitsOctree(m_pType->m_pCollisionModel,
                    m_mMatrix,
                    m_mInvMatrix,
                    g_pNNP->m_pGame->m_pOctree))
                {
                    // Kamera wird nach unten gezogen. Die 0.02 ist der Schwebefaktor des Spielers, da "es" nicht ganz genau auf dem Octree steht.
                    SetPosition(tbVector3(GetPosition().x,GetPosition().y+0.02f,GetPosition().z));
                    break;
                }
            }
        }
        // Nein, der Spieler kann um 0.4 Einheiten heruntergezogen werden
        else
        {
            // Spieler wird nach unten gezogen
            AddVelocityAbs(tbVector3(0.0f,-0.4f,0.0f));
        }
    }
    else
    {
        // Positionsänderung rückgängig machen
        SetPosition(tbVector3(GetPosition().x,GetPosition().y+0.03f,GetPosition().z));
    }
    // Trifft die Kamera den Octree?
    if(tbModelHitsOctree(m_pType->m_pCollisionModel,
                        m_mMatrix,
                        m_mInvMatrix,
                        g_pNNP->m_pGame->m_pOctree,
                        NULL,
                        NULL,
                        &vNormal))
    {
        AddVelocityAbs(vNormal * -tbVector3Dot(GetVelocity(), vNormal));
    }


Kennt nicht jemand ein 3D-Jump&Run-Spiel mit Source Code, wo ich gucken kann, wie die das Problem gelöst haben?!

15

04.11.2003, 18:03

Ich hab jetzt die Lösung (bei zfx.info gefunden): 2D.

Da geht alles soweit ganz einfach, nur,

wie komme ich an die Normalevektoren der Dreiecke eines Octreeknoten dran?

Und ausserdem, kleine Kritik an David; die zwei Kollisionstester für Octrees reichen nicht. Dabei ist es sehr schwer einen neuen zu schreiben, wenn man die Orginal-TriBase weiter benutzen will. Desswegen sollte noch eine inline-Funktion in den tbOctree-Header hin, die den Root-Knoten zurück gibt.

Danke,

Chrissi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

04.11.2003, 18:45

Wieso reichen die nicht? Was brauchst Du denn sonst noch außer Linie - Octree und Modell - Octree?

17

16.11.2003, 12:15

Schuldigung, aber ich habe (leider) noch ein Problem.

Ich habe jetzt allen kleinkram aus meiner control-funktion rausgeschmissen und habe mich jetzt auf das Wesentliche konzentriert. Soweit funktioniert das auch ganz gut, nur:

Wenn die Linie den Octree trifft wird der Spieler sozusagen "Hochgeschleudert", und fällt dann wieder runter.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        // Fällt der Spieler auf dem Boden?
        if(tbLineHitsOctree(GetPosition(), tbVector3(GetPosition().x, (GetPosition().y)-(40.0f)*fTime+GetBoundingSphereRadius()+0.5f, GetPosition().z)+GetVelocity(), g_pNNP->m_pGame->m_pOctree, 0.0f, NULL, &vCollision, NULL, &pNode))
        {
            float fDistance=g_pNNP->m_pGame->PoinPointDistance(GetPosition(), vCollision);
            if(fDistance!=m_pType->m_pModel->GetBoundingSphereRadius()+0.5f)
            {
                GetPosition().y - fDistance+m_pType->m_pModel->GetBoundingSphereRadius()+0.5f;
            }
        }
        // Nein: Runter ziehen
        else
        {
            SetPosition(GetPosition() - tbVector3(0.0f, 40.0f*fTime, 0.0f));        
        }


Den Code für die PointPointDistance habe ich hier aus dem Forum genommen:

Quellcode

1
2
3
4
5
// Distanz zwischen zwei Punkten
float CGame::PoinPointDistance(const tbVector3& vPointA, const tbVector3& vPointB)
{
    return sqrt((vPointB.x-vPointA.x)*(vPointB.x-vPointA.x)+(vPointB.y-vPointA.y)*(vPointB.y-vPointA.y));
}


Erkennt vielleicht jemand das Problem?

Danke,
Chrissi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

18

16.11.2003, 12:32

Zitat von »"chrissi"«

if(fDistance!=m_pType->m_pModel->GetBoundingSphereRadius()+0.5f)

Das sieht schonmal sehr verdächtig aus. Bei float-Werten sollte man nie auf Gleichheit bzw. Ungleichheit prüfen, da es immer kleine Ungenauigkeiten gibt. Willst Du wirklich auf Ungleichheit testen, oder nicht eher auf "kleiner" oder "größer"?
Falls Ungleichheit, dann solltest Du die Differenz bilden, mit fabsf den Betrag berechnen und dieser muss dann größer als ein gewisser Schwellenwert sein. Ich hoffe, Du verstehst, was ich meine. Dann kann man Werte, die z.B. nur 0.0001 auseinander liegen, immer noch als gleich betrachten.

19

16.11.2003, 15:17

Aha, dass wusste ich noch nicht. Aber so funktioniert es auch nicht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
// Fällt der Spieler auf den Boden?
if(tbLineHitsOctree(GetPosition()-tbVector3(0.0f,m_pType->m_pModel->GetBoundingSphereRadius(), 0.0f),GetPosition()-tbVector3(0.0f,m_pType->m_pModel->GetBoundingSphereRadius(), 0.0f) - tbVector3(0.0f, 40.0f*fTime, 0.0f), g_pNNP->m_pGame->m_pOctree, 0.0f, NULL, &vCollision))
{
    float fDistance=g_pNNP->m_pGame->PoinPointDistance(GetPosition()-tbVector3(0.0f,m_pType->m_pModel->GetBoundingSphereRadius(), 0.0f), vCollision);
    SetPosition(GetPosition()-tbVector3(0.0f, fDistance, 0.0f));
}
// Nein: Runter ziehen
else
{
    SetPosition(GetPosition() - tbVector3(0.0f, 40.0f*fTime, 0.0f));
}


Der Spieler fällt einfach durch den Boden durch...

Danke,

Chrissi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

20

16.11.2003, 15:33

Zitat von »"chrissi"«

Quellcode

1
2
3
4
5
// Distanz zwischen zwei Punkten
float CGame::PoinPointDistance(const tbVector3& vPointA, const tbVector3& vPointB)
{
    return sqrt((vPointB.x-vPointA.x)*(vPointB.x-vPointA.x)+(vPointB.y-vPointA.y)*(vPointB.y-vPointA.y));
}

Der Code ist falsch. Das klappt für 2D-Vektoren, aber wo ist denn da die z-Koordinate? Die wird ja garnicht berücksichtigt. Übrigens geht es auch so, ohne viel Schreibarbeit:

float fDistance = tbVector3Length(vPunktA - vPunktB);

PS: Du hast in Deinem Funktionsnamen "Poin" anstatt "Point" drin ;)

Werbeanzeige