3D Rotation, Kollisionsmodel Problem mit p3dc.dll

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3D Rotation, Kollisionsmodel Problem mit p3dc.dll

    Ich verwende die p3dc.dll um 3D Kollisionen "polygongenau" abfragen zu können und für stillstehende nicht rotierende Objekte funktioniert das auch wunderbar, aber sobald ich rotation einabue geht das ganze schief. Ich habe dazu leider nix gefunden und die skripte der dll die sonst sehr gut auskommentiert sind geben mir hier ein Rätsel auf.

    Also worum geht es genau? Ich habe ein 3D Modell eines Raumschiffs dass sich völlig frei im Raum bewegen kann. Die Kollision mit der Levelumgebung erfolgt im Moment mit Rays die entlang der x,y und z Achsen ausgesendet werden und eine Distanz zum Level-Kollisionsmodell zurückgeben, ist die Distanz unter einem bestimmten Wert ist eine Kollision erfolgt und wird dementsprechend gehandelt. Das ganze funktioniert nur sosolala, da das Raumschiff bis zur x,y,z Koordinate ins Kollisionsmodell eindringen kann und dann erst eine Kollision registriert wird. Damit kann ich momentan noch leben.

    Ich habe nun Raketen/Torpedos eingebaut die dem Schiff bei Kontakt Schaden zufügen sollen. Wenn ich dort die "Raycasting" methode verwenden will klappt es überhaupt nicht und ich möchte sowieso lieber zusehen dass die Modelle selbst kollidieren ohne Rays. Dafür gibt es eine Funktion durch die dll, die sieht so aus.

    GML-Quellcode

    1. /*
    2. P3DC (Precise 3D Collisions)
    3. V6.00
    4. ----
    5. Check for a collision between two 3d models; Both of which can move.
    6. ----
    7. RETURNS:
    8. returns (1): there is a collision
    9. returns (0): no collision
    10. returns (any other): Error
    11. ----
    12. ARGUMENTS:
    13. Arg0: model1 id
    14. Arg1: model1 x
    15. Arg2: model1 y
    16. Arg3: model1 z
    17. Arg4: model2 id
    18. Arg5: model2 x
    19. Arg6: model2 y
    20. Arg7: model2 z
    21. [Arg8-10] Creates a vector that represent the model 1's rotation
    22. Arg8: Vector X component
    23. Arg9: Vector Y component
    24. Arg10: Vector Z component
    25. ...For the vector that represents model2's rotation use p3dc_set_modrot(<...>);
    26. */
    27. return external_call(global.p3dc_mcr,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10);
    Alles anzeigen


    Fürs erste wollte ich nur mal dass das Raumschiff rotieren kann und er abcheckt ob sich die Polygone überschneiden, also habe ich folgenden Code ins Step Event der Rakete gesetzt:

    GML-Quellcode

    1. x = x + lengthdir_x(spd,direction) * lengthdir_x(1, z_dir)
    2. y = y + lengthdir_y(spd,direction) * lengthdir_x(1, z_dir)
    3. z = z - lengthdir_y(spd, z_dir)
    4. with(obj_spieler)
    5. {
    6. var coll;
    7. coll = p3dc_check_rotation(
    8. spieler_col, //Kollisionsmodell Nr1 ID
    9. x, //Kollisionsmodell Nr1 X Pos
    10. y, //Kollisionsmodell Nr1 Y Pos
    11. z, //Kollisionsmodell Nr1 Z Pos
    12. other.torpedo_col, //Kollisionsmodell Nr2 ID
    13. other.x, //Kollisionsmodell Nr2 X Pos
    14. other.y, //Kollisionsmodell Nr2 Y Pos
    15. other.z, //Kollisionsmodell Nr2 Z Pos
    16. degtorad(direction)*degtorad(z_dir), //<<DAS HIER SIND DIE KNACKPUNKTE Kollisionsmodell Nr1 Vektor X Komponente
    17. degtorad(y_dir)*degtorad(z_dir), Kollisionsmodell Nr1 Vektor Y Komponente
    18. degtorad(z_dir), Kollisionsmodell Nr1 Vektor Z Komponente
    19. /*lengthdir_x(1, direction)*lengthdir_y(1, z_dir),
    20. lengthdir_y(1, y_dir)*lengthdir_y(1, z_dir),
    21. - lengthdir_y(1, z_dir)*/
    22. );
    23. if coll = 1
    24. {
    25. obj_spieler.hull -= 1
    26. }
    27. }
    Alles anzeigen

    Das Skript verlangt eine vektorkomponente für x,y und z. Ich habe klein begonnen und erstmal nur direction, y_dir und z_dir benutzt. Ohne Erfolg. Dann hat sich das immer mehr ausgeweitet. Keine der Angaben funktioniert.

    Wie gebe ich eine Vektorkomponente an?

    Wenn ich das 3D Modell (nicht! das Kollisionsmodell) des Spielers drehe, dann reichen x,y,z,direction,y_dir, und z_dir Angaben. Das Kollisionsmodell des Schiffs bewegt sich auch brav jeden Step mit dem eigtl Spielermodell mit, aber es dreht sich nicht. Dieses Script sollte im gegensatz zu p3dc_check bzw check_still die Drehung berücksichtigen können.

    Mit den Vektorkomponenten angaben:

    GML-Quellcode

    1. lengthdir_x(1, direction)*lengthdir_y(1, z_dir),
    2. lengthdir_y(1, y_dir)*lengthdir_y(1, z_dir),
    3. - lengthdir_y(1, z_dir)


    kommt es zu einer Kollision, aber das Modell dreht sich nicht mit, ich nehme also nur Schadenn wenn ich auf 0,0,0 Drehung stehe.

    Weiß jemand Rat? Ich bin auch über Skype erreichbar -> PN an mich bitte :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)