Problem mit Würfel-Würfel Kollision [Erledigt]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Iguan

Betreff: Problem mit Würfel-Würfel Kollision [Erledigt]

BeitragMi, Okt 04, 2006 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leuz!

Ich hab leider in der Online-Hilfe nichts über Würfel-Würfel-Kollision gefunden, sondern lediglich Kollisionen mit spheres und Polygons....
daher dachte ich, ich frag mal hier nach. Ich habe den Befehl Entitybox und EntityType und Collisions entdeckt, und damit gleich mal rumprobiert.

dabei ist folgender Code herausgekommen, der aber nicht so funktioniert wie er sollte;

Ich möchte, dass sich alle cubes, die den grünen Balken berühren rot färben, und die, die den gelben Balken berühren blau färben.

also meine Fragen:

1. Was mache ich da falsch?
2. Wieso ist der Abstand der Balken bei jedem Programmstart anders? (ich habe ja eine fixe Position angegeben)

und hier der fehlerhafte code:
Code: [AUSKLAPPEN]


Cam=CreateCamera()

AmbientLight 255,255,255
MoveEntity Cam,0,10,0
RotateEntity Cam,90,0,0

Dim c(10)

SeedRnd MilliSecs()

For i = 1 To 10
   c(i) = CreateCube()
   EntityType c(i),2
   EntityBox(c(i),EntityX(c(i)),EntityY(c(i)),EntityZ(c(i)),1,1,1)
   
   MoveEntity c(i),Rnd(-10,10),0,Rnd(-10,10)    
  EntityColor c(i),255,255,255
Next

s1 = CreateCube()
EntityType s1,1

ScaleEntity s1,3,1,1
MoveEntity s1,-5,0,0
EntityBox(s1,EntityX(s1),EntityY(s1),EntityZ(s1),3,1,1)

EntityColor s1,0,255,0



s2 = CreateCube()
EntityType s2,1
ScaleEntity s2,1,1,3
MoveEntity s2,3,0,2
EntityBox(S2,EntityX(s2),EntityY(s2),EntityZ(s2),1,1,3)
EntityColor s2,255,255,0





SetBuffer BackBuffer()
Repeat

Cls
Collisions 1,2,2,2



UpdateWorld
RenderWorld
col = CountCollisions(s1)   
For i = 1 To col
  Objekt = CollisionEntity(s1,i)
  If Objekt > 0 Then EntityColor Objekt,255,0,0
Next

col = CountCollisions(s2)   
For i = 1 To col
  Objekt = CollisionEntity(s2,i)
  If Objekt > 0 Then EntityColor Objekt,0,0,255
Next


Flip
Until KeyHit(1)
End



vielen dank schon im Voraus!

mfg


Iguan
  • Zuletzt bearbeitet von Iguan am Fr, Okt 06, 2006 18:25, insgesamt einmal bearbeitet
 

Krümel

BeitragDo, Okt 05, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, Iguan!

Würfel-Würfel - kollisionen lassen sich mit "Collisions" nicht bewerkstelligen.

Du musst daher entweder eine eigene Funktion schreiben, Ein Freeware Modul benutzen, z.b. Tokamak 1.0 oder die ziemlich lahme Funktion
MeshesIntersect (mesh_a,mesh_b )

ausserdem: der Befehl "Collisions" steht normalerweise ausserhalb einer Schleife


Falls Deine Würfel nicht gedreht werden hilft dir evtl. diese Funktion:

Code: [AUSKLAPPEN]

Graphics3D 640,480,16,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()

camera=CreateCamera()
PositionEntity camera,0,0,-20

light=CreateLight(2)
PositionEntity light,-150,250,-100

Type cube
   Field entity%
   Field scaleX#
   Field scaleY#
   Field scaleZ#      
End Type

For t=1 To 50
   c.cube=New cube
   c\entity=CreateCube()
   c\scaleX=Rnd(0.1,2)
   c\scaleY=Rnd(0.1,2)
   c\scaleZ=Rnd(0.1,2)
   ScaleEntity c\entity,c\scaleX,c\scaleY,c\scaleZ
   PositionEntity c\entity,Rnd(-10,10),Rnd(-10,10),0
Next

Function CubesCollide(c1.cube, c2.cube)
   If c1=c2 Return False

   If (EntityX(c1\entity)+c1\scaleX) < (EntityX(c2\entity)-c2\scaleX) Or (EntityY(c1\entity)+c1\scaleY) < (EntityY(c2\entity)-c2\scaleY) Or (EntityZ(c1\entity)+c1\scaleZ) < (EntityZ(c2\entity)-c1\scaleZ) Return False
   If (EntityX(c1\entity)-c1\scaleX) > (EntityX(c2\entity)+c2\scaleX) Or (EntityY(c1\entity)-c1\scaleY) > (EntityY(c2\entity)+c2\scaleY) Or (EntityZ(c1\entity)-c1\scaleZ) > (EntityZ(c2\entity)+c2\scaleZ) Return False

   Return True
