Collisions seitlich

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

X-tra

Betreff: Collisions seitlich

BeitragMo, Jun 30, 2008 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe einen level mit bodenkollision, das funktioniert auch tadellos, aber ich habe in diesem level einen extra sockel gemacht, und da kommen wir zu meinem problem.

wie stelle ich es an, dass sowohl die seitliche kollision zur wand des sockels funktioniert, sowie wenn ich auf dem sockel genauso.

ich habe eine sprungroutine, die auf dem level funktioniert, aber der sockel ist ja einzeln, und vielleicht will ich den später noch bewegen lassen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jun 30, 2008 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
1.) Der Sockel muß dann seitlich auch Triangles haben, deren CollisionsType eingestellt ist.

2.) Wenn der Sockel sich bewegt, wird Blitz3D in den meisten Fällen die Kollision nicht registrieren. So ein Verhalten kann man aber durch etwas Mehraufwand beheben. Ob es aber Sinnvoll ist, ist eine andere Geschichte.

In meinem Beispiel muß UpdateWorld dreimal pro Schleifendurchlauf aufgerufen werden, was die ganze Sache sehr langsam macht. Bräuchte man weitere Achsen, so erhöht sich auch die Anzahl der UpdateWorld -Aufrufe.

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)
Local Camera=CreateCamera()
Local Light=CreateLight()
Local Cube1=CreateCube()
Local Cube2=CreateCube()
Local Sphere=CreateSphere(32)
Local Angle#,X#,Y#,Z#

CameraProjMode Camera,2
CameraZoom Camera,0.25

PositionEntity Camera,0,0,-6
PositionEntity Sphere,0,0,0
PositionEntity Cube1,-2.5,0,0
PositionEntity Cube2,+2.5,0,0
RotateEntity Light,60,-60,0
EntityType Sphere,1
EntityType Cube1,2
EntityType Cube2,2

Collisions 1,2,2,2
Const OffSet#=0.2




While Not KeyHit(1)
   Angle=Angle+0.5
   
   If KeyDown(203) Then MoveEntity Sphere,-0.02,0,0
   If KeyDown(205) Then MoveEntity Sphere,+0.02,0,0
   If KeyDown(200) Then MoveEntity Sphere,0,+0.02,0
   If KeyDown(208) Then MoveEntity Sphere,0,-0.02,0
   
   PositionEntity Cube1,Sin(Angle)*2-2.5,0,0
   PositionEntity Cube2,Sin(Angle)*2+2.5,0,0
   TurnEntity Cube1,0,0,0.1
   
;   UpdateWorld
   
   X=EntityX(Sphere)
   Y=EntityY(Sphere)
   Z=EntityZ(Sphere)
   
   PositionEntity Sphere,X-OffSet,Y,0:UpdateWorld
   PositionEntity Sphere,X+OffSet,Y,0:UpdateWorld
   PositionEntity Sphere,X,Y,0:UpdateWorld
   
   WaitTimer(Timer)
   RenderWorld
   
   Text 20,20,XS
   
   Flip 0
Wend
End


Von daher ist es eventuell ratsam, wenn man absolut nicht auf bewegte Zielobjekte verzichten kann und diese auf Polygonkollision reagieren müssen, auf andere Grafikengines zu wechseln. Eventuell geht das ganze aber auch mit einer Boxkollision, die ohnehin schneller ist.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

X-tra

BeitragMo, Jun 30, 2008 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
okay, mmmm wenn ich also nichts bewegen würde, sondern nur so eine statische seitliche kollision, was sollte ich dann tun?

ich hatte mir auch überlegt, da ich ja eh eine bodenkollision habe, ich meinen level so gestalte, wo diese bodenkollision nötig ist, ich als ein objekt mache.

und alles was seitlich geprüft werden müsste, eben seperat, und dann hätte ich nur noch das problem, dass ich die vorherige position immer speichern bzw. ablegen muss, und wenn eine kollision mit diesen seitenteilen erfolgt, die vorherige x und z position wieder hergestellt wird.

