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

16.04.2014, 18:44

Direct3D 11 Zombie in Richtung seines "Blickes" bewegen

Guten Nachmittag!


Ich bin nun seit ca. 2 Wochen an DirectX 11 dran, und bin schon so weit, dass ich ein OBJ laden kann, es bewegen usw... Im Moment arbeite ich eigentlich an Kollisionen.


Nun, da ich neben meinem Tutorial Project auch noch einen Boxhead Clon schreibe, in welchem ich das Gelernte zu verwirklichen Versuche, wollte ich mal einen Zombie auf mich zu laufen lassen. Dabei habe ich schon den Winkel und alles berechnet, aber ich "verliere" mich grade in meinem Eigenen Code. Könnte mir mal einer aushelfen?

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
    ZombieWorld = XMMatrixIdentity();

    float Angle;
    XMVECTOR Position;

    if (ZombiePosX != XMVectorGetX(CamPosition) || ZombiePosZ != XMVectorGetZ(CamPosition))
    {
        Position = XMVectorSet(ZombiePosX, ZombiePosY, ZombiePosZ, 0.0f);

        float CamPosBuf = XMVectorGetX(CamPosition);

        XMVECTOR DefaultZombieForward = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);

        DeltaX = CamPosBuf - ZombiePosX;

        CamPosBuf = XMVectorGetZ(CamPosition);

        DeltaZ = CamPosBuf - ZombiePosZ;

        Angle = atan2(DeltaX, DeltaZ);

        XMMATRIX YTempMatrix = XMMatrixRotationY(Angle);

        Forward = XMVector3TransformCoord(DefaultZombieForward, YTempMatrix);

        Position += 1.0f * DefaultZombieForward;
    }

    Rotation = XMMatrixRotationY(Angle + 3.14f);
    Scale = XMMatrixScaling(1.7f, 2.0f, 1.8f);
    Translation = XMMatrixTranslation(XMVectorGetX(Position), XMVectorGetY(Position), XMVectorGetZ(Position));

    ZombieWorld = Rotation * Scale * Translation;



Der Code oben Basiert eigentlich auf meiner Kamera, welche ich ja auch in Richtung meines Blickes bewegen.


MFG
FERNman

2

16.04.2014, 19:31

Geschafft!

Nach einem kurzen Kaffee hab ich es auf andere Weise nun doch geschafft :D

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
    float Angle;

    if (ZombiePosX != XMVectorGetX(CamPosition) || ZombiePosZ != XMVectorGetZ(CamPosition))
    {
        float CamPosBuf = XMVectorGetX(CamPosition);

        DeltaX = CamPosBuf - ZombiePosX;

        CamPosBuf = XMVectorGetZ(CamPosition);

        DeltaZ = CamPosBuf - ZombiePosZ;

        Angle = atan2(DeltaX, DeltaZ);

        if (PositionSet)
        {
            float Speed = 8.0f * Time;

            ZombiePosX += Speed * sinf(Angle);
            ZombiePosZ += Speed * cosf(Angle);
        }

        PositionSet = true;
    }

    Rotation = XMMatrixRotationY(Angle + PI);
    Scale = XMMatrixScaling(1.7f, 2.0f, 1.8f);
    Translation = XMMatrixTranslation(ZombiePosX, ZombiePosY, ZombiePosZ);

    ZombieWorld = Rotation * Scale * Translation;

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

17.04.2014, 07:04

Warum berechnest Du einen Vektor mit Richtung A, dann seinen Winkel um einen neuen Vektor mit derselben Richtung A zu erstellen, der nur eine andere Länge hat? Wäre es nicht sinnvollerst Du nimmst einfach den Vektor und skalierst ihn passend? DeltaZ und DeltaX sind die Komponenten dieses Vektors. Nur eben nicht mit der richtigen Länge. Normieren und Skalieren. Fertig. Winkelberechnungen über trigonometrische Funktionen sind oft ein Zeichen dafür, dass man was falsch macht und man braucht sie nur sehr selten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

17.04.2014, 12:05

Könntest du mir bitte ein Codebeispiel geben? Ich weiß nicht genau, wie du das meinst.

MFG
FERNman

5

17.04.2014, 12:11

Wir haben auch ein Wiki. Da sind so manche Seiten. Unter anderem diese.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

17.04.2014, 12:17

Was ich meine? Ich meine dass die Vektoren (DeltaX / DeltaZ) und (Speed * sinf(Angle), Speed * cosf(Angle)) parallel sind und nur verschieden lang. Du berechnest erst einen Winkel aus einem Vektor um dann mit dem Winkel einen parallelen Vektor anderer Länge zu berechnen. Du kannst auch gleich (DeltaX / DeltaZ) nehmen, normalisieren und mit Speed multiplizieren. Kommt genau dasselbe raus und du sparst vier trigonometrische Funktionen und mehrere Zeilen Code.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

22.04.2014, 13:43

Wenn man sich hier mit so einem "Bedanken-Knopf" bedanken könnte, würde ich das jetzt tun. Danke!

Werbeanzeige