Prob mit COLLISIONENTITY

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Bob

Betreff: Prob mit COLLISIONENTITY

BeitragDi, Jul 13, 2004 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 13, 2004 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 13, 2004 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 13, 2004 8:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 13, 2004 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wofür ist das Return da drinne ?
Field msg[5] <- so kannste dir alles später ausgeben lassen
nach Renderworld Wink
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

BeitragMi, Jul 14, 2004 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Bob

BeitragMi, Jul 14, 2004 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 14, 2004 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group