racing game - fahrzeug collision mit hauswand

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

AmyS3

Betreff: racing game - fahrzeug collision mit hauswand

BeitragMo, Apr 04, 2011 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal,

ich fange den thread mal so an wie jeder andere neuling Smile

ich hab da ein problem..... XD

wie der titel schon sagt, hab ich son paar probleme wenn es um die collision zwischem einem fahrzeug (in diesem fall der player) und einer hauswand(oder aehnliches) geht.


kurze vorabinfo: ich nehme hier die driver demo/sample von mak als beispiel, mit einem .3ds modell einer stadt anstelle des normalen terrains/ heightmap und einem .3ds modell fuer das fahrzeug statt dem car.x


wenn ich also mit dem fahrzeug gegen eine wand fahre dann taucht es erstmal fast bis zur haelfte in die wand ein und slided dann erst mehr schlecht als recht an ihr entlang.

zudem scheint die collision sich eher nach den wheels zu richten statt dem fahrzeug selbst.

in den collisions abschnitt steht aber das fahrzeug korrekt drinn.

ich habe als workaround nun 12 spheren rund um das fahrzeug positioniert, mit etwas abstand zum boden da der ja auch wie eine wand wirkt, und in den collisions mit eingetragen.

das geht einigermassen aber ist nicht wirklich das gelbe vom ei.

hier mal die collisions definitionen(bumper sind die 12 spheren):
Code: [AUSKLAPPEN]
Collisions BUMPER,SCENE,2,3
Collisions BODY,BUMPER,2,3
Collisions BODY,SCENE,2,3
Collisions WHEEL,SCENE,2,3


kann mir irgendwer ein wenig nachhelfen? stehe irgendwie voll aufm schlauch.

und ja ich hab die forensuche schon betaetigt und auch onkel google habsch angequatscht...


p.s.: meine englische tastertur hat keine umlaute... sry - und ja ich gebs zu ich bin nen b3d noob.. aber alle haben mal klein angefangen...

vielen dank im vorraus.


hier mal der ganze source als download virengeprueft und lauffaehig mit b3d.
ist meiner meinung nach ziemlich gut kommentiert und aufgeraumt.
www.amys3.de/b3d/driver_edited.rar
Aktuelles Projekt:
Bullet Racer
Racing Game / Ego-Shooter
Fortschritt: ca. 11%

ZaP

BeitragMo, Apr 04, 2011 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dein Kollisionskonzept ist nicht so ganz ausgereift; Dadurch, dass die Gravitation immer auf das Fahrzeug wirkt, gibt es auch immer eine Kollision mit dem Levelmesh, so kannst Du nicht richtig Kollisionen abfragen. Du könntest z.B. mit den Kollisionsnormalen (CollisionNX etc) oder LinePick arbeiten, um zu ermitteln, ob das Fahrzeug gegen eine Wand prallt, oder gegen den Boden.