sonst eine idee, wie du das mit den triangles meintest, weiß ich jetzt nämlich grad nicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jun 30, 2008 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du dich aller anscheinend nach bereits mit Triangles beschäftigt hast, nehme ich an, dass du weist das Triangles nur von der Grafikkarte gezeichnet werden, wenn diese von der Kamera aus gesehen im uhrzeigersinn gezeichnet werden (das gilt natürlich nur, wenn EntityFX nicht auf +16 gestellt ist). Nun stelle dir genau dieses ''Verhalten'' so vor, als würde von einem Objekt (z.B. Entityradius) aus gesehen nur auf diese seite der Fläche eine Kollisions statt finden können. Wenn du nun in einem Game eine Fläche hast, wo drauf der Spieler rumlaufen kann, so kann dieser Spieler aber immer noch von unten aus da durch springen um anschliessend auf dieser zu landen. Das gilt auch von einem Sprung von der Seite >+/ <- 90°. Wenn man das verhindern will, muß man eben um einen solchen Block eben Triangles rum zeichnen, damit dieser Block eben eine geschlossene Einheit entspricht.

Ausserdem kann keine Kollision statt finden wenn das zu kollidierende Objekt das Frame zuvor sich innerhalb einer solcher Fläche befindet. Also bereits von unten einer solchen Plattform gekommen, dann innen drin sich befindet und anschliessend wieder nach unten fällt. Es muß also zuerst die Schwelle über der Kollisionsfläche passieren, damit es beim runter fallen da drauf landen kann. Daher sollte man so eine Plattform ähnlich wie ein Cube erstellen, wo eben keine ''Eindringmöglichkeit'' sich befindet. Damit unterscheiden sich die Kollisionen unter Blitz3D von BlitzBasic, da unter BlitzBasic eine Kollision eine tatsächliche Kollision ist, während unter Blitz3D eine Kollision nur von der Bewegung aus statt findet. Dafür erkennt die Blitz3D -Kollisione auch solche, die pro Frame eine so große Bewegungsschrittweite haben, da in keinem Frame selbst eine Kollision stattfindet, sondern eine rein berechnete. Unter BlitzBasic würden solch starke Bewegungen garnicht registriert, sondern einfach überflogen werden.

Leider unterstützt Blitz3D keine Polygonkollision, wenn sich das Zielobjekt selbst auf das zu kollidierende bewegt. Mit meinem Code da oben habe ich aber genau dieses zu verhindet versucht, was aber als Endspiellösung nicht zu gebrauchen ist, da es zu langsam wird mit 5 Updateworld -Aufrufen/Frame bei einem 2D Game und 7 mal bei 3D. Ich kann dir jetzt aber nicht mit Bestimmtheit sagen, dass dieses Problem auch bei EntityRadius auf EntityBox so ist. Da gilt es ausprobieren. Ich habe das noch nicht ausprobiert, da ich es auch bisher noch nie gebraucht hatte.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

X-tra

BeitragDi, Jul 01, 2008 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ach, jetzt weiß ich, aber bin mir nicht sicher, ob wir gerade aneinander vorbeireden.

du meinst, dass ich an der seite einer solchen plattform auch eine kollisionsprüfung machen soll und eben diesen seitenteilen einen typ zuweisen muss.

problem ist, dass ist ein komplettes objekt, also oben, wo ich drauf stehen will, und seitlich, ist das gleiche, wobei ja seitlich nicht das gleiche ist wie oben, da ja an der seite wenn ich gerade daneben stehe, keine gravitation vorhanden ist, zumindest nicht gegen dieses seitenteil.

also wäre nur die option deckfläche oben, und seitenteile als seperate objekte bauen und laden und ansprechen.

das mit den triangles hab ich trotzdem nicht verstanden, also was sie sind schon, und mit dem von einer seite begehbar, okay, aber ich hab den kompletten sinn mit meinem problem nicht kapiert, oder stell ich mich zu blöd an?

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group