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.
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:
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:
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
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
- /*
- P3DC (Precise 3D Collisions)
- V6.00
- ----
- Check for a collision between two 3d models; Both of which can move.
- ----
- RETURNS:
- returns (1): there is a collision
- returns (0): no collision
- returns (any other): Error
- ----
- ARGUMENTS:
- Arg0: model1 id
- Arg1: model1 x
- Arg2: model1 y
- Arg3: model1 z
- Arg4: model2 id
- Arg5: model2 x
- Arg6: model2 y
- Arg7: model2 z
- [Arg8-10] Creates a vector that represent the model 1's rotation
- Arg8: Vector X component
- Arg9: Vector Y component
- Arg10: Vector Z component
- ...For the vector that represents model2's rotation use p3dc_set_modrot(<...>);
- */
- return external_call(global.p3dc_mcr,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10);
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
- x = x + lengthdir_x(spd,direction) * lengthdir_x(1, z_dir)
- y = y + lengthdir_y(spd,direction) * lengthdir_x(1, z_dir)
- z = z - lengthdir_y(spd, z_dir)
- with(obj_spieler)
- {
- var coll;
- coll = p3dc_check_rotation(
- spieler_col, //Kollisionsmodell Nr1 ID
- x, //Kollisionsmodell Nr1 X Pos
- y, //Kollisionsmodell Nr1 Y Pos
- z, //Kollisionsmodell Nr1 Z Pos
- other.torpedo_col, //Kollisionsmodell Nr2 ID
- other.x, //Kollisionsmodell Nr2 X Pos
- other.y, //Kollisionsmodell Nr2 Y Pos
- other.z, //Kollisionsmodell Nr2 Z Pos
- degtorad(direction)*degtorad(z_dir), //<<DAS HIER SIND DIE KNACKPUNKTE Kollisionsmodell Nr1 Vektor X Komponente
- degtorad(y_dir)*degtorad(z_dir), Kollisionsmodell Nr1 Vektor Y Komponente
- degtorad(z_dir), Kollisionsmodell Nr1 Vektor Z Komponente
- /*lengthdir_x(1, direction)*lengthdir_y(1, z_dir),
- lengthdir_y(1, y_dir)*lengthdir_y(1, z_dir),
- - lengthdir_y(1, z_dir)*/
- );
- if coll = 1
- {
- obj_spieler.hull -= 1
- }
- }
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:
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