Das Fahrzeug selbst fährt zur hälfte in die Wand rein, weil die Bumper zwar Kollidieren, aber das Fahrzeug weiterfährt (speed# müsste dann ja auf <= 0.0 gesetzt werden), denn die Bumpers sind nur Children. Das Fahrzeug selbst müsste soweit ich das beurteilen kann den Radius 1.0 haben.
Starfare: Worklog, Website (download)

AmyS3

BeitragMo, Apr 04, 2011 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
danke fuer deine antwort, aber ich bin noch ned so firm mit b3d was das linepick und so betrifft.

zudem der speed soll ruhig bleiben und an der wand entlang sliden ist auch ok.

p.s: die bumper bleiben trotz gravity immer ueber dem boden da sie staendig zurueckgesetzt werden

ich hab mal das hier testweise zusammengeschustert und versuche es mit entitycollidet...

funzt auch irgendwie, aber ist zu ruckelig und das teil bleibt manchmal an der wand kleben und/oder beschleunigt einfach in eine x-beliebige richtung.. o_0

den code hier kann man einfach per copy paste in b3d einfuegen und starten.

waehre toll wenn du(bzw jeder) dir das mal anguggen koenntest und nen tip geben kannst was man besser machen kann.


edit: weiss ned ob ich mein problem wirklich richtig beschrieben habe... vill. hat schon jemand geguggt mit ner simplen loesung aber das problem nicht erkannt Smile

also: ich versuche zu erreichen das das playermodell ned in einer wand eintaucht, und wen es schraeg an eine wand faehrt sich das model dreht und dann hoechstens mit der seite an der wand entlangslided...
wenn man frontal an die wand klatscht sollte das model schon stehenbleiben.
aber so 100%ig frontal kann keiner an ne wand fahren. es gibt immer eine abweichung..
waehre super wenn man da irgendwie nen margin einberechnen koennte nach dem motto: wenn abweichung Xgrad von frontal dann drehen und geschwindigkeit beibehalten/verlangsamen oder speed=0

Code: [AUSKLAPPEN]
;name for the app
AppTitle "bumpertest"

;load graphic mode
Graphics3D 800,600,32,2
SetBuffer BackBuffer()

;globals
Global speed#=0
Const GRAVITY#=-.3
Const force#=.97
Const BODY=1,BUMPER=2,SCENE=10

;collisions
Collisions BODY,SCENE,2,3
Collisions BUMPER,SCENE,2,2

;load world
world=CreatePlane()
ScaleEntity world,100,1,100
PositionEntity world,0,0,0
EntityType world,SCENE
EntityColor world,123,123,123

;create hurdle
hurdle=CreateCube()
FitMesh hurdle,-20,-15,-30,80,30,60
PositionEntity hurdle,40,0,40
EntityType hurdle,SCENE
EntityColor hurdle,123,223,123

;create player
player=CreateCube()
FitMesh player,-2,-0.5,-4,4,1,8
PositionEntity player,10,10,10
EntityType player,BODY
   
;make bumpers
bumperfl=CreateSphere(8,player)
EntityType bumperfl,BUMPER

bumperbl=CreateSphere(8,player)
EntityType bumperbl,BUMPER

bumperfr=CreateSphere(8,player)
EntityType bumperfr,BUMPER

bumperbr=CreateSphere(8,player)
EntityType bumperbr,BUMPER


;cam and light
light=CreateLight()
TurnEntity light,45,45,0

camera=CreateCamera(player)
CameraClsColor camera,0,128,255
PositionEntity camera,0,5,-15

;start the mainloop
While Not KeyHit(1)
   ;position and reposition the bumpers
   PositionEntity bumperfl,-2,1,4
   PositionEntity bumperbl,-2,1,-4
   PositionEntity bumperfr,2,1,4
   PositionEntity bumperbr,2,1,-4
   
   ;check for bumper collision
   If EntityCollided( bumperfl,SCENE ) Then
      TurnEntity player,0,-3,0
      TranslateEntity player,0.3,GRAVITY,0
   EndIf
   
   If EntityCollided( bumperbl,SCENE ) Then
      TurnEntity player,0,3,0
      TranslateEntity player,0.3,GRAVITY,0
   EndIf
   
   If EntityCollided( bumperfr,SCENE ) Then
      TurnEntity player,0,3,0
      TranslateEntity player,-0.3,GRAVITY,0
   EndIf
   
   If EntityCollided( bumperbr,SCENE ) Then
      TurnEntity player,0,-3,0
      TranslateEntity player,-0.3,GRAVITY,0
   EndIf
   
   ;move the player
   If KeyDown(203) TurnEntity player,0,3,0
   If KeyDown(205) TurnEntity player,0,-3,0
   
   If KeyDown(200)
      speed=speed+.02
      If speed>2.7 speed=2.7
   Else If KeyDown(208)
      speed=speed-.02
      If speed<-1.5 speed=-1.5
   Else
      speed=speed*force
   EndIf
   MoveEntity player,0,GRAVITY,speed
   TranslateEntity player,0,GRAVITY,0
   
UpdateWorld
RenderWorld
Flip()
Wend
End
Aktuelles Projekt:
Bullet Racer
Racing Game / Ego-Shooter
Fortschritt: ca. 11%

ZaP

BeitragMo, Apr 04, 2011 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du die Zeile BlitzBasic: [AUSKLAPPEN]
EntityRadius player,MeshWidth(player),MeshHeight(player)
hinzufügst, läuft es eigentlich ziemlich gut. Dadurch fährt das Fahrzeug nicht mehr in die Wand, weil der Kollisionsradius vergrößert wird.
Die beschriebenen Aufprallwinkel kriegt man wohl am besten mit CollisionNX/NY/NZ hin, sieh dir am besten mal das Beispiel dazu an. Wenn ich mich nicht irre, muss man nur den Schnittwinkel der Kollisionsnormale und des Richtungsvektors vom Fahrzeug errechnen, dann kann man bequem abfragen, ob z.B. eine Frontalkollisions vorliegt (-15° < Winkel < 15° in etwa).
Starfare: Worklog, Website (download)

AmyS3

BeitragMo, Apr 04, 2011 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
dank dank dank!!!!

habs grade getestet, und funzt wirklich gut.

aller herzlichsten dank!

den befehl kannte ich noch ned. aber naja bin ja noch in den kinderschuhen Smile

villeicht sollte mann nen kleines tut dafuer machen mit nem sauber kommentierten sample code damit jeder der grade erst angefangen hat es schnell und einfach kapiert.
so ein befehl ist gold wert!!!

nochmals danke

edit: ich hab grad gesehen das den befehl schon verwendet hab, aber hab ned so wirklich gewust was ich da tu Wink
Aktuelles Projekt:
Bullet Racer
Racing Game / Ego-Shooter
Fortschritt: ca. 11%

ZaP

BeitragMo, Apr 04, 2011 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest einfach die Hilfe nach Kategorien geordnet durchstöbern: Hier steht z.B. alles, was es zu Kollisionen zu wissen gibt Wink
Starfare: Worklog, Website (download)

AmyS3

BeitragMo, Apr 04, 2011 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Smile
werde ich mich auf jedenfall mit beschaeftigen, da ich noch mehr mit collisionen machen muss...

z.b.: der player soll weggeschoben werden wenn er von einem anderen objekt/player/bot getroffen wird.
natuerlich in die entgegengesetzte richtung des aufpralls Wink

aber dein tip mit dem entityradius hat mir schonmal seht weitergeholfen.
ich wusste ned das ich den so anwenden kann.

nun muss ich aber die raeder ander positionieren damit mein player model auch smooth ne rampe hochfahren kann statt erstmal anzuecken Wink


so ich mach mich dann mal in die heia.. hab nachtschicht :/

cya
Aktuelles Projekt:
Bullet Racer
Racing Game / Ego-Shooter
Fortschritt: ca. 11%

AmyS3

BeitragDi, Apr 05, 2011 7:35
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich hab das jetzt mal etwas genauer angeguggt (ne nich die linpick ect sachen... aber die auch...)
und musste feststellen das das mit dem entityradius im player modell ned funzt, da das model wenn es auf einer schraegen steht an einer horizontalen wand hochklettert wenn man die trifft...

und da ich die entitycollided funktion schon so ausgiebig benutzt habe, dachte ich mir:
"ok wenn es mit 12 spheren um das model herum ned richtig will, dann eben mit 12 spheren und 4 cubes Smile"

sprachs und hab die spheren mal besser angeordnet und noch die cubes dazugewuerfelt.
den entityradius tip vom zap hab ich natuerlich mit eingebaut und bin mit dem endergebnis soweit erstmal zufrieden.

das model kann entsprechend flache schraegen hochfahren aber keine waende. soweit schonmal supi!

aber da muss noch an der feinarbeit gefeilt werden, denn es ruckelt manchmal doch ganz schoen arg...
und ruckeln soll ned sein.

villeicht hat ja jemand ne bessere idee oder gar loesung die er/sie mir auf noobisch erzahlt damit ichs auch kapiere Wink
oder nen verbesserungsvorschlag anhand des code.
mit nem beispiel waehre goettlich, ist aber nicht pflicht Smile

und eigentlich muss es doch das schon geben, oder muss ich das rad neuerfinden.. (ok ich weiss.. super training, ist aber doch nervig...)


ich poste an dieser stelle mal den aktuellen code und die dazugehoerige .x datei fuers terrain.
(ned lachen die .x datei ist in 10 minuten entstanden und dient nur zum test.. aber wer will kann sie gerne geschenkt haben XD)

www.amys3.de/b3d/testground.x
die .x datei ist 157kb nur so als info..

vor dem code noch schnell nen screenshot
user posted image

hier der code
BlitzBasic: [AUSKLAPPEN]
;name for the app
AppTitle "bumpertest"

;load graphic mode
Graphics3D 800,600,32,2
SetBuffer BackBuffer()

;globals
Global wheelfl#,wheelfr#,wheelbl#,wheelbr#,player,zx#,zy#,zz#
Global speed#=0
Const GRAVITY#=-.13
Const force#=.97
Const wheelalpha#=0.4
Const bumperalpha#=0.6
Const playeralpha#=0.2
Const BODY=1,BUMPER=2,WHEEL=3,SCENE=10

;collisions
Collisions BODY,SCENE,2,3
Collisions BUMPER,SCENE,2,2
Collisions WHEEL,SCENE,2,2

;load world
world=LoadMesh( "testground.x" )
ScaleEntity world,25,25,25
PositionEntity world,40,0,-40
EntityType world,SCENE
EntityPickMode world,2


;create player
player=CreateCube()
FitMesh player,-3,-0.5,-4,6,1.5,8
PositionEntity player,20,10,20
EntityAlpha player,playeralpha
EntityType player,BODY


createwheels()


;cam and light
light=CreateLight()
TurnEntity light,45,45,0

camera=CreateCamera(player)
CameraClsColor camera,0,128,255
PositionEntity camera,0,10,-15

;make bumpers
;bumper front
bumperf=CreateCube(player)
FitMesh bumperf,-1.5,-0.5,-1.5,3,1,3
EntityAlpha bumperf,bumperalpha
EntityRadius bumperf,MeshWidth(bumperf),0.5
EntityType bumperf,BUMPER

;bumper back
bumperb=CreateCube(player)
FitMesh bumperb,-1.5,-0.5,-1.5,3,1,3
EntityAlpha bumperb,bumperalpha
EntityRadius bumperb,MeshWidth(bumperb),0.5
EntityType bumperb,BUMPER

;bumper left
bumperl=CreateCube(player)
FitMesh bumperl,-1.5,-0.5,-1.5,3,1,3
EntityAlpha bumperl,bumperalpha
EntityRadius bumperl,MeshWidth(bumperl),0.5
EntityType bumperl,BUMPER

;bumper right
bumperr=CreateCube(player)
FitMesh bumperr,-1.5,-0.5,-1.5,3,1,3
EntityAlpha bumperr,bumperalpha
EntityRadius bumperr,MeshWidth(bumperr),0.5
EntityType bumperr,BUMPER

; bumper-group front left
bumperfll=CreateSphere(8,player)
ScaleEntity bumperfll,0.5,0.5,0.5
EntityRadius bumperfll,0.5
EntityAlpha bumperfll,bumperalpha
EntityType bumperfll,BUMPER

bumperflc=CreateSphere(8,player)
ScaleEntity bumperflc,0.5,0.5,0.5
EntityRadius bumperflc,0.5
EntityAlpha bumperflc,bumperalpha
EntityType bumperflc,BUMPER

bumperflf=CreateSphere(8,player)
ScaleEntity bumperflf,0.5,0.5,0.5
EntityRadius bumperflf,0.5
EntityAlpha bumperflf,bumperalpha
EntityType bumperflf,BUMPER

;bumper-group front right
bumperfrl=CreateSphere(8,player)
ScaleEntity bumperfrl,0.5,0.5,0.5
EntityRadius bumperfrl,0.5
EntityAlpha bumperfrl,bumperalpha
EntityType bumperfrl,BUMPER

bumperfrc=CreateSphere(8,player)
ScaleEntity bumperfrc,0.5,0.5,0.5
EntityRadius bumperfrc,0.5
EntityAlpha bumperfrc,bumperalpha
EntityType bumperfrc,BUMPER

bumperfrf=CreateSphere(8,player)
ScaleEntity bumperfrf,0.5,0.5,0.5
EntityRadius bumperfrf,0.5
EntityAlpha bumperfrf,bumperalpha
EntityType bumperfrf,BUMPER

;buper-group back left
bumperbll=CreateSphere(8,player)
ScaleEntity bumperbll,0.5,0.5,0.5
EntityRadius bumperbll,0.5
EntityAlpha bumperbll,bumperalpha
EntityType bumperbll,BUMPER

bumperblc=CreateSphere(8,player)
ScaleEntity bumperblc,0.5,0.5,0.5
EntityRadius bumperblc,0.5
EntityAlpha bumperblc,bumperalpha
EntityType bumperblc,BUMPER

bumperblf=CreateSphere(8,player)
ScaleEntity bumperblf,0.5,0.5,0.5
EntityRadius bumperblf,0.5
EntityAlpha bumperblf,bumperalpha
EntityType bumperblf,BUMPER

;buper-group back right
bumperbrl=CreateSphere(8,player)
ScaleEntity bumperbrl,0.5,0.5,0.5
EntityRadius bumperbrl,0.5
EntityAlpha bumperbrl,bumperalpha
EntityType bumperbrl,BUMPER

bumperbrc=CreateSphere(8,player)
ScaleEntity bumperbrc,0.5,0.5,0.5
EntityRadius bumperbrc,0.5
EntityAlpha bumperbrc,bumperalpha
EntityType bumperbrc,BUMPER

bumperbrf=CreateSphere(8,player)
ScaleEntity bumperbrf,0.5,0.5,0.5
EntityRadius bumperbrf,0.5
EntityAlpha bumperbrf,bumperalpha
EntityType bumperbrf,BUMPER



;start the mainloop
While Not KeyHit(1)

PointEntity camera,player

aligntowheels()
repositionwheels()

;position and reposition the bumpers
;front and back bumpers
PositionEntity bumperf,0,1.5,2.5
PositionEntity bumperb,0,1.5,-2.5

;left and right bumpers
PositionEntity bumperl,-0.8,1.5,0
PositionEntity bumperr,0.8,1.5,0

;bumper-group front left
PositionEntity bumperfll,-3,1.5,3
PositionEntity bumperflc,-2.7,1.5,3.7
PositionEntity bumperflf,-2,1.5,4

;bumper-group front right
PositionEntity bumperfrl,3,1.5,3
PositionEntity bumperfrc,2.7,1.5,3.7
PositionEntity bumperfrf,2,1.5,4

;bumper-group back left
PositionEntity bumperbll,-3,1.5,-3
PositionEntity bumperblc,-2.7,1.5,-3.7
PositionEntity bumperblf,-2,1.5,-4
;bumper-group back right
PositionEntity bumperbrl,3,1.5,-3
PositionEntity bumperbrc,2.7,1.5,-3.7
PositionEntity bumperbrf,2,1.5,-4

;check for bumper collision
If EntityCollided( bumperf,SCENE ) Then
speed=-0.1
EndIf
If EntityCollided( bumperb,SCENE ) Then
speed=0.1
EndIf

If EntityCollided( bumperl,SCENE ) Then
MoveEntity player,0.6,0,0
EndIf
If EntityCollided( bumperr,SCENE ) Then
MoveEntity player,-0.6,0,0
EndIf

If EntityCollided( bumperfll,SCENE ) Then
TurnEntity player,0,-2,0
EndIf
If EntityCollided( bumperflc,SCENE ) Then
TurnEntity player,0,-4,0
EndIf
If EntityCollided( bumperflf,SCENE ) Then
TurnEntity player,0,-7,0
EndIf
If EntityCollided( bumperfrl,SCENE ) Then
TurnEntity player,0,2,0
EndIf
If EntityCollided( bumperfrc,SCENE ) Then
TurnEntity player,0,4,0
EndIf
If EntityCollided( bumperfrf,SCENE ) Then
TurnEntity player,0,7,0
EndIf

If EntityCollided( bumperbll,SCENE ) Then
TurnEntity player,0,2,0
EndIf
If EntityCollided( bumperblc,SCENE ) Then
TurnEntity player,0,4,0
EndIf
If EntityCollided( bumperblf,SCENE ) Then
TurnEntity player,0,7,0
EndIf
If EntityCollided( bumperbrl,SCENE ) Then
TurnEntity player,0,-2,0
EndIf
If EntityCollided( bumperbrc,SCENE ) Then
TurnEntity player,0,-4,0
EndIf
If EntityCollided( bumperbrf,SCENE ) Then
TurnEntity player,0,-7,0
EndIf


;move the player
If KeyDown(203) TurnEntity player,0,3,0
If KeyDown(205) TurnEntity player,0,-3,0

If KeyDown(200)
speed=speed+.02
If speed>2.7 speed=2.7
Else If KeyDown(208)
speed=speed-.02
If speed<-1.5 speed=-1.5
Else
speed=speed*force
EndIf
MoveEntity player,0,GRAVITY,speed
TranslateEntity player,0,GRAVITY,0



UpdateWorld
RenderWorld

Text 10,10, "Speed: "+speed

Flip()
Wend
End




Function createwheels() ;does what it says
wheelfl=CreateSphere(8,player)
EntityRadius wheelfl,1
EntityAlpha wheelfl,wheelalpha
EntityType wheelfl,WHEEL
wheelfr=CreateSphere(8,player)
EntityRadius wheelfr,1
EntityAlpha wheelfr,wheelalpha
EntityType wheelfr,WHEEL
wheelbl=CreateSphere(8,player)
EntityRadius wheelbl,1
EntityAlpha wheelbl,wheelalpha
EntityType wheelbl,WHEEL
wheelbr=CreateSphere(8,player)
EntityRadius wheelbr,1
EntityAlpha wheelbr,wheelalpha
EntityType wheelbr,WHEEL
End Function

Function aligntowheels() ;does what it says
zx#=(EntityX( wheelfr,True )+EntityX( wheelbr,True ))/2
zx=zx-(EntityX( wheelfl,True )+EntityX( wheelbl,True ))/2
zy#=(EntityY( wheelfr,True )+EntityY( wheelbr,True ))/2
zy=zy-(EntityY( wheelfl,True )+EntityY( wheelbl,True ))/2
zz#=(EntityZ( wheelfr,True )+EntityZ( wheelbr,True ))/2
zz=zz-(EntityZ( wheelfl,True )+EntityZ( wheelbl,True ))/2
AlignToVector player,zx,zy,zz,1

zx#=(EntityX( wheelfl,True )+EntityX( wheelfr,True ))/2
zx=zx-(EntityX( wheelbl,True )+EntityX( wheelbr,True ))/2
zy#=(EntityY( wheelfl,True )+EntityY( wheelfr,True ))/2
zy=zy-(EntityY( wheelbl,True )+EntityY( wheelbr,True ))/2
zz#=(EntityZ( wheelfl,True )+EntityZ( wheelfr,True ))/2
zz=zz-(EntityZ( wheelbl,True )+EntityZ( wheelbr,True ))/2
AlignToVector player,zx,zy,zz,3
End Function

Function repositionwheels() ;does what it says
PositionEntity wheelfl,-2.2,-1.5,3.3
PositionEntity wheelfr,2.2,-1.5,3.3
PositionEntity wheelbl,-2.2,-1.5,-3.3
PositionEntity wheelbr,2.2,-1.5,-3.3
End Function
Aktuelles Projekt:
Bullet Racer
Racing Game / Ego-Shooter
Fortschritt: ca. 11%

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group