End Function

c1.cube=First cube
MoveMouse 320,240

While Not KeyHit(1)

   mxs#= MouseXSpeed()*0.1
   mys#=-MouseYSpeed()*0.1   
   MoveMouse 320,240

   EntityColor c1\entity, 255,255,255

   For c2.cube=Each cube
      If CubesCollide(c1,c2)
         EntityColor c1\entity, 255,0,0
         EntityColor c2\entity, 0,255,0
      Else
         EntityColor c2\entity, 255,255,255
      EndIf   
   Next

   TranslateEntity c1\entity,mxs,mys, 0   

   
   RenderWorld
   Flip

Wend



Viele Grüße.
Krümel[/code]

Iguan

BeitragDo, Okt 05, 2006 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Krümel! Vielen vielen Dank für deine Antwort! Hast mir echt geholfen!
Deine Funktion werde ich später sicher gut brauchen können, aber für mein Projekt ist meshesintersect genug schnell. Ich habe jetzt meinen Rubikwürfel beinahe fertig..
Nun habe ich aber noch das problem, dass meine Ebenen des Würfels am Anfang der Drehung z.t ruckartig auf 0° zurückgedreht werden. liegt wohl daren dass sich alle cubes der ebene, dem Winkel des Pivots anpassen..


ich habe es schon mit
Code: [AUSKLAPPEN]

EntityParent Wuerfel(i),Pivot,[color=red]0[/color]
EntityParent Wuerfel(i),Pivot,[color=red]1[/color]
RotateEntity Pivot,Winkel*VorZurück,0,0,[color=red]0[/color]
RotateEntity Pivot,Winkel*VorZurück,0,0,[color=red]1[/color]

versucht, geht aber auch nicht..

könnt ihr mir helfen, dass sich folgender Rubik-Würfel(Zauberwürfel) korrekt durchmischt?

vielen dank für eure Bemühungen!

hier ist der code

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
Cam=CreateCamera()
CameraFogMode Cam,1
AmbientLight 255,255,255
MoveEntity Cam,10,8,-10


Global Pivot = CreatePivot()

Dim Wuerfel(27)

Dim PosPivot#(3,27)
p = CreatePlane()
PositionEntity p,0,0,0
EntityColor p,100,100,255
EntityAlpha p,.5
m = CreateMirror()
EntityParent m,p,0

Ebene = 1

Dim EbeneObj(9)

WuerfelErstellen()


For i = 1 To 9
   EbeneObj(i) = CreateCube()
   EntityAlpha EbeneObj(i),0.1
Next

PositionEntity EbeneObj(1),2,4,4
ScaleEntity EbeneObj(1),.5,3,4

PositionEntity EbeneObj(2),4,4,4
ScaleEntity EbeneObj(2),.5,3,4

PositionEntity EbeneObj(3),6.5,4,4
ScaleEntity EbeneObj(3),.5,3,4

PositionEntity EbeneObj(4),4,2,4
ScaleEntity EbeneObj(4),4,.5,4

PositionEntity EbeneObj(5),4,4.2,4
ScaleEntity EbeneObj(5),4,.5,4

PositionEntity EbeneObj(6),4,6.4,4
ScaleEntity EbeneObj(6),4,.5,4

PositionEntity EbeneObj(7),4,4.2,2
ScaleEntity EbeneObj(7),4,4,.5

PositionEntity EbeneObj(8),4,4.2,4.2
ScaleEntity EbeneObj(8),4,4,.5

PositionEntity EbeneObj(9),4,4.2,6.4
ScaleEntity EbeneObj(9),4,4,.5

For i = 1 To 9
   
Next

SeedRnd(MilliSecs())
Repeat



If Winkel >= WinkelStart + 90 Then
  WinkelStart = Winkel
  Ebene = Rnd(1,9)
  VorZurück = Rnd(-1,1)
  If VorZurück = 0 Then VorZurück = 1
 
 
  EbeneSetzen(Ebene)

End If
Winkel = Winkel Mod 360
WinkelStart = WinkelStart Mod 360
UpdateWorld
RenderWorld
Winkel = Winkel + 1
If Ebene < 4 Then RotateEntity Pivot,Winkel*VorZurück,0,0,1
If Ebene < 7 And Ebene > 3 Then RotateEntity Pivot,0,Winkel*VorZurück,0,1
If Ebene > 6 Then RotateEntity Pivot,0,0,Winkel*VorZurück,1


If KeyDown(203) Then CamWinkel# = CamWinkel# - 5
If KeyDown(205) Then CamWinkel# = CamWinkel# + 5

