Kollision von Welt(größeres Objekt) und Spieler 3D

Previous topic - Next topic

x-tra

Ich habe einen Level, als komplettmodell, und eine Spielfigur.

Wie löse ich das Kollisionsproblem am elegantesten.

Muss ich da jetzt quaderkollisionsobjekte dazu nehmen, oder eben x_collision mit kugeln.

Da der level ja nicht eine glatte fläche ist, was bietet sich da an.

Hab da auch häuser drauf usw.

Kitty Hello

X_COLLISION (Kugel) um den Spieler herum.

Schranz0r

für die Bodencollision X_COLLISIONRAY mit bezug auf Körpergröße(Spieler)

Die anderen Collisionen würde ich mit X_COLLISON machen, und den spielchen Alt_X,Alt_Y,Alt_Z ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

Bei collisionray müsste ich ja linien ziehen, richtig, da es aber keine ebene fläche ist, wirds wohl schwierig, oder?

und was meinst du mit
Code (glbasic) Select
Alt_X,Alt_Y,Alt_Z?

Vielleicht schon die nächste Frage die mich beschäftigt: Nämlich wenn ich eine Kollision habe mittels X_Collision, dann stellt der Befehl nur das Vorhandensein einer coll fest, nicht aber auf welcher seite.Dies wäre aber wichtig, damit man entsprechend der Kollision dann das Verhalten steuern kann.

Und dies ist nun mal notwendig, weil wenn ich mit meiner Spielfigur mit einem Haus kollidiere, wäre schon wichtig, an welcher Stelle dies passiert, um nur diese Richtung zu verbieten.

Und ist es wohl sinnvoller die map, und die gebäude fahrzeuge bäume usw seperat zu handhaben, oder?

Ich dachte man kann alles mit einer kollisionsabfrage lösen.also spieler mit welt.

Kitty Hello

A-Ha! Die Kollisionsposition und Richtung willst Du haben?
Muss ich mal programmieren. Ich hab's immer so gemacht, dass ich (falls Kollision) den Spieler da hinstelle, wo er vorher war. Bei beweglichen Platformen ist das u.U. doof -> Wenn dich die Platform aber wegschiebt, wirds noch doofer...

Kitty Hello

A-Ha! Die Kollisionsposition und Richtung willst Du haben?
Muss ich mal programmieren. Ich hab's immer so gemacht, dass ich (falls Kollision) den Spieler da hinstelle, wo er vorher war. Bei beweglichen Platformen ist das u.U. doof -> Wenn dich die Platform aber wegschiebt, wirds noch doofer...

x-tra

Jenau, sowas wär toll.
Denn wenn ich z.B. mit einer Figur mit armen mit dem linken arm an einem objekt kollidiere, und dann einfach die vorhergehende Position einnehme und sich das andere objekt sich bewegt, wirds problematisch.

Wie meinst du das, mit der vorherigen Position? Also praktisch.

Müsste ich immer die aktuelle Position vor der Kollision in Variablen speichern, die bei Kollision dann als Koordinatenwiederherstellung funkieren würden, oder denk ich ma wieder zu kompliziert?

Schranz0r

so wie ich sagte!

Bevor du den Spieler bewegs:

Pseudocode:
Code (glbasic) Select
   Alt_X = PlayerX
    Alt_Y = PlayerY
    Alt_Z = PlayerZ

IF Collision
    PlayerX = Alt_X
    PlayerY = Alt_Y
    PlayerZ = Alt_Z
ELSE
    Spielerbewegen
ENDIF
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

acht mit alt, meintest du alt im sinne von uralt, grins.

irgendwie war ich auf die alt taste auf der tastatur fixiert.lach.

dann ist alles klar.

x-tra

Code (glbasic) Select
für die Bodencollision X_COLLISIONRAY mit bezug auf Körpergröße(Spieler)Kann mir das jemand erklären?

Schade dass man nicht direkt Unterscheiden kann was mit was kollidiert.
Geht zwar schon, aber is halt umständlich.

Schranz0r

naja "Objekt Collide" ist halt rechenintensiv...

Also mit dem Kolidieren zum Boden:

 www.StyleAttax.de/3D_Movement.rar
das eine Sprite halt in Drawsprite ändern ;)

Hier noch der Code mit der Bodencollision:

Code (glbasic) Select
Coll = X_COLLISIONRAY(0,0,X,Y,Z,0,-1,0) // Collision mit Boden

IF Coll > 1.5
DEC Y,anziehung // wenn "Spieler" in der luft dann Anziehung!
ENDIF

IF Coll < 1.4 // muss kleiner sein als
INC Y,0.1 // wenn erhöhung kommt dann höher setzen

IF Coll = 0 THEN DEC Y,anziehung // wenn keine Collision da ist spieler runterfallen lassen
ENDIF
Nicht sehr Elegant aber geht ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

stimmt nich soo dolle.

Gibts da vielleicht mal ein update mit besseren Kollisionsbefehlen.

Vielleicht hat Gernot ja mal Zeit dafür.

Weil ich in paar Tagen definitiv mit Kollisionen arbeiten muss, und oben genannte Möglichkeit ist nicht das Wahre.

Kitty Hello


x-tra

Ideal wäre eine Objektbezogene Kollisionsabfrage.

Vielleicht sowas wie bei BB(ich weiß abkupfern is nich so dolle)

Code (glbasic) Select
COLLISIONS TypeQ, TypeZ, Methode, Reaktion
Code (glbasic) Select
TypeQ = Quell-Objekttyp, das auf Kollision überprüft werden soll
TypeZ = Ziel-Objekttyp, mit dem es kollidieren soll
Methode = Methode der Erkennung:
1=Kugel-Kugel-Kollision
2=Kugel-Polygon-Kollision
3=Kugel-Würfel-Kollision
Reaktion = Was soll bei einer Kollision passieren:
1=stopen
2=sliden (normal)
3=sliden (nur raufsliden)
sowas in der art wäre toll, so kann man jeweils einfache Abfragen starten, ob Objekt A mit allen in Frage kommenden Objekten kollidiert, und jeweils eine Entscheidung treffen, was es tun soll.

Das geht zwar wohl so auch, wäre aber meiner Meinung nach etwas simpler.


P.S. und wenn ich das hier sehe, bekomm ich ganz feuchte Augen, grins.

Code (glbasic) Select
sphere=CREATESPHERE(32)
ENTITYTYPE sphere,1
ENTITYRADIUS sphere,1
POSITIONENTITY sphere,0,11,0

cube=CREATECUBE()
ENTITYTYPE cube,2
ENTITYCOLOR cube,0,100,0
POSITIONENTITY cube,0,-5,0
SCALEENTITY cube,10,10,10

cylinder=CREATECYLINDER(32)
ENTITYTYPE cylinder,2
ENTITYCOLOR cylinder,255,0,0
POSITIONENTITY cylinder,0,7,0
SCALEENTITY cylinder,2,2,2
Träum, träum, träum....................

Kitty Hello

ah-ha!
Naja, dann macht halt mal dieses Entity System weiter. Das ist doch net so schwer, oder?
Ich pack mal mehr kommentare rein, damit ihr (Schranz0r?) das checkt.