kollisionen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

aasgeier

Betreff: kollisionen

BeitragFr, Jan 02, 2004 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo weiß jemand wie man in bb3d bestimmen kann, dass zwei meshs/entitys/wasauchimmers kollidieren und ihre positionen anschließend beibehalten, sich aber nicht überschneiden??

danke schonmal im voraus

aasgeier

Jolinah

BeitragFr, Jan 02, 2004 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;Kollisions ID's
Const PLAYER = 1
Const SONSTIGES = 2

sphere1 = CreateSphere(16)
EntityColor sphere1,255,0,0
EntityType sphere1, PLAYER     ;ID setzen (PLAYER = 1)
PositionEntity sphere1,0,0,10

sphere2 = CreateSphere(16)
EntityColor sphere2,0,0,255
EntityType sphere2, SONSTIGES  ;ID setzen (SONSTIGES = 2)
PositionEntity sphere2,0,0,20

cam = CreateCamera(sphere1)
PositionEntity cam,0,3,-10

AmbientLight 200,200,200

While Not KeyHit(1)
Cls

If KeyDown(203) Then TurnEntity sphere1,0,1,0
If KeyDown(205) Then TurnEntity sphere1,0,-1,0

If KeyDown(200) Then MoveEntity sphere1,0,0,0.5
If KeyDown(208) Then MoveEntity sphere1,0,0,-0.5

;Objekte auf Kollision prüfen (parameter 1 + 2 = Kollisions ID)
;(parameter 3 = Art der Kollision, 1 = Sphere to Sphere, siehe onlinehilfe)
;(parameter 4 = Reaktion, 1 = Stop, 2 = Slide usw.. siehe onlinehilfe)
Collisions PLAYER,SONSTIGES,1,1

UpdateWorld
RenderWorld
Flip
Wend

End



Für jedes Objekt eine Kollisions ID setzen.

Der Collisions Befehl überprüft dann auf Kollision, mehr muss man nicht machen.

Toby

Betreff: Und wie kann man die Kollision abfragen?

