Gravitation und Kollision

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Scope

Betreff: Gravitation und Kollision

BeitragSo, Feb 12, 2006 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe folgendes Problem:
Ich möchte gern ein Grundgerüst für ein Ego shooter aufbauen.
ich habe einen Pivot, der für die kollisionsabfrage mit dem Boden zuständig ist und auf dessen position auch die Kamera ist.
Springen ducken klappt ganz gut, auch dass er nicht durch den Boden fällt.
Problem ist jetzt das agieren mit objekten, sprich auf kisten springen, von kisten runterfallen etc.
wie packe ich das am besten an? gibt es da tricks, wie man das am besten machen sollte, mit zusätzlichen Pivots o.ä.?
meine hauptsächlichen probleme sind, die abfrage, ob sich der spieler wirklich auf dem boden befindet, oder ob er nicht gerade fällt und dabei an der mauer entlang schrammt. ich muss erkennen, wann ich das Springen freigeben kann und wann der player wie gesagt nur fällt.
wenn es in der richtung irgendwas hilfreiches gibt wär ich sehr dankbar Smile
viele Grüße

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Feb 12, 2006 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Frag doch einfach ab, ob der Spieler sich hoch/runter bewegt.
Wenn das der Fall ist, ist er in der Luft und kann nicht springen...

EDIT:
Aber dann könnte man auch springen, wenn man garde den höchsten Punkt im Sprung ereicht hat Confused
Hmm...
Muss dafür ne andere Lösung geben
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Scope

BeitragSo, Feb 12, 2006 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ist richtig, so wie ich es jetzt gemacht hab, kann man sich neben ne wand stellen und "hoch" springen (die wand ist wesentlich größer als der spieler ^^)
ich dachte an sowas wie verschiedene "sensoren" (pivots) um den spieler, die abfragen, ob er irgendwo an der seite kollidiert oder nur unten oder so.
gäbs da in der richtung ne möglichkeit?
 

HW

BeitragSo, Feb 12, 2006 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Da gibts gewisse Befehle, die die Kollisionskoordinaten an den Normalen zurückliefern: ql:collisionnx etc.
Damit kann man also herausfinden, von wo aus kollidiert wurde.
 

Scope

BeitragSo, Feb 12, 2006 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
alles klar danke, ich werds probiern

lucifer

BeitragSo, Feb 12, 2006 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Linepick kannst du leicht ermitteln ob der Spieler auf dem Boden steht oder nicht.
Aktuelles Projekt:
Demonspawn
RPG
 

Scope

BeitragSo, Feb 12, 2006 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
und wie? Smile
ich möchte ja nicht den "boden" also boden definieren, sondern auch bzw von einer auf ne andere kiste springen beispielsweise. dann ist die erste kiste ja auch "boden", sprich man kann von ihr abspringen.
wie meinst du da kommt man mit linepick weiter?
 

HW

BeitragSo, Feb 12, 2006 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, für den Boden ist das mit ql:linepick eventuell schon geeignet. Aber nicht für Kisten etc.
 

Scope

BeitragSo, Feb 12, 2006 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
dann bringts mir nich viel, sry Wink trotzdem danke
 

HW

BeitragSo, Feb 12, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber so viel ich weiß, würde LinePick auf dem Boden auch nicht viel bringen. Es prüft ja nur eine Linie, da kann es wohl kaum eine Ebene, geschweige denn ein Terrain, prüfen.

Was übrigens das mit der Kollision angeht:
Die Richtung der Kollision kann man an den Normalen so erkennen:
Positive X Koordinate Arrow Rechts
Positive Y Koordinate Arrow Oben
Positive Z Koordinate Arrow Vorne
Bei negativen Koordinaten ist es dementsprechend umgekehrt.
 

Scope

BeitragSo, Feb 12, 2006 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
mh ich versuchs grad mit ner box, die am "gelände" kollidieren soll. das tut sie auch, aber nur mit dem mittelpunkt der box, sprich die box fährt bis zur hälfte ins terrain rein. wenn ichs mit entityradius mach gehts, mit entitybox nicht. Radius bringt mir ja nichts, da die figur normal größer als breit ist.
ich poste mal nen beispiel code, kann mir jemand sagen, wieso die box zur hälfte in der wand verschwindet?
Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
Boden=CreatePlane()
EntityColor boden,100,200,200
Global sun=CreateLight(2)
MoveEntity sun,100000,100000,-140000
LightColor sun,255,200,100
LightRange sun,200000
PointEntity sun,boden
pivcam=CreatePivot()
PositionEntity pivcam,100,100,100
cam=CreateCamera()
box=CreateCube()
box1=CreateCube()
ScaleEntity box,10,100,10
ScaleEntity box1,1000,1000,10
PositionEntity box,200,100,100
PositionEntity cam,EntityX(pivcam),EntityY(pivcam),EntityZ(pivcam)
EntityBox box,-5,-50,-5,10,100,10
EntityType box,1
EntityType box1,2