PositionEntity Cam,Sin(CamWinkel#)*30,15,Cos(CamWinkel#)*30
PointEntity Cam,Wuerfel(14)


;If Winkel = 90 Then Flip 0
Flip
Until KeyDown(1)
End


Function WuerfelErstellen()
   i = 0
For Y = 1 To 3
  For Z = 1 To 3
    For X = 1 To 3
        i = i + 1      
       If i = 14 Then
         MoveEntity Pivot,X*2.08,Y*2.08,Z*2.08; Mittelpunkt des Würfels
       End If
       Wuerfel(i) = CreateCube()         
        EntityFX Wuerfel(i),2
        EntityColor Wuerfel(i),80,80,80        
        MoveEntity Wuerfel(i),X*2.08,Y*2.08,Z*2.08
     
     
         
        If Z = 1 Then FlaecheFaerben(1,i,255,0,0)
      If X = 3 Then FlaecheFaerben(2,i,255,255,0)
      If Z = 3 Then FlaecheFaerben(3,i,0,255,0)
      If X = 1 Then FlaecheFaerben(4,i,0,0,255)
      If Y = 3 Then FlaecheFaerben(5,i,255,0,255)
      If Y = 1 Then FlaecheFaerben(6,i,255,255,255)
     
      If X = 1 Then FlaecheFaerben(2,i,80,80,80)
      If X = 2 Then FlaecheFaerben(2,i,80,80,80)
      If X = 2 Then FlaecheFaerben(4,i,80,80,80)
      If X = 3 Then FlaecheFaerben(4,i,80,80,80)   
      If Y = 1 Then FlaecheFaerben(5,i,80,80,80)
      If Y = 2 Then FlaecheFaerben(5,i,80,80,80)
      If Y = 2 Then FlaecheFaerben(6,i,80,80,80)
      If Y = 3 Then FlaecheFaerben(6,i,80,80,80)
      If Z = 1 Then FlaecheFaerben(3,i,80,80,80)
      If Z = 2 Then FlaecheFaerben(3,i,80,80,80)
      If Z = 2 Then FlaecheFaerben(1,i,80,80,80)
      If Z = 3 Then FlaecheFaerben(1,i,80,80,80)     
     
    Next
  Next
Next
End Function

Function FlaecheFaerben(Flaeche,i,R,G,B)
   Surf=GetSurface(Wuerfel(i),1)
   V = (Flaeche-1) * 4     
  VertexColor Surf,V,R,G,B
  VertexColor Surf,V+1,R,G,B
  VertexColor Surf,V+2,R,G,B
  VertexColor Surf,V+3,R,G,B
End Function


Function EbeneSetzen(Ebene)
 
   For i = 1 To 27
     EntityParent Wuerfel(i),0
  Next
  FreeEntity Pivot
  Pivot = CreatePivot()
  MoveEntity Pivot,2*2.08,2*2.08,2*2.08
  For ii = 1 To 9
    If Ebene = ii Then    
      For i = 1 To 27
         If MeshesIntersect(EbeneObj(ii),Wuerfel(i)) Then EntityParent Wuerfel(i),Pivot,1
      Next
    EndIf
  Next
 
 
End Function

[/code]
 

Krümel

BeitragDo, Okt 05, 2006 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay... jetzt schauts gut aus !

Ich habe die RotateEntity durch TurnEntity ersetzt
sowie diverse Kleinigkeiten im Markierten Bereich
(zwischen "Änderungen Start" und "Änderungen Ende")

Ich will ja nicht zuviel in fremden sourcen rumpfuschen aber ich habe den
Würfel noch zentriert, dann "wabert" er nicht so, wenn die Kamera sich drumherum dreht, ausserdem war es überflüssig den Pivot immerwieder zu löschen und neu zu setzen.

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
Cam=CreateCamera()
CameraFogMode Cam,1
AmbientLight 255,255,255
MoveEntity Cam,10,8,-10

Global Pivot = CreatePivot()

Dim Wuerfel(27)

Dim PosPivot#(3,27)

p = CreatePlane()
PositionEntity p,0,-5,0
EntityColor p,100,100,255
EntityAlpha p,0.5
m = CreateMirror(p)
EntityParent m,p,0

Ebene = 1

Dim EbeneObj(9)

WuerfelErstellen()


For i = 1 To 9
   EbeneObj(i) = CreateCube()
   EntityAlpha EbeneObj(i),0.1
Next

PositionEntity EbeneObj(1),2,0,0
ScaleEntity EbeneObj(1),.5,3,4

PositionEntity EbeneObj(2),0,0,0
ScaleEntity EbeneObj(2),.5,3,4

PositionEntity EbeneObj(3),-2,0,0
ScaleEntity EbeneObj(3),.5,3,4

PositionEntity EbeneObj(4),0,2,0
ScaleEntity EbeneObj(4),4,.5,4

PositionEntity EbeneObj(5),0,0,0
ScaleEntity EbeneObj(5),4,.5,4

PositionEntity EbeneObj(6),0,-2,0
ScaleEntity EbeneObj(6),4,.5,4

PositionEntity EbeneObj(7),0,0,2
ScaleEntity EbeneObj(7),4,4,.5

PositionEntity EbeneObj(8),0,0,0
ScaleEntity EbeneObj(8),4,4,.5

PositionEntity EbeneObj(9),0,0,-2
ScaleEntity EbeneObj(9),4,4,.5


SeedRnd(MilliSecs())

;;;;;;;;;;;;;;Änderungen Start;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Repeat

If Winkel <= 0 Then
   
  Winkel = 90
  Ebene = Rnd(1,9)
  VorZurück = (Rand(0,1) - 0.5) * 4

  EbeneSetzen(Ebene)
End If

Winkel = Winkel - Abs(VorZurück)

RenderWorld

If Ebene < 4 Then TurnEntity Pivot,VorZurück,0,0,1
If Ebene < 7 And Ebene > 3 Then TurnEntity Pivot,0,VorZurück,0,1
If Ebene > 6 Then TurnEntity Pivot,0,0,VorZurück,1

;;;;;;;;;;;;;;Änderungen Ende;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

If KeyDown(203) Then CamWinkel# = CamWinkel# - 5
If KeyDown(205) Then CamWinkel# = CamWinkel# + 5

PositionEntity Cam,Sin(CamWinkel#)*30,15,Cos(CamWinkel#)*30
PointEntity Cam,Wuerfel(14)

;If Winkel = 90 Then Flip 0


Flip
Until KeyDown(1)
End


Function WuerfelErstellen()
   i = 0
For Y = -1 To 1
  For Z = -1 To 1
    For X = -1 To 1
      i = i + 1     

      Wuerfel(i) = CreateCube()         
      EntityFX Wuerfel(i),2
      EntityColor Wuerfel(i),80,80,80
      PositionEntity Wuerfel(i),X*2.08,Y*2.08,Z*2.08
         
      If Z = -1 Then FlaecheFaerben(1,i,255,0,0)
      If X =  1 Then FlaecheFaerben(2,i,255,255,0)
      If Z =  1 Then FlaecheFaerben(3,i,0,255,0)
      If X = -1 Then FlaecheFaerben(4,i,0,0,255)
      If Y =  1 Then FlaecheFaerben(5,i,255,0,255)
      If Y = -1 Then FlaecheFaerben(6,i,255,255,255)
     
      If X = -1 Then FlaecheFaerben(2,i,80,80,80)
      If X =  0 Then FlaecheFaerben(2,i,80,80,80)
      If X =  0 Then FlaecheFaerben(4,i,80,80,80)
      If X =  1 Then FlaecheFaerben(4,i,80,80,80)   
      If Y = -1 Then FlaecheFaerben(5,i,80,80,80)
      If Y =  0 Then FlaecheFaerben(5,i,80,80,80)
      If Y =  0 Then FlaecheFaerben(6,i,80,80,80)
      If Y =  1 Then FlaecheFaerben(6,i,80,80,80)
      If Z = -1 Then FlaecheFaerben(3,i,80,80,80)
      If Z =  0 Then FlaecheFaerben(3,i,80,80,80)
      If Z =  0 Then FlaecheFaerben(1,i,80,80,80)
      If Z =  1 Then FlaecheFaerben(1,i,80,80,80)     
     
    Next
  Next
Next
End Function

Function FlaecheFaerben(Flaeche,i,R,G,B)
   Surf=GetSurface(Wuerfel(i),1)
   V = (Flaeche-1) * 4     
  VertexColor Surf,V,R,G,B
  VertexColor Surf,V+1,R,G,B
  VertexColor Surf,V+2,R,G,B
  VertexColor Surf,V+3,R,G,B
End Function

Function EbeneSetzen(Ebene)
 
  For i = 1 To 27
     EntityParent Wuerfel(i),0
  Next

  For ii = 1 To 9
    If Ebene = ii Then   
      For i = 1 To 27
         If MeshesIntersect(EbeneObj(ii),Wuerfel(i)) Then EntityParent Wuerfel(i),Pivot,1
      Next
    EndIf
  Next
 
End Function

Iguan

BeitragFr, Okt 06, 2006 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@Krümel!! Vielen vielen dank!! Ist echt nett von dir, dass du mir geholfen hast!! Bin wunschlos glücklich!! Very Happy
 

Krümel

BeitragFr, Okt 06, 2006 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Gern Geschehn Very Happy

Lass mal sehn wie das fertige Game aussieht, wenns soweit ist !

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group