BeitragFr, Jan 02, 2004 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie kann man die Kolision abfragen? Von zwei Entitys?
(Das hab' ich in 2D schon nicht kapiert. Ich glaub ich kapiers nie Embarassed )

If "Colisionbefehl?" entity1,entity2 Then ...

Gibt's so was ?? Bestimmt oder!?
Member of
Terra Multimedia
 

IonPainter

BeitragFr, Jan 02, 2004 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
? entitycollided ?
 

BurningSoul

BeitragFr, Jan 02, 2004 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo , bin auch noch noob aber kann Dir helfen glaub ich !
Der code von jolianah löst Dein problem eigentlich schon,
der collisionsbefehl sorgt dafür ,das die beiden objekte player und sonstige , wenn sie sich berüren , stoppen ... das tun sie , wenn du collisoins() in jeder frame abfragst ,ganz automatisch, und es ist dabei auch egal,
mit welcher der bewegungsmethoden du die objekte bewegst - sei es mit moveentity, translateentity , oder gar positionentity ...

jetzt willst du aber noch speziellen code einfügen für die kollisoin ?
okay - hierfür hab ich die passende antwort :

Zitat:



function checkcollisions ()
;player muss ein entity sein
;numcols ist ein integer ,der lokal gebraucht wird , um die anzahl der kollisoinen zu zählen
;ent ist ein zeiger auf einen Entity , und zwar immer auf den , mit dem player gerade kollidiert ist ...
; ist zb player mit gegner1,gegner2,und gegner 3 kollidiert , dann wird der code 3 mal ausgeführt ,einmal mit gegner 1 , dann mit 2 ,und dann mit 3
;
; da ,wo ich code hingeschrieben habe, kannst Du dann beliebig mit den beiden objekten arbeiten , zb ihre position verändern, oder was auch immer Smile
; viel spass damit - und - ich sagte es schon : ich bin auch noob ,also kein garant für fehlerfreiheit !
; @Profis : Falls ihr fehler findet korrigiert sie ruhig, davon lerne ich dann ja auch was !

numcols = CountCollisions (player)

If numcols >= 1 Then ; die erste schleife geht alle kollisoinen durch, die der Spieler durchgemacht hat seit der letzten frame !

For num = 1 To numcols
ent = CollisionEntity (player,num) ;in ent speichern wir das jeweilige objekt , das berührt wurde
; Code
; Code
; code

Next ;nächstes onjekt , mit dem player kollidiert ist !
end if

end function


dieser code ist als ergänzung gedacht für den code von meinem vorsprecher - er funzt also nicht alleine !

Jolinah

BeitragSa, Jan 03, 2004 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

ent = EntityCollided(sphere1,SONSTIGES)

;ent = 0 wenn keine Kollision stattfand
;ent = Entity welches mit sphere1 kollidierte


Der Befehl prüft in diesem Fall ob die Player Kugel mit irgend einem Entity des Typ's SONSTIGES kollidiert ist. Wie oben schon erwähnt kann man jedem Entity einen Typ zuweisen. Der Typ ist einfach eine Zahl. Damit man sich aber nicht so viele Zahlen merken muss macht man meistens Konstanten mit Namen, und setzt diese auf eine Zahl. Bei allen Kollisionsbefehlen benutzt man dann auch die Konstante. Namen kann man sich halt besser Merken. z.bsp PLAYER oder WELT oder GEGNER usw.


Und die andere Methode ist die wo BurningSoul geschrieben hat.
Ich schreib sie Trotzdem nochmal:

Code: [AUSKLAPPEN]

anzahl_kollisionen = CountCollisions(sphere1)

If anzahl_kollisionen > 0

  For i = 1 to anzahl_kollisionen
    ent = CollisionEntity(sphere1,i)
      ;Code, mit jedem Objekt das mit dem Player kollidiert ist
      ;etwas machen...
  Next

Endif


CountCollisions gibt die Anzahl der Entities zurück die mit dem angegebenen Entity Kollidieren.

Mit CollisionEntity kann man dann eines dieser Objekte (kollidierende Entities) abfragen.

Deswegen die Schleife die jedes Objekt halt durchgeht.

aasgeier

BeitragSo, Jan 04, 2004 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
erst mal danke für die hilfe!!!!

klappen diese methoden denn auch, wenn ich überprüfen will, ob ein terrain und eine kamera kollidieren?

aasgeier

BeitragSo, Jan 04, 2004 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
in euren beispielen habt ihr ja nur "einfache sachen wie würfel und so!
 

darkshadow

BeitragSo, Jan 04, 2004 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum sollte es denn nicht gehen? Bei Camera müsstest du dann aber noch einen Pivot ranhängen. Probier doch einfach erstmal aus ob es auch mit Kamera und Terrain geht.. Razz

Jolinah

BeitragSo, Jan 04, 2004 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht mit Kamera und Terrain.

Jedoch muss man Sphere to Polygon einstellen bei Collisions.

Code: [AUSKLAPPEN]

Collisions KAMERA,TERRAIN,2,2


Der letzte Wert kann man natürlich wie man will. 1, 2 oder 3.
 

dreamfile

BeitragSo, Jan 04, 2004 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal,
ich bin neu und habe mit 3D Game Studio rumgebastelt, dank diesen
Forum bin ich auf Blitz Basic 3D (noch Demo) umgestiegen.

Ich möchte ein Rennboot Spiel machen und mir ist aufgefallen
das bei Kollisonen immer Formen oder Bilder (image) verwendet wird.
Ich benutze als Spieler eine .3df und bekomme es nicht hin den
Player an einem anderen .3df oder .x abprallen zu lassen.

Ich habe auch schon alle Codes hier ausprobiert aber mein Player
fährt einfach durch. Habe auch schon versucht den Player an einen
Cylinder fahren zu lassen aber ohne Erfolg.

Kann mir jemand helfen ???

Danke schon mal

Grüschen SaschaCode: [AUSKLAPPEN]

Global info1$="Driver"

Include "../start.bb"

Const GRAVITY#=-.1

Const BODY=1,WHEEL=2,SCENE=3

Collisions BODY,SCENE,2,3
Collisions WHEEL,SCENE,2,3

terr=LoadTerrain( "heightmap_256.bmp" )
ScaleEntity terr,1000/TerrainSize(terr),70,1000/TerrainSize(terr)
TerrainDetail terr,1000,True
TerrainShading terr,True
PositionEntity terr,-500,0,-500
tex=LoadTexture( "terrain-2.jpg" )
ScaleTexture tex,50,50
EntityTexture terr,tex
EntityType terr,SCENE


sound = LoadSound("0000.wav")
kanal = PlaySound(sound)



easy=LoadMesh( "easystar.x" )
ScaleMesh easy,1,1,-1
FlipMesh easy
FitMesh easy,-1.5,-1,-3,3,2,6
PositionEntity easy,100,1,0
EntityShininess easy,1
EntityType easy,BODY



car=LoadMesh( "SPD_BOAT.3DS" )
ScaleMesh car,1,1,-1
FlipMesh car
FitMesh car,-1.5,-1,-3,3,2,6
PositionEntity car,0,70,0
EntityShininess car,1
EntityType car,BODY

Global wheels[4]

cnt=1
For z#=1.5 To -1.5 Step -3
For x#=-1 To 1 Step 2
   wheels[cnt]=CreateSphere( 8,car )
   EntityAlpha wheels[cnt],.0
   ScaleEntity wheels[cnt],.5,.5,.5
   EntityRadius wheels[cnt],.5
   PositionEntity wheels[cnt],x,0,z
   EntityType wheels[cnt],WHEEL
   cnt=cnt+1
Next
Next

light=CreateLight()
TurnEntity light,45,45,0

target=CreatePivot( car )
PositionEntity target,0,5,-12

camera=CreateCamera()
CameraClsColor camera,0,128,255

speed#=0
x_vel#=0:prev_x#=EntityX( car )
y_vel#=0:prev_y#=EntityY( car )
z_vel#=0:prev_z#=EntityZ( car )

While Not KeyHit(1)

   ;align car to wheels
   zx#=(EntityX( wheels[2],True )+EntityX( wheels[4],True ))/2
   zx=zx-(EntityX( wheels[1],True )+EntityX( wheels[3],True ))/2
   zy#=(EntityY( wheels[2],True )+EntityY( wheels[4],True ))/2
   zy=zy-(EntityY( wheels[1],True )+EntityY( wheels[3],True ))/2
   zz#=(EntityZ( wheels[2],True )+EntityZ( wheels[4],True ))/2
   zz=zz-(EntityZ( wheels[1],True )+EntityZ( wheels[3],True ))/2
   AlignToVector car,zx,zy,zz,1
   
   zx#=(EntityX( wheels[1],True )+EntityX( wheels[2],True ))/2
   zx=zx-(EntityX( wheels[3],True )+EntityX( wheels[4],True ))/2
   zy#=(EntityY( wheels[1],True )+EntityY( wheels[2],True ))/2
   zy=zy-(EntityY( wheels[3],True )+EntityY( wheels[4],True ))/2
   zz#=(EntityZ( wheels[1],True )+EntityZ( wheels[2],True ))/2
   zz=zz-(EntityZ( wheels[3],True )+EntityZ( wheels[4],True ))/2
   AlignToVector car,zx,zy,zz,3
   
   ;calculate car velocities   
   cx#=EntityX( car ):x_vel=cx-prev_x:prev_x=cx
   cy#=EntityY( car ):y_vel=cy-prev_y:prev_y=cy
   cz#=EntityZ( car ):z_vel=cz-prev_z:prev_z=cz
   
   ;resposition wheels
   cnt=1
   For z=1.5 To -1.5 Step -3
   For x=-1 To 1 Step 2
;      PositionEntity wheels[cnt],0,0,0
;      ResetEntity wheels[cnt]
      PositionEntity wheels[cnt],x,-1,z
      cnt=cnt+1
   Next
   Next

   ;move car
   If KeyDown(203) TurnEntity car,0,1.5,0
   If KeyDown(205) TurnEntity car,0,-1.5,0
    If KeyDown(28) PlaySound(sound)
   If KeyDown(28) StopChannel(kanal)

   If EntityCollided( car,SCENE )
      If KeyDown(200)
         speed=speed+.02
      If speed>2 speed=3


      Else If KeyDown(208)
         speed=speed-.02
         If speed<-.2 speed=-.2
      Else
         speed=speed*.9
      EndIf
      MoveEntity car,0,0,speed
      TranslateEntity car,0,GRAVITY,0
   Else
      TranslateEntity car,x_vel,y_vel+GRAVITY,z_vel
   EndIf

   ;update camera
   If speed>=0   
      dx#=EntityX( target,True )-EntityX( camera )
      dy#=EntityY( target,True )-EntityY( camera )
      dz#=EntityZ( target,True )-EntityZ( camera )
      TranslateEntity camera,dx*.1,dy*.1,dz*.1
   EndIf
   PointEntity camera,car
   
   UpdateWorld
   RenderWorld
   Flip
Wend

End


Dieser Code ist im Demo unter Driver drin und das habe ich als grundlage genommen.
Der Neue

Jolinah

BeitragMo, Jan 05, 2004 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Collisions muss in die Haupt Programm Schleife, dann sollte es gehen.

Collisions ist ne Funktion die Objekte auf Kollisionen prüft und das Verhalten der Kollidierenden Objekte bestimmt. Somit muss sie immer wieder ausgeführt werden.

[Edit]
Stimmt dann also nicht sorry! Wink

Nach meinen neuesten erkenntnissen setzt Collisions anscheinend nur die
Kollisionsart zweier Typen und UpdateWorld macht dann die ganze Arbeit welches bei jedem Schleifendurchgang aufgerufen wird Very Happy
[/Edit]
  • Zuletzt bearbeitet von Jolinah am Di, Jan 06, 2004 21:18, insgesamt einmal bearbeitet
 

dreamfile

BeitragMo, Jan 05, 2004 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Programmschleife ???
Ist das alles was über While Not KeyHit(1) steht ???

Grüschen Sascha
Der Neue

Jolinah

BeitragDi, Jan 06, 2004 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein alles was zwischen While not keyhit(1) und Wend steht.

Schleifen benutzt man um etwas solange zu wiederholen bis irgend ein Ereignis eintritt. In dem Fall der Hauptschleife bis man ESC drückt.
 

darkshadow

BeitragDi, Jan 06, 2004 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Collisions muss definitiv [u]nicht[/n] in die Mainloop!

Jolinah

BeitragDi, Jan 06, 2004 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh sorry... dann hab ich da wohl auch was falsch gelernt Razz
(Irren ist menschlich Smile)

Jedenfalls geht es wenn es in der Schleife ist.


[Edit]
Ah klar.. ich hab in dem doofen Demo abgeschaut wo man während das
Programm läuft die Kollisionsart ändern kann. Und normalerweise ändert
man das ja nicht dauernd...
[/Edit]

Toby

Betreff: ALLEN DANK!!

BeitragDi, Jan 06, 2004 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sieht man mal wie schwierig das ist!( bzw. zu erklären) Very Happy

Aber trotzdem DANKE AN ALLE!!

Meine Entitys haben sich jetzt wie gewünscht bewegt!! Mr. Green
Member of
Terra Multimedia
 

dreamfile

BeitragMi, Jan 07, 2004 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

schwer ist das schon Very Happy aber macht auch Spass.
Für die bewegung eines anderen Bootes (gegner) der
in einem SH14 Kurs fährt habe ich das genommen:
Zitat:
;ANIMATION BEWEGUNG

TurnEntity cube,0,0,0
RotateEntity cube,0,0,0
PositionEntity cube,284,1,454
SetAnimKey cube,0

RotateEntity cube,0,0,0
TurnEntity cube,0,-90,0
PositionEntity cube,314,1,484
SetAnimKey cube,10

RotateEntity cube,0,0,0
TurnEntity cube,0,-90,0
PositionEntity cube,454,1,484
SetAnimKey cube,20

RotateEntity cube,0,0,0
TurnEntity cube,0,-180,0
PositionEntity cube,484,1,454
SetAnimKey cube,30

RotateEntity cube,0,0,0
TurnEntity cube,0,-180,0
PositionEntity cube,484,1,314
SetAnimKey cube,40

RotateEntity cube,0,0,0
TurnEntity cube,0,-270,0
PositionEntity cube,454,1,254
SetAnimKey cube,50

RotateEntity cube,0,0,0
TurnEntity cube,0,-270,0
PositionEntity cube,314,1,254
SetAnimKey cube,60

RotateEntity cube,0,0,0
TurnEntity cube,0,-360,0
PositionEntity cube,254,1,314
SetAnimKey cube,70

RotateEntity cube,0,0,0
TurnEntity cube,0,-360,0
PositionEntity cube,284,1,454
SetAnimKey cube,80
AddAnimSeq cube,80
Animate cube,1


Grüschen Sascha
Der Neue
 

Ekrits

Betreff: Kamera Kollision

BeitragSa, Jan 01, 2005 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei funktioniert die Kamera Kollision nicht
Außerdem muss ich ca 100 mal gras meshes laden

Code:

terrain = CreateTerrain(groesse)
textur = LoadTexture("C:\Daten\bilder\gras.bmp")
EntityTexture terrain, textur

For i=1 To groesse * groesse / 2
ModifyTerrain terrain, Rand(groesse), Rand(groesse), Rnd(-1,+1)
Next
EntityType terrain, 2
;Const cube = 2
;Const cam = 2
MoveMouse 320,230
Repeat

If KeyDown(203) Then TurnEntity cam, 0,+1.8,0
If KeyDown(205) Then TurnEntity cam, 0,-1.8,0
If KeyDown(200) Then MoveEntity cam, 0,0,+7
If KeyDown(208) Then MoveEntity cam, 0,0,-7

;#=EntityX(cam)
;#=EntityY(cam)
;#=EntityZ(cam)
;erra_y#=TerrainY(terrain,x#,y#,z#)+4
;ositionEntity cam,x#,terra_y#,z#

CameraRange cam,0.001,1000
x=MouseXSpeed()
If x>0 TurnEntity cam, 0 ,-x, 0
If x<0 TurnEntity cam, 0 ,-x, 0

y=MouseYSpeed()
If y>0 TurnEntity cam, y ,0, 0
If y<0 TurnEntity cam, y ,0, 0

CameraRange cam,0.001,1000

Collisions cam,terrain,2,2
RenderWorld
UpdateWorld
; col=CountCollisions(cube)
;
Flip
Until KeyHit(1)
EKRITSel: Rechtschreibfehler sind gewollt um eure Aufmerksamkeit zutesten!


Magians vs. Nekromats 100% COMPLETE

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group