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

![]() |
IguanBetreff: Problem mit Würfel-Würfel Kollision [Erledigt] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Krümel!! Vielen vielen dank!! Ist echt nett von dir, dass du mir geholfen hast!! Bin wunschlos glücklich!! ![]() |
||
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gern Geschehn ![]() Lass mal sehn wie das fertige Game aussieht, wenns soweit ist ! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group