Prob mit COLLISIONENTITY
Übersicht

![]() |
BobBetreff: Prob mit COLLISIONENTITY |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
ich habe folgendes Prob. Ein Raumschiff, umringt von Schutzschilden. Die Schilde sind Meshes. Alle Meshes haben einen gemeinsamen Pivot. Der Pivot liegt im Zentrum des Schiffes. Überprüfe ich nun mit (z.b.) hnd = COLLISIONENTITY(schild\mesh,I) die Kollision, wird dies zwar erkannt, kurioser weise aber in Zentrum des Schiffs. Ich fliege ganz laaaaangsam um es genau zu beobachten. Man sieht genau wen sich Objekt und Schild berühren. Nix passiert. Dann fliegt das schiff langsam über das Objekt und die Kollision wird erkannt. (sogar mehrfach da alle Schide gleichzeitig mit Objekt kollidieren.) Das Schiff wird expliziet NICHt überprüft. Ich hege die Vermutung das der Parent der Schilde (der Pivot also) auf Kollision überprüft wird. Unterstützt wird dies durch die Beobachtung das wenn das Schiff nicht exakt mit dem seinem Zentrum über das Objekt fliegt, die kollision nicht erkannt wird. Hat einer eine Ahnung ob meine Vermutung stimmt und wie sich das Prob beheben lässt oder einen anderen Lösungsvorschlag? Beispielcode ist zu kompliziert hier zu posten da viel zu umfangreich. (müsste dan auch die Types usw. Posten) gruß Bob |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß nur das Collisionen von bewegten Objekten aus gehen .
Entity Type und Radius haste bestimmt richtig gesetzt oder mal überprüfen ob der Type mit Collisions übereinstimmt , also Sphere to Sphere und so . Ich hatte auch mal das Problem das sich ein Pivot verschoben hat weil der von der Collision aufgehalten wurde . Also mußte der wohl nach ganz oben in der Hirachie und daran muß dann dein Schiff hängen glaube ich . Oder wenn man die Pos. in Variablen speichert und die Position des Entitys verändert und es gar nicht dahin gesetzt wird kann auch passieren wenn eine Collision es verbietet . |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Kollision gilt nur für das definierte Objekt, weder für seine Parents noch childs
Was für eine Kollisionsart hast du ausgewählt? sofern es SphereKollision ist, könnte es sein dass du einen sehr kleinen radius hast? |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Kollisionsart ist 2
Relevanter Auszug aus dem Code Code: [AUSKLAPPEN] Const col_typ_ship = 1 ; collision type of entity. Const col_typ_obj = 2 ; Must be in the range 0-999 Const col_typ_shild = 3 ... EntityType shild\mesh[i],col_typ_shild ... Collisions col_typ_shild,col_typ_obj,2,2 ;Kollision Schilde / Objecte Auszug aus Hilfe: Wurde die Methode auf 1 gesetzt (Kugel-Kugel), dann muss dem Zielobjekt ENTITYRADIUS zugeteilt werden. Wird die Methode 3 benutzt (Kugel-Würfel), dann muss man ENTITYBOX ausführen. Die 2 Methode (Kugel-Polygon) benötigt keine besondere Zuweisung. Hier verstehe ich nicht ganz warum bei Methode 2 keine besondere Zuweisung nötig sein soll. Es wird auf Kugel - Polygon geprüft. Meine Schilde haben aber keine EntityRadius erhalten. Soll ja angeblich nicht nötig sein. Interessant ist noch folgendes. Auszug aus Hilfe: In BlitzBasic gibt es zwei definierbare Kollisionsflächen: Quader (ENTITYBOX) und Kugel (ENTITYRADIUS). Hat man die Kollisionsfläche gewählt, dann kann man noch zusätzlich mit dem Befehl ENTITYTYPE den Kollisionstyp einstellen. Was mich stutzig macht ist ...kann man noch zusätzlich mit dem .... Heisst das etwa ich brauche den EntityType shild\mesh[i],col_typ_shild nicht zu setzen? |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wenn du auf Polygon testet braucht man nicht den Radius oder
die Box zu setzen beim anderen Objekt , das ist damit gemeint . Wenn du Collisions benutzt mußte auch dafür die EntityTypen setzen was auch logisch sein sollte . Beim Shild mußte den Radius setzen , haste das gemacht ? Sehe ich nicht unter relevant !? |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Markus,
beim Schild habe ich jetzt mal mit dem Radius rumgespielt. Geändert hat es nur insofern etwas das die Kollision nun früher erkannt wird. Es wird aber nach wie vor vom Zentrum des Schiffs aus berechnet. Will sagen der Kugelförmige Kollisionstyp liegt exakt an der Pivot Position des Schildes und nicht in der lokalen Mitte des Schildes. Ich werde mal en kleines Demo Projekt Posten. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Logischerweise is die Kollisionskugel um den 0,0,0 Punkt des Objektes und nicht um irgend ein erdachtes, fiktives Zentrum. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Dremora,
natürlich ist die Kollisionskugel an 0,0,0. Dumm nur das das Eigentliche Objekt das diese Kollisionskugel mit sich schleptt nicht an 0,0,0 liegt. Darum geht es doch die ganze Zeit. Ok. Ein Problem wurde inzwischen beseitig. Jetzt das nächste. In der beigefügten Demo wird leider nicht richtit erkannt welcher der Schutzschirme mit der "Bombe" kollidiert. Was mache ich hier falsch? Es wird immer Schild 0 erkannt. Code: [AUSKLAPPEN] Graphics3D 800,600,16 Global speed# = 0 Global turn# = 0 Global s_on = True Global MSG$ Const col_typ_ship = 1 Const col_typ_shild = 2 Const col_typ_obj = 3 Global ship = CreateSphere() EntityType ship,col_typ_ship EntityRadius ship,1 Type Schild Field Pivot Field mesh[5] End Type s.schild = New schild s\pivot = CreatePivot(ship) For i = 0 To 5 s\mesh[i] = CreateCube(s\pivot) EntityType s\mesh[i],col_typ_shild NameEntity s\mesh[i], "Schild "+i EntityBox s\mesh[i], -0.5,-0.5,-0.5, 1, 1,1 ScaleMesh s\mesh[i], 1, 0.1, 0.1 PositionMesh s\mesh[i], 0,0,2 RotateMesh s\mesh[i] ,0,i*-60,0 EntityAlpha s\mesh[i], 0.5 Next Global bombe = CreateSphere() EntityType bombe,col_typ_obj NameEntity bombe,"Bombe" EntityRadius bombe,0.3 ScaleMesh bombe,0.3,0.3,0.3 PositionEntity bombe,5,0,5 cam = CreateCamera() CameraZoom cam,2 PositionEntity cam ,0,40,0 TurnEntity cam,90,0,0 licht = CreateLight() While Not KeyHit(1) check_Keys() check_Kollision() UpdateWorld RenderWorld Text 0,0,"Speed " + speed Text 0,20,"Schild " + s_on Text 0,40,MSG Text 0,60,"Cursor = Steuerung " Text 0,80,"S = Schilde an / Aus" Flip Wend End Function check_Kollision() If s_On = True Then Collisions col_typ_shild,col_typ_obj,3,1 ;Kollision Schilde / Objecte s.schild = First schild For i=0 To 5 col=CountCollisions(s\mesh[i]) If col <>0 Then obj = CollisionEntity(s\mesh[i],col ) MSG = EntityName(s\mesh[i]) +" Collision mit " + EntityName(obj ) speed = 0 Return EndIf Next Else Collisions col_typ_ship,col_typ_obj,1,2 ;Kollision Schiff / Objecte col=CountCollisions(ship) msg=col If col <>0 Then obj = CollisionEntity(ship,col ) msg="Schiff Collision mit " + EntityName(obj ) EndIf EndIf End Function Function Check_Keys() Turning=False If KeyDown(203) ;Cursor Left turn=turn+0.5 If turn > 359.5 Then turn =0 EndIf If KeyDown(205) ;Cursor Right turn=turn-0.5 If turn < 0.5 Then turn =359.5 EndIf If KeyDown(200) Then ; CursorDown speed= speed-0.001 EndIf If KeyDown(208) Then ;CursorUp speed = speed+0.001 EndIf If KeyHit(31) Then If s_on =True Then s_on = False s.schild = First schild For i = 0To 5 HideEntity s\mesh[i] Next Else s_on = True s.schild = First schild For i = 0To 5 ShowEntity s\mesh[i] Next EndIf EndIf RotateEntity ship ,0,turn,0 MoveEntity ship,0,0,speed End Function |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wofür ist das Return da drinne ?
Field msg[5] <- so kannste dir alles später ausgeben lassen nach Renderworld ![]() Collisions brauchste nur einmal setzen und ist meine ich gültig bis ClearCollisions aufgerufen wird . Als Pivots könntest du auch mal kleine Boxen anzeigen lassen und den Rest transparent machen . Den Mittelpunkt vom Schiff auch mal mit ner Box versehen . |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ich habe folgendes herausgefunden. Alle MeshOperationen wirken sich scheinbar NICHt auf entityradius und entitybox aus. deshalb kann ; For i = 0 To 5 s\mesh[i] = CreateCube(s\pivot) EntityType s\mesh[i],col_typ_shild NameEntity s\mesh[i], "Schild "+i EntityBox s\mesh[i], -0.5,-0.5,-0.5, 1, 1,1 ScaleMesh s\mesh[i], 1, 0.1, 0.1 PositionMesh s\mesh[i], 0,0,2 RotateMesh s\mesh[i] ,0,i*-60,0 EntityAlpha s\mesh[i], 0.5 Next nicht funktionieren. es muss heissen; For i = 0 To 5 s\mesh[i] = CreateCube(s\pivot) EntityType s\mesh[i],col_typ_shild NameEntity s\mesh[i], "Schild "+i EntityBox s\mesh[i], -0.5,-0.5,-0.5, 1, 1,1 Scaleenttity s\mesh[i], 1, 0.1, 0.1 RotateMesh s\mesh[i] ,0,i*-60,0 MoveEntity s\mesh[i], 0,0,2 EntityAlpha s\mesh[i], 0.5 Next Irgendwie klappts aber dennoch nicht richtig. Schade das man den EntityBox nicht sichtbar machen kann. Seis drum. Ich habe nun eine andere Lösung gefunden. 1. Ich Vergleiche ausschlieslich das Schiff auf Kollision. 2. Sind die Schilde an wird der EntityRadius erhöht. 3. Bei engeschaltetet Schilden und Kollision wird wie gehabt das collidierte Object ermittelt und anschliesend der entsprechende Schutzschild mit MeshesIntersect ermittelt. Demo Folgt. Danke das wars. |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier die Demo.
Sind die Schilde an können die "Bomben" weggedrückt werden. Viel Spass. Code: [AUSKLAPPEN] Graphics3D 800,600,16 Global speed# = 0 Global turn# = 0 Global s_on = True Global cam_d = 40 Global MSG$ Const col_typ_ship = 1 Const col_typ_obj = 3 Global ship = CreateSphere() EntityType ship,col_typ_ship EntityRadius ship,1 Type Schild Field Pivot Field mesh[5] End Type s.schild = New schild s\pivot = CreatePivot(ship) For i = 0 To 5 s\mesh[i] = CreateCube(s\pivot) If i = 0 Then EntityColor s\mesh[i],255,0,0 NameEntity s\mesh[i], "Schild "+i ScaleEntity s\mesh[i], 1, 0.1, 0.1 RotateEntity s\mesh[i] ,0,i*-60,0 MoveEntity s\mesh[i] ,0,0,2 EntityAlpha s\mesh[i], 0.5 Next Type bombe Field x#,z#, sx#,sz# Field mesh End Type Global bombe[49] For i = 0 To 49 b.bombe = New bombe b\x=Rnd(-100,100) b\z=Rnd(-100,100) b\mesh = CreateSphere() PositionEntity b\mesh ,b\x,0, b\z EntityType b\mesh,col_typ_obj NameEntity b\mesh,Handle(b) ScaleEntity b\mesh,0.3,0.3,0.3 Next Global cam = CreateCamera() CameraZoom cam,2 PositionEntity cam ,0,cam_d,0 TurnEntity cam,90,0,0 licht = CreateLight() While Not KeyHit(1) For b.bombe = Each bombe b\x = b\x - b\sx b\z = b\z - b\sz PositionEntity b\mesh, b\x,0,b\z Next check_Keys() check_Kollision() UpdateWorld RenderWorld Text 0,0,"Speed " + speed Text 0,20,"Schild " + s_on Text 0,40,MSG Text 0,60,"Cursor = Steuerung " Text 0,80,"S = Schilde an / Aus" Text 0,100,"Cam steuerung Numblock 8,2,4,6,+,- 5= Follow Modus Flip Wend End Function check_Kollision() If s_On = True Then EntityRadius ship,2 Else EntityRadius ship,1 EndIf Collisions col_typ_ship,col_typ_obj,2,1 ;Kollision Schiff / Objecte col=CountCollisions(ship) If col <>0 Then obj = CollisionEntity(ship,col) tmpTyp = EntityName(obj) b.bombe = Object.bombe(tmpTyp) If s_on = True Then ;Sind die Schilde an? ;Welcher Schild hat Object berührt? shild.schild = First schild For i=0 To 5 If MeshesIntersect(shild\mesh[i],obj) Then msg ="Schild "+i +" Collision mit Mesh Hnd " +obj + " Bombe Nr "+Handle(b) RotateEntity b\mesh, 0,EntityYaw(ship),0 b\sx = speed /2 b\sz = speed /2 Exit EndIf Next Else msg = "Schiff Collision mit " +obj + " typ hnd "+Handle(b) speed =0 EndIf EndIf End Function Function Check_Keys() Turning=False If KeyDown(203) ;Cursor Left turn=turn+0.5 If turn > 359.5 Then turn =0 EndIf If KeyDown(205) ;Cursor Right turn=turn-0.5 If turn < 0.5 Then turn =359.5 EndIf If KeyDown(200) Then ; CursorDown speed= speed-0.001 EndIf If KeyDown(208) Then ;CursorUp speed = speed+0.001 EndIf If KeyHit(31) Then If s_on =True Then s_on = False s.schild = First schild For i = 0To 5 HideEntity s\mesh[i] Next Else s_on = True s.schild = First schild For i = 0To 5 ShowEntity s\mesh[i] Next EndIf EndIf ;Camera Steuerung ---------------------------------------------------- Cam_Y# = EntityYaw(Cam) Cam_X# = EntityPitch(Cam) Cam_Z# = EntityRoll(Cam) If KeyDown(74) cam_d=cam_d+1 ;NumPad - If cam_d > 999 cam_d =999 If KeyDown(78) cam_d=cam_d-1 ;NumPad + If cam_d < 5 cam_d =5 If KeyDown(72)Then ;NumPad 8 Cam_X = Cam_X -1 If Cam_X <-10 Cam_X =-10 EndIf If KeyDown(80) Then ;NumPad 2 Cam_X = Cam_X +1 If Cam_X >89 Cam_X =89 EndIf If KeyDown(75) Then ;NumPad 4 Cam_Mode = 0 Cam_Y = Cam_Y - 1 EndIf If KeyDown(77) Then ;NumPad 6 Cam_Mode = 0 Cam_Y = Cam_Y +1 EndIf If KeyHit(71) Then Cam_Mode = 0 ;NumPad 7 Free If KeyHit(76) Then Cam_Mode = 1 ;NumPad 5 Follow If KeyHit(73) Then Cam_Mode = 2 ;NumPad 9 Target RotateEntity cam,Cam_X,Cam_Y,Cam_Z ;Muss Hier stehen (und nicht im MainLoop) sonst Ruckler Im Bild? RotateEntity ship ,0,turn,0 MoveEntity ship,0,0,speed ;Camera Positioniern ------------------------------------------------- Select Cam_Mode Case 0 cammode$ = "Free" Case 1 cammode$ = "Follow" s_y# = EntityYaw(ship) c_x# = EntityPitch(Cam) RotateEntity Cam,c_x,s_y,0 Case 2 cammode$ = "Target" End Select PositionEntity cam,EntityX(Ship),EntityY(Ship),EntityZ(Ship) MoveEntity cam,0,0,-cam_d End Function |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm,
das EntityBox und EntityRadius nix mit dem Mesh zu tun haben war mir klar . Das mit dem MeshIntersect ist aber nicht die Lösung , versuche es lieber auf den herkömmlichen Weg ... Das man die Kollisionsboxen nicht sichtbar machen kann finde ich auch doof , dazu hatte ich Mark mal nen Wunsch geschrieben ![]() |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Markus2 hat Folgendes geschrieben: Hm,
das EntityBox und EntityRadius nix mit dem Mesh zu tun haben war mir klar . Mir nicht. Markus2 hat Folgendes geschrieben: Das mit dem MeshIntersect ist aber nicht die Lösung , versuche es lieber auf den herkömmlichen Weg ... Doch. Ist viel Besser. Ich bräuchte nämlih ansonsten einen Pplygon -Box Vergleich. Leider gibt es aber nur einen Box - Polygon Vergleich. Da der MeshesIntersct nur dann durchgeführt wird wen vorher ein Spher - Polygon Vergleich positiv war, brauche ich im schlimmsten Fall 6 Meshvergleiche. Das ist zu vertreten. |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
MeshIntersect ist aber auch langsamer das meinte ich nur damit ,
also wenn es anders geht immer vermeiden . Wenn es bei dir keine Rolle spielt ist das auch egal ... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group