kollisionen
Übersicht

![]() |
aasgeierBetreff: kollisionen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
TobyBetreff: Und wie kann man die Kollision abfragen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und wie kann man die Kolision abfragen? Von zwei Entitys?
(Das hab' ich in 2D schon nicht kapiert. Ich glaub ich kapiers nie ![]() If "Colisionbefehl?" entity1,entity2 Then ... Gibt's so was ?? Bestimmt oder!? |
||
Member of
Terra Multimedia |
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
? entitycollided ? | ||
BurningSoul |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ; 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
in euren beispielen habt ihr ja nur "einfache sachen wie würfel und so! | ||
darkshadow |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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.. ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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 ![]() [/Edit] |
||
- Zuletzt bearbeitet von Jolinah am Di, Jan 06, 2004 21:18, insgesamt einmal bearbeitet
dreamfile |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Programmschleife ???
Ist das alles was über While Not KeyHit(1) steht ??? Grüschen Sascha |
||
Der Neue |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Collisions muss definitiv [u]nicht[/n] in die Mainloop! | ||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh sorry... dann hab ich da wohl auch was falsch gelernt ![]() (Irren ist menschlich ![]() 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] |
||
![]() |
TobyBetreff: ALLEN DANK!! |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da sieht man mal wie schwierig das ist!( bzw. zu erklären) ![]() Aber trotzdem DANKE AN ALLE!! Meine Entitys haben sich jetzt wie gewünscht bewegt!! ![]() |
||
Member of
Terra Multimedia |
dreamfile |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Moin,
schwer ist das schon ![]() 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 |
EkritsBetreff: Kamera Kollision |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group