Collisions 1,2,2,3
While Not KeyHit(1)
   PositionEntity cam,EntityX(box),EntityY(box)+150,EntityZ(box)
   speedz=0
   speedx=0
   If KeyDown(17) Then speedz=1
   If KeyDown(30) Then speedx=-1
   If KeyDown(31) Then speedz=-1
   If KeyDown(32) Then speedx=1
   MoveEntity box,speedx,0,speedz
   pitch = EntityPitch(cam)
   yaw = EntityYaw(pivcam)
   pitch = pitch + MouseYSpeed()*0.3
   yaw = yaw - MouseXSpeed()*0.3
   If pitch < -80 Then pitch = -80
   If pitch > 80 Then pitch = 80
   RotateEntity pivcam,0,yaw,0
   RotateEntity cam, pitch, yaw,0
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   UpdateWorld
   RenderWorld
   Flip
Wend

das farbige ist der boden. man schwebt immer über dem block, kann sich aber mit der maus umschaun. mit WASD bewegt man den block. wenn man ihn jetzt in die wand fährt sieht man den effekt, den ich mein.
(wenn man den collisionstyp von 2 auf 3 stellt fährt er ganz durch)
 

HW

BeitragSo, Feb 12, 2006 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das kann ich mir nur so erklären, dass die Kollisionsbox falsch angelegt ist. Man bräuchte also etwas, um die Kollisionsboxen sichtbar zu machen. DC hat das ja in der Alpha von Stranded 2 geschafft. Ich frag ihn mal.
 

Scope

BeitragSo, Feb 12, 2006 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
wäre nett, danke.
 

HW

BeitragSo, Feb 12, 2006 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit der Frage hat sich erledigt. Du erstellst einen weiteren Cube und skalierst ihn mit ql:fitmesh auf die Größe der Entitybox.

Edit: Jetzt habe ich es verstanden. Du hast das mit der Kollision etwas falsch gemacht. Du solltest deine Entities besser benennen, damit man ihre Funktion besser erkennen kann. Wenn ich das richtig sehe, ist die Entity "box" die Kiste und "box1" die Wand. Das ist zu missverständlich.
Naja, das eigentliche Problem: Du hast die Kollision falsch eingestellt. Die Kiste, die als Quelltyp der Kollision eine Kollisionskugel benötigt, hat eine Kollisionsbox. Daher wird eine Standardkugel verwendet, die äußerst klein ist, was dazu führt, dass erst in der Mitte der Kiste eine Kollision stattfindet. Du musst also für mindestens ein Mesh eine Kugel nehmen, oder du verwendest das viel zu langsame ql:meshesintersect .

Außerdem würde ich dir raten, den Code übersichtlicher zu gestalten. Ein paar geschickt plazierte Zeilenbrüche und passend formulierte Kommentare helfen so einiges beim Verständnis des Codes.
  • Zuletzt bearbeitet von HW am So, Feb 12, 2006 16:28, insgesamt einmal bearbeitet
 

Scope

BeitragSo, Feb 12, 2006 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ja stimmt. steht auch in der befehlsreferenz so drin. aber wie bringe ich nun eine bewegte "box" dazu an einem terrain zu kollidieren?
mit ner Kugel-irgendwas kollision ist das ja dann scheinbar nicht möglich.
 

HW

BeitragSo, Feb 12, 2006 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du gibst einfach dem Terrain/der Plane einen Kollisionstyp und stellst die Kollision ein. Da das Terrain genau wie die Wand ein Umgebungsobjekt ist, könnte man auf die Idee kommen, denselben Kollisionstyp für beide zu verwenden.

Eventuell gibst du der Kiste einen Kollisionsradius und stellst dann die Kollision auf Kugel:Poligon.
 

Scope

BeitragSo, Feb 12, 2006 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ja so geht das auch, blos dass der die box jetzt vollkommen "ignoriert" und statt dessen eine kugel gegen die wand setzt. bringt mir blos nichts, da der player nunmal keine kugel ist.
 

HW

BeitragSo, Feb 12, 2006 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hä? Ich verstehe kein Wort. Drücke dich bitte etwas genauer aus.
Was redest du denn auf einmal vom Player? Ich weiß gar nicht, was du mit Player überhaupt meinst. Die Kamera oder die Kiste unter der Kamera? Oder gibts da noch was?
 

Scope

BeitragSo, Feb 12, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
achso entschuldigung, bezog sich auf mein eigentliches Problem siehe mein ersten Post. Ich versuche ein egoshooter grundgerüst erstmala aufzu bauen. sprich man soll laufen, springen, sich ducken usw können.
dazu dachte ich ist der "player" (die figur) eine Box, welche eben mit der welt kollidieren kann. mein problem war jetzt, dass ich beispielsweise wissen muss, ob der player mit "den füssen auf dem boden" steht, oder "nur" gerade von einer Kiste springt und dabei die kiste an der seite tuschiert. Habs oben ja schon mal geschrieben. und dafür ist eine Kugel als Spielfigur-collisions-dummy imo nicht geeignet
 

HW

BeitragSo, Feb 12, 2006 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha. Benutz halt einen Kollisionsradius statt einer Kollisionsbox für den Spieler. Ist doch gar nichts dabei.
Wieso soll eine Kugel nicht geeignet sein? Man muss sie nur richtig einstellen, dann klappts auch.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group