Probleme mit 3D-Geometrie

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Probleme mit 3D-Geometrie

BeitragMo, Nov 12, 2007 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mal wieder mit meiner 3D-Geometrie und meinen daraus resultierenden Problemen.

Ich möchte folgendes machen:

Ein Vektor im 3D-Raum, als Startpunkt [x1, y1, z1] welcher bei [x2, y2, z2] wieder endet. An diesem Ende ist ein EntityRadius welcher auf andere Objekte kolidieren kann. Man stelle sich diesen Radius als ein Rad und den Vektor [x1, y1, z1] - [x2, y2, z2] als Achse vor. Nun muss es doch möglich sein, anhand der Kolisionskoordinaten (NX, NY, NZ) zu bestimmen, in welcher Richtung das Rad relativ zur Umgebung bewegend kolidiert ist. Aus dieser Information müsste man nun auch ausrechnen können, ob das Rad ohne weiteren Wiederstand weiter rollen (also ungebremst) kann, oder ob es durch Seitwärtsbewegung verlangsamt werden muss. Nun kann ein Rad ja auch schlendern, wo eben beides gleichzeitig geschieht. Das ganze soll natürlich auch in jeder Position funktionieren, also auch dann, wenn das Rad einen Looping oder eine Steilkurve fährt.

Meine Frage nun:

Welche art der Berechnungen muss ich hier anwenden, bevor noch mein Kopf explodiert? Oder noch besser, hat jemand ein Beispiellink für/oder sowas?

Wie sich so manch einer was dabei denken kann, ist es für eine 3D-Autophysik gedacht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragMo, Nov 12, 2007 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist sogar recht billig:

1. Dein Kollisionradius hat einen Radius
2. Dein Rad hat einen Radius
3. Kreise haben die geniale eigenschaft, dass der Radius gleichzeitig die kürzeste verbindung UND die normalenrichtung im kollisionspunkt angibt.

-> Rad 0,0 punkt + rad_radius*-normale = kollipunkt auf rad
-> kollisionsradiuszentrum + kollisions_radius*normale = kollipunkt auf kollisionskugel / kreis

Grund: Der punkt liegt auf der Verbindung der beiden Zentren zu dem Zeitpunkt t wo sie sich berühren -> kürzest mögliche verbindung -> eigener Kolliradius in richtung des anderen Zentrums = kollisionspunkt
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragFr, Nov 16, 2007 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Bist du noch bei dem 3D Buggy der aus Verbindungen besteht ?

Bei dem Rad ist es so das es die Schwingungen der Karosse
dämpft aber nicht in der Richtung wie es rollt .
Bzw. in die Richtung wie es rollt dämpft es sehr wenig .
Wenn das Rad in der Luft ist dämpft es die Karosse auch nicht .

Das Rad habe ich als Punkt simuliert , der Punkt ist wiederum mit
anderen Punkten verbunden .

Beispiel in BMax wie ich das meine
Code: [AUSKLAPPEN]

Pos.x=Pos.x+Speed.x
   Pos.y=Pos.y+Speed.y
   Pos.z=Pos.z+Speed.z

   Select Self
   Case C.WheelLF,C.WheelRF
   Case C.WheelLB,C.WheelRB
   Default
    'alles außer die Räder
    Daempfen C.AngleBodyDegree
   End Select

   If Abs(Speed.x)<0.0001 Then Speed.x=0
   If Abs(Speed.y)<0.0001 Then Speed.y=0
   If Abs(Speed.z)<0.0001 Then Speed.z=0

  EndIf

  If Pos.y<0 Then Pos.y=0;Speed.y=-Speed.y*0.5

  GroundContact=Limit(1.0-Limit(Pos.y,0,1) ,0 ,0.97)

  Select Self
  Case C.WheelLF,C.WheelRF
   Pos.y=Limit(Pos.y,0,3) 'soll das Überschlagen verhindern
   RadDaempfen C.AngleBodyDegree+C.AngleSteeringDegree
  Case C.WheelLB,C.WheelRB
   Pos.y=Limit(Pos.y,0,3)
   RadDaempfen C.AngleBodyDegree
  End Select
 
 End Method

 Method RadDaempfen(A:Double)
 
  'A ist der Winkel wie das Rad in der Welt steht

  Local d:Vector
  d=Speed.Copy()

  TurnVectorXZ -A,d.x,d.z 'Vector drehen das er nach Front zeigt
  d.x=d.x*(1.0-GroundContact) 'Links-Rechts dämpfen
  d.y=d.y*0.9
  d.z=d.z*0.99 'Front/Back Rollreibung
  '(Front/Back wird nicht gedämpft weil das Rad rollt)

  TurnVectorXZ A,d.x,d.z 'und wieder zurück drehen

  Speed.Set d
  d=Null

 End Method

 Method Daempfen(A:Double)
 
  'A ist der Winkel wie das Auto in der Welt steht

  Local d:Vector
  d=Speed.Copy()

  TurnVectorXZ -A,d.x,d.z 'Vector drehen das er nach Front zeigt
  d.x=d.x*0.98  'Links-Rechts dämpfen
  d.y=d.y*0.9  'Oben/Unten
  d.z=d.z*0.99 'Front/Back nur ein bischen dämpfen
 
  TurnVectorXZ A,d.x,d.z 'und wieder zurück drehen

  Speed.Set d
  d=Null

  'hier könnte man noch den Bodenkontakt berücksichtigen und mehr dämpfen (falls das Auto auf der Seite liegt)

 End Method

End Type

Function TurnVectorXZ(angle:Double,x:Double Var,z:Double Var)

  'angle in degree

  Local sn:Double,cs:Double
  sn = Sin(angle)
  cs = Cos(angle)

  Local xc:Double,zc:Double
  xc=x
  zc=z

  x =  cs*xc + sn*zc
  z = -sn*xc + cs*zc

End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Nov 16, 2007 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja genau, dass geht noch um den Buggy in 3D. Ich werde versuchen in der Logik aus deinem Code durchzusteigen. Im Moment frage ich mich, warum einige Richtungsvektoren mehr und andere weniger gedämpft werden, da mein ursprünglicher Ansatz ja ganz anders vorgesehen war. Dort hat man die Dämpfung anhand der Verbindugnen angegeben, wie Stoßdämpfer eben egal welchen Richtungsvektor diese hatten.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Markus2

BeitragFr, Nov 16, 2007 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist so weil ich den Reifen als einen Punkt simuliert habe und
mir quasi die Auflagefläche fehlt .
Die anderen Punkte sind da nur indirekt von betroffen .

Wenn du dir das als Auflagefläche vorstellst
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
#######################X
#######################X
#######################X
ist die erstens breiter als hoch und wenn
das Rad rollt bzw. gelagert ist wird diese X Achse nicht gebremst sei
denn man hält die Rotation fest was gleich dem festhalten des Punktes ist

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Nov 17, 2007 2:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, entweder es ist doch nicht so einfach oder ich stelle mich einfach sehr blöd dar. Ich habe nun bestimmt schon eine Millionen Variationen von Codekombinationen die so durch mein Kopf rum schwirrten ausprobiert, und keines davon hat auch nur annährend funktioniert.

Es fängt schon damit an, dass CollisionN# das Kollisionsergebnis nicht abhängig vom Objektwinkel ausmacht. Sicherlich ist es für die meisten Fälle so besser, doch so muss ich mir es erst umständlich mithilfe eines weiteren Pivots selbst ausrechnen. Dann das zusammenrechnen von drei verschiedenen 3D-Vektoren.

- Geschwindigkeitsvektor des Rades (also XSpeed, YSpeed, ZSpeed)
- Kollisionsvektor zwischen Radmitte und Kollisionspunkt
- Ausrichtungsvektor des Rades selbst (ausgehend der Radachse)

Ändert sich auch nur ein Vektor von den dreien, so wird das Endergebnis dabei reagieren müssen. Meine Frage nun:
Wie bringe ich alle drei Vektoren hier zusammen?
Lösbar mit einer 'einfachen' Kreuzproduktberechnung?

Hat denn keiner dazu eine Idee? Mein Kopft explodiert gleich.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Markus2

BeitragSa, Nov 17, 2007 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das Rad auf der Straße zu halten kannste LinePick benutzen oder
die Collision benutzen oder beides .
Die Collision verhindert das eindringen in den Boden und in andere
Objekte .

CollisionN brauchste erstmal gar nicht,du mußt nur wissen wie gut
das Rad auf der Fahrbahn steht .
Dafür habe ich einen Wert zwischen 0 und 1 benutzt .
0 ist Boden und 1 ist Luft .

Das 3D Modell vom Rad würde ich nur als Anzeige benutzen
und an nem Pivot hängen .
Beim Pivot sagste wo er ist und den Lenkeinschlag .
Das Rad selber kannste rotieren lassen nach der Motor Drehzahl
oder der Geschwindigkeit des Autos .

Bei der Collision würde ich das Rad (Pivot) als Kugel behandeln die
an anderen Gegenständen vorbei gleitet .
Das abprallen von z.B. Wänden sollte von selbst passieren
da sich dein (gesamtes) Modell ja spannt und wieder entspannt .

Ich glaube das Thema hast du nicht gesehen ,
da sind ein paar Bilder von mir .
https://www.blitzforum.de/foru...hp?t=25740
Hast du auch BlitzMax ?
.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 18, 2007 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Markus2; ja, BlitzMax habe ich mir vor paar Monaten geleistet und bin in dieser Sprache auch wirklich noch ein absoluter Noob. Ich benomme ja noch nichtmal ein einfaches ''Hello World'' -Programm ohne Unterstützung vorhandener Codebeispiele hin, da ich noch einfach kein Syntax von kenne. Gestern erst habe ich mit voller Bewunderung festgestellt, dass man einer Variable ganze Variablenketten übergeben kann Local Werte#[]=[0.1#,0.2#,0.3#,1.0#]. cool Cool

Deine AutoDemo.exe -Demo gefiel mir schon an dem ersten Tag sehr gut, doch ist die Simulation ja in 2D welches mir ja persönlich kein Kopfzerbrechen bereitet. Ich habe Probleme mit dem umrechnen im 3D-Raum, wenn es um mehr als einfache Bewegungsvektoren geht, wie in diesem Fall eben die Hinzunahme von frei rumschwirrenden Winkeln. Ich bin zumindest soweit, dass ich eine Sphere mit den Cursor bewegen kann und mir eine Anzeige links oben anzeigt, wie schnell sich die Sphere tatsächlich bewegen könnte, wenn die Reibung an dieser auch angewendet werden würde. Also man will in eine Richtung bewegen und diese Funktion könnte dann bestimmen, inwieweit die Bewegung in die jeweilige Richtung auch stattfinden soll. Hier ist als Bezugspunkt fest hardcodet und ohne weiterer Berücksichtigung der Boden festgelegt.

Code: [AUSKLAPPEN]
;angle in degree
;
;Local angle#
;Local x#,z#
;Local sn#,cs#
;Local xc#,zc#
;
;sn = Sin(angle)
;cs = Cos(angle)
;
;xc=x
;zc=z
;
;x =  cs*xc + sn*zc
;z = -sn*xc + cs*zc

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)

Local Camera=CreateCamera()
PositionEntity Camera,-.2,5,-8
RotateEntity Camera,30,0,0

Local Light=CreateLight()
RotateEntity Light,40,0,0
LightColor Light,224,224,224
AmbientLight 64,64,64

Local Plane=CreatePlane()
Local Mirror=CreateMirror()
EntityColor Plane,64,64,64
EntityAlpha Plane,.5
EntityType Plane,2

Local Cube1=CreateCube()
PositionEntity Cube1,-4,0,0
RotateEntity Cube1,0,0,45
ScaleEntity Cube1,2,2,2
EntityType Cube1,2

Local Cube2=CreateCube()
PositionEntity Cube2,+6,2,0
;RotateEntity Cube2,0,0,45
ScaleEntity Cube2,2,2,2
EntityType Cube2,2

Local Sphere=CreateSphere(32)
PositionEntity Sphere,0,1,0
EntityRadius Sphere,1,1
EntityType Sphere,1

Local Tube=CreateCylinder(32,1,Sphere)
ScaleEntity Tube,.1,1.1,.1
RotateEntity Tube,0,0,90

Local Shape=CreateSphere(32,Sphere)
ScaleEntity Shape,.02,1.2,1.2
EntityColor Shape,255,0,0
EntityAlpha Shape,.25
EntityFX Shape,1

Local Pivot=CreateCube(Sphere)
PositionEntity Pivot,1,0,0
ScaleEntity Pivot,.2,.2,.2
EntityColor Pivot,255,0,0

Local Winkel#
Local XP#,YP#,ZP# ;Aktuelle Positionen
Local XA#,YA#,ZA# ;Alte Positionen
Local XV#,YV#,ZV# ;Resultierende Vektoren
Local RX#,RY#,RZ# ;Relative Position
Local CX#,CY#,CZ# ;Kollisions Position

Local LX#,LY#,LZ#
Local AX#,AY#,AZ#
Local NX#,NY#,NZ#

Collisions 1,2,2,2



; Rad Nullpunkt - Normale = Kollipunkt auf Rad
; Kollisionspunkt + Normale = Kollipunkt auf Kollisionskugel / Kreis



While Not KeyHit(1)
   TranslateEntity Sphere,0,-.02,0
   If KeyDown(30) Then TurnEntity Sphere,+2,0,0
   If KeyDown(44) Then TurnEntity Sphere,-2,0,0
   If KeyDown(31) Then TurnEntity Sphere,0,+2,0
   If KeyDown(45) Then TurnEntity Sphere,0,-2,0
   If KeyDown(32) Then TurnEntity Sphere,0,0,+2
   If KeyDown(46) Then TurnEntity Sphere,0,0,-2
   If KeyDown(203) Then TranslateEntity Sphere,-.05,0,0
   If KeyDown(205) Then TranslateEntity Sphere,+.05,0,0
   If KeyDown(200) Then TranslateEntity Sphere,0,0,+.05
   If KeyDown(208) Then TranslateEntity Sphere,0,0,-.05
   If KeyDown(57) Then
      Winkel=Winkel+5
      TranslateEntity Sphere,Cos(Winkel)*.05,0,Sin(Winkel)*.05
   End If
   
   XA=XP:XP=EntityX(Sphere)
   YA=YP:YP=EntityY(Sphere)
   ZA=ZP:ZP=EntityZ(Sphere)
   XV=XA-XP
   YV=YA-YP
   ZV=ZA-ZP
   
   RX=EntityX(Pivot,1)-EntityX(Sphere,1)
   RY=EntityY(Pivot,1)-EntityY(Sphere,1)
   RZ=EntityZ(Pivot,1)-EntityZ(Sphere,1)
   
   WaitTimer(Timer)
   UpdateWorld
   RenderWorld
   
   Color 64,64,64
   Line 102,52,102,152
   Line 52,102,152,102
   Rect 52,52,100,100,0
   Color 255,255,255
   
   For x=1 To CountCollisions(Sphere)
      CX=-CollisionNX(Sphere,x)
      CY=-CollisionNY(Sphere,x)
      CZ=-CollisionNZ(Sphere,x)
      
      ;BIG BUG ;Kreuzprodukt
      NX# = (YV# * RZ#)-(ZV# * RY#)
      NY# = (ZV# * RX#)-(XV# * RZ#)
      NZ# = (XV# * RY#)-(YV# * RX#)
      
      Rect 100,100+NY*1000,5,5,1
      
      Text -80+x*100,500,"C(XYZ)"
      Text -80+x*100,520,CX
      Text -80+x*100,540,CY
      Text -80+x*100,560,CZ
      
;      Text -80+x*100,20,NX
;      Text -80+x*100,40,NY
;      Text -80+x*100,60,NZ
      
;      Oval 20,90,100,100,0
;      Winkel=ATan2(CollisionNX(Sphere,1),CollisionNY(Sphere,1))
;      Line 70,140,70-Sin(Winkel)*50,140+Cos(Winkel)*50
      
;      Rect 618+(CollisionNZ(Sphere,x)*-(EntityZ(Sphere,1)-EntityZ(Pivot,1)))*20,318+(CollisionNY(Sphere,x)*-(EntityY(Sphere,1)-EntityY(Pivot,1)))*20,4,4,1
;      Rect 618+(CollisionNX(Sphere,x)*-(EntityX(Sphere,1)-EntityX(Pivot,1)))*20,418+(CollisionNZ(Sphere,x)*-(EntityZ(Sphere,1)-EntityZ(Pivot,1)))*20,4,4,1
;      Rect 618+(CollisionNX(Sphere,x)*-(EntityX(Sphere,1)-EntityX(Pivot,1)))*20,518+(CollisionNY(Sphere,x)*-(EntityY(Sphere,1)-EntityY(Pivot,1)))*20,4,4,1
      
;      Rect  (CZ-RZ)  *20+638,  (CY-RY)  *20+338,4,4,1
;      Rect  (CX-RX)  *20+638,  (CZ-RZ)  *20+438,4,4,1
;      Rect  (CX-RX)  *20+638,  (CY-RY)  *20+538,4,4,1
   Next
   
;   Text 670,310,"Von LINKS"
;   Text 670,410,"Von OBEN"
;   Text 670,510,"Von VORNE"
;   Oval 600,300,40,40,0
;   Oval 600,400,40,40,0
;   Oval 600,500,40,40,0
;   Oval 580,280,80,80,0
;   Oval 580,380,80,80,0
;   Oval 580,480,80,80,0
   
   Text 20,400,"R(XYZ)"
   Text 20,420,RX
   Text 20,440,RY
   Text 20,460,RZ
   
   Text 120,400,"V(XYZ)"
   Text 120,420,XV
   Text 120,440,YV
   Text 120,460,ZV
   
   Flip 0
Wend
End


Mir fehlen noch:

- Bezugspunkt anhand des Kollisionspunktes bestimmen. Hier würde also noch ein Vektor in die Berechnung mit einfliesen.

- Eine weitere Berechnung durchführen, die angibt in welche Richtung die auftretende Kraft umgelegt wird. Zum Beispiel leichtes Lenkmanöver.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Markus2

BeitragMo, Nov 19, 2007 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry ,hatte am WE keine Zeit .

Mein Autobeispiel ist schon für 3D/2D ausgelegt ,
meine 3D Hülle ist aber irgendwie instabil ,
vieleicht kannst du mir da ja helfen .
Kannst mir ja deine EMail Adresse als PN schicken dann gebe
ich dir den BMax Quelltext mit Auto Bild zum experimente machen .
Habe auch mal nen Verbindungseditor in BMax gemacht .
BMax ist leicht wenn man sich eine Weile damit beschäftigt Idea

Guck mal,ob du sowas meinst .
Ist sehr flott , also vorsichtig die Tasten drücken oder neu starten Wink

Code: [AUSKLAPPEN]

;angle in degree
;
;Local angle#
;Local x#,z#
;Local sn#,cs#
;Local xc#,zc#
;
;sn = Sin(angle)
;cs = Cos(angle)
;
;xc=x
;zc=z
;
;x =  cs*xc + sn*zc
;z = -sn*xc + cs*zc

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)

Local Camera=CreateCamera()
PositionEntity Camera,-.2,5,-8
RotateEntity Camera,30,0,0

Local Light=CreateLight()
RotateEntity Light,40,0,0
LightColor Light,224,224,224
AmbientLight 64,64,64

Local Plane=CreatePlane()
Local Mirror=CreateMirror()
EntityColor Plane,64,64,64
EntityAlpha Plane,.5
EntityType Plane,2

Local Cube1=CreateCube()
PositionEntity Cube1,-4,0,0
RotateEntity Cube1,0,0,45
ScaleEntity Cube1,2,2,2
EntityType Cube1,2

Local Cube2=CreateCube()
PositionEntity Cube2,+6,2,0
;RotateEntity Cube2,0,0,45
ScaleEntity Cube2,2,2,2
EntityType Cube2,2

Local XP#,YP#,ZP# ;Aktuelle Positionen
Local XA#,YA#,ZA# ;a
Local XV#,YV#,ZV# ;v
Local CX#,CY#,CZ# ;Kollisions Normale
Local NX#,NY#,NZ#

Local Sphere=CreateSphere(32)
XP=0
YP=4
ZP=0
PositionEntity Sphere,xp,yp,zp
EntityRadius Sphere,1,1
EntityType Sphere,1
EntityAlpha Sphere,.5

Local Tube=CreateCylinder(32,1,Sphere)
ScaleEntity Tube,.1,1.1,.1
RotateEntity Tube,0,0,90

Local Shape=CreateSphere(32,Sphere)
ScaleEntity Shape,.02,1.2,1.2
EntityColor Shape,255,0,0
EntityAlpha Shape,.25
EntityFX Shape,1

Local Pivot=CreateCube(Sphere) ;Achse
PositionEntity Pivot,1,0,0
ScaleEntity Pivot,.2,.2,.2
EntityColor Pivot,255,0,0

Collisions 1,2,2,3



; Rad Nullpunkt - Normale = Kollipunkt auf Rad
; Kollisionspunkt + Normale = Kollipunkt auf Kollisionskugel / Kreis



While Not KeyHit(1)
   ;TranslateEntity Sphere,0,-.02,0
   If KeyDown(30) Then TurnEntity Sphere,+2,0,0 ;A
   If KeyDown(44) Then TurnEntity Sphere,-2,0,0 ;Z
   If KeyDown(31) Then TurnEntity Sphere,0,+2,0
   If KeyDown(45) Then TurnEntity Sphere,0,-2,0
   If KeyDown(32) Then TurnEntity Sphere,0,0,+2
   If KeyDown(46) Then TurnEntity Sphere,0,0,-2

   XA=0
   YA=-0.015 ;Gravitation
   ZA=0

   If KeyDown(203) Then xa=-.02
   If KeyDown(205) Then xa=+.02
   If KeyDown(200) Then za=+.02
   If KeyDown(208) Then za=-.02
   
   WaitTimer(Timer)
   
   Color 64,64,64
   Line 102,52,102,152
   Line 52,102,152,102
   Rect 52,52,100,100,0
   Color 255,255,255
   
   For x=1 To CountCollisions(Sphere)
      CX=CollisionNX(Sphere,x)
      CY=CollisionNY(Sphere,x)
      CZ=CollisionNZ(Sphere,x)

      ;--------------------------------
      Local vdot#,optimizedP#
      vdot=xv*cx + yv*cy + zv*cz
      optimizedP = 2.0 * vdot
      xv =xv - optimizedP * cx
      yv =yv - optimizedP * cy
      zv =zv - optimizedP * cz

      xv =xv *0.9
      yv =yv *0.9
      zv =zv *0.9
 
      ;--------------------------------
     
      ;Rad langsam ausrichten wie Oberflächen Normale
      If Abs(CY)>0.1 Then AlignToVector Sphere,CX,CY,CZ,2,0.25
           
      Rect 100,100+NY*1000,5,5,1
       
      Text -80+x*100,500,"Normale C(XYZ)"
      Text -80+x*100,520,CX
      Text -80+x*100,540,CY
      Text -80+x*100,560,CZ
       
      Text -80+x*200,500,"C(XYZ)"
      Text -80+x*200,520,EntityY(Sphere)-1 > CollisionY(Sphere,x)
       
   Next

   ;Geschwindigkeit
   XV=XV+XA
   YV=YV+YA
   ZV=ZV+ZA

   ;neue Pos.
   XP=XP+XV
   YP=YP+YV
   ZP=ZP+ZV

   PositionEntity Sphere,XP,YP,ZP

   PointEntity Camera,Sphere,0
   RotateEntity Camera,15,EntityYaw(Camera),0

   UpdateWorld
   RenderWorld

   XP=EntityX(Sphere,True)
   YP=EntityY(Sphere,True)
   ZP=EntityZ(Sphere,True)
       
   Text 120,400,"V(XYZ)"
   Text 120,420,XV
   Text 120,440,YV
   Text 120,460,ZV
   
   Flip 0
Wend
End

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 20, 2007 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code ist sehr lustig, aber leider nicht das was ich brauche. Dennoch wird der Code nicht in die Tonne geworfen, da der Code noch eine interessante Sache hat, die ich noch durcharbeiten will (Abprallwinkel im 3D-Raum). Nach einer Meshausrichtung habe ich vor ein paar Monaten schon mal hier gefragt und BIG BUG hat mir dazu ein gutes Beispiel gegeben.

Was ich brauche ist eine Umlenkung des Rades bei einer Kollision. Die Umlenkung kann auch ’’geradeaus’’ sein, wenn das Rad eben den gleichen Bewegungsvektor und Ausrichtungsvektor hat. Kommt das Rad aber seitlich auf das Terrain, so muss es abgebremst werden, wie jeder andere Knotenpunkt der Verbindungsphysik auch.

Mir bekannte Variablen sind eben:

- Position des Rades (durch EntityX()…)
- Bewegungsvektor des Rades (direkt durch die Verbindungsphysik)
- Ausrichtungsvektor des Rades (Durch die Verbindungsphysik PosStart zu PosEnde)
- Kollisionsnormale auf das Terrain (durch CollisionsNX()…)

Ich will im Übrigen mein Auto ja nicht so aufbauen, wie es z.B. bei der Driver-Demo der Fall ist. Ich will mein Auto aufgrund verschiedener Verbindungen durch eine Verbindungsphysik nachbauen. Dadurch hab ich ein sehr viel realistischeres Fahrverhalten und kann anhand der Verbindungen auch die Fahreigenschaften verändern.

Damit man sich das ganze etwas besser vorstellen kann, hier mal ein älterer Beispielcode:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)

rp=CreatePivot()

Local Camera=CreateCamera()
CameraClsColor Camera,80,80,60
PositionEntity Camera,-20,4,-20

Local light=CreateLight()
RotateEntity light,60,0,0

Global Mesh=CreateMesh()
Global Face=CreateSurface(Mesh)
EntityFX Mesh,1+2+32

Dim kp%(17)
Dim vk#(58,2)
Dim xg#(58)
Dim yg#(58)
Dim zg#(58)
Local dx#=0
Local dy#=0
Local dz#=0
Local ds#=0
Local lk#=0

Restore KP
For q=1 To 17
   Read dx,dy,dz,gt
   If gt=0 Then kp(q)=CreatePivot()
   If gt=1 Then kp(q)=CreatePivot():EntityType kp(q),1:EntityRadius kp(q),.1
   If gt=2 Then kp(q)=CreateSphere(12):EntityType kp(q),1:EntityRadius kp(q),2.4:ScaleEntity kp(q),2.4,2.4,2.4:EntityColor kp(q),64,64,64
   VertexColor Face,AddVertex(Face,0,0,0),dy*120-240,dy*120-240,dy*120-240,1
   PositionEntity kp(q),dx,dy,dz
Next

Restore VK
For q=1 To 58
   Read a,b
   vk(q,0)=a
   vk(q,1)=b
   vk(q,2)=EntityDistance(kp(vk(q,0)),kp(vk(q,1)))
Next

Local plane=CreatePlane()
Local mirror=CreateMirror()
EntityColor plane,40,40,30
PositionEntity mirror,0,-10,0
PositionEntity plane,0,-10,0
EntityAlpha plane,.75
EntityType plane,2

Local cube=CreateCube()
ScaleEntity cube,20,20,20
RotateEntity cube,45,25,0
PositionEntity cube,0,-9.9,200
EntityType cube,2

AddTriangle Face,0,1,2
AddTriangle Face,0,8,7
AddTriangle Face,0,7,1
AddTriangle Face,0,2,8
AddTriangle Face,1,3,4
AddTriangle Face,4,2,1
AddTriangle Face,5,6,8
AddTriangle Face,8,7,5
AddTriangle Face,1,2,5
AddTriangle Face,5,2,6
AddTriangle Face,3,7,4
AddTriangle Face,4,7,8
AddTriangle Face,1,5,3
AddTriangle Face,3,5,7
AddTriangle Face,2,4,6
AddTriangle Face,6,4,8
Collisions 1,2,2,2


;====-===-==-=-=--=---=----=---- --- -- - -  -   -    -


While Not KeyHit(1)
   For w=1 To 3
      For q=1 To 54
         ds=vk(q,2)-EntityDistance(kp(vk(q,0)),kp(vk(q,1)))
         PositionEntity rp,EntityX(kp(vk(q,0))),EntityY(kp(vk(q,0))),EntityZ(kp(vk(q,0)))
         PointEntity rp,kp(vk(q,1)),0
         MoveEntity rp,0,0,ds
         dx=(EntityX(kp(vk(q,0)))-EntityX(rp))/4
         dy=(EntityY(kp(vk(q,0)))-EntityY(rp))/4
         dz=(EntityZ(kp(vk(q,0)))-EntityZ(rp))/4
         MoveEntity kp(vk(q,0)),+dx,+dy,+dz
         MoveEntity kp(vk(q,1)),-dx,-dy,-dz
         xg(vk(q,0))=xg(vk(q,0))+dx
         yg(vk(q,0))=yg(vk(q,0))+dy
         zg(vk(q,0))=zg(vk(q,0))+dz
         xg(vk(q,1))=xg(vk(q,1))-dx
         yg(vk(q,1))=yg(vk(q,1))-dy
         zg(vk(q,1))=zg(vk(q,1))-dz
      Next
      
      For q=55 To 58
         ds=vk(q,2)-EntityDistance(kp(vk(q,0)),kp(vk(q,1)))
         PositionEntity rp,EntityX(kp(vk(q,0))),EntityY(kp(vk(q,0))),EntityZ(kp(vk(q,0)))
         PointEntity rp,kp(vk(q,1)),0
         MoveEntity rp,0,0,ds
         dx=(EntityX(kp(vk(q,0)))-EntityX(rp))/24
         dy=(EntityY(kp(vk(q,0)))-EntityY(rp))/24
         dz=(EntityZ(kp(vk(q,0)))-EntityZ(rp))/24
         MoveEntity kp(vk(q,0)),+dx,+dy,+dz
         MoveEntity kp(vk(q,1)),-dx,-dy,-dz
         xg(vk(q,0))=xg(vk(q,0))+dx/6
         yg(vk(q,0))=yg(vk(q,0))+dy/6
         zg(vk(q,0))=zg(vk(q,0))+dz/6
         xg(vk(q,1))=xg(vk(q,1))-dx/8
         yg(vk(q,1))=yg(vk(q,1))-dy/8
         zg(vk(q,1))=zg(vk(q,1))-dz/8
      Next
   Next
   
   FreeEntity vkmesh
   vkmesh=CreateMesh()
   vkface=CreateSurface(vkmesh,brush)
   EntityFX vkmesh,3
   
   For q=1 To 20
      For w=1 To 58
         x1#=EntityX(kp(vk(w,0)))
         y1#=EntityY(kp(vk(w,0)))
         z1#=EntityZ(kp(vk(w,0)))
         x2#=EntityX(kp(vk(w,1)))
         y2#=EntityY(kp(vk(w,1)))
         z2#=EntityZ(kp(vk(w,1)))
         x3#=Rnd(-.2,.2)+(x1+x2)/2
         y3#=Rnd(-.2,.2)+(y1+y2)/2
         z3#=Rnd(-.2,.2)+(z1+z2)/2
         v0=AddVertex(vkface,x1,y1,z1)
         v1=AddVertex(vkface,x2,y2,z2)
         v2=AddVertex(vkface,x3,y3,z3)
         If w<55 Then
            VertexColor vkface,v0,128,128,128   
            VertexColor vkface,v1,128,128,128   
            VertexColor vkface,v2,128,128,128   
         Else
            VertexColor vkface,v0,255,0,0   
            VertexColor vkface,v1,255,0,0   
            VertexColor vkface,v2,255,0,0   
         End If
         AddTriangle vkface,v0,v1,v2
      Next
   Next
   
   UpdateWorld
   
   vertexcounter=0
   For q=1 To 17
      yg(q)=yg(q)-.0025
      MoveEntity kp(q),xg(q),yg(q),zg(q)
      If CountCollisions(kp(q))>0 Then
         xg(q)=xg(q)/1.2
         yg(q)=yg(q)/1.2
         zg(q)=zg(q)/1.2
      End If
      VertexCoords Face,vertexcounter,EntityX(kp(q)),EntityY(kp(q)),EntityZ(kp(q))
      vertexcounter=vertexcounter+1
   Next
   
   If KeyDown(57)
      yg(6)=yg(6)+.015
      yg(7)=yg(7)+.015
      yg(8)=yg(8)+.015
      yg(9)=yg(9)+.015
   End If
   
   If KeyDown(203) Then xg(1)=xg(1)-.05
   If KeyDown(205) Then xg(1)=xg(1)+.05
   If KeyDown(200) Then zg(1)=zg(1)+.05
   If KeyDown(208) Then zg(1)=zg(1)-.05
   
   If KeyHit(28) Then fest=1-fest
   ds=(EntityDistance(Camera,kp(1)))-30
   If fest=0 Then MoveEntity Camera,MouseXSpeed(),(ds/8)-MouseYSpeed(),ds
   PointEntity Camera,kp(1)
   MoveMouse 400,300
   
   RenderWorld
   
   ms=MilliSecs()
   If ms>mt Then mt=ms+254:fps=frame:frame=0 Else frame=frame+4
   Text 0,0,fps+" fps"
   
   WaitTimer(Timer)
   Flip 0
Wend
End


;====-===-==-=-=--=---=----=---- --- -- - -  -   -    -


.KP
Data 0,8,-2,1
Data -4,2,7,1,4,2,7,1,-4,2,-7,1,4,2,-7,1
Data -4,6,8,1,4,6,8,1,-4,6,-8,1,4,6,-8,1
Data -4,8,6,0,4,8,6,0,-4,8,-6,0,4,8,-6,0
Data -5,2,6,2,5,2,6,2,-5,2,-6,2,5,2,-6,2

.VK
Data 01,02,01,03,01,04,01,05,02,04,03,05
Data 02,03,04,05,02,05,03,04,06,08,07,09
Data 06,07,08,09,06,09,07,08,02,06,04,08
Data 02,08,04,06,03,07,05,09,03,09,05,07
Data 02,07,03,06,04,09,05,08,10,12,11,13
Data 10,11,12,13,10,13,11,12,02,10,04,12
Data 02,12,04,10,03,11,05,13,03,13,05,11
Data 02,11,03,10,04,09,05,08,03,14,05,14
Data 02,15,04,15,03,16,05,16,02,17,04,17
Data 10,14,11,15,12,16,13,17


;====-===-==-=-=--=---=----=---- --- -- - -  -   -    -


Man kann mit Cursor die Fahrzeugspitze in jeweiliger Richtung drücken. Mit Space kann man das Fahrzeug anheben bzw. umdrehen. Wie man sieht, verhalten sich die Räder so, wie jeder andere Eckpunkt am Fahrzeug auch, nur mit dem Unterschied, dass die Räder eine andere/weichere Aufhängung haben.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Markus2

BeitragDi, Nov 20, 2007 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das gleiche vor , nur soll die Darstellung erstmal in 2D sein .
Über normale Formeln habe ich keine gescheite Auto Physik hinbekommen
und über diese Verbindungen scheint es mir einfacher zu sein .

Dein Problem wird sein das du dein Rad so drehen mußt das vorne vorne ist
und links links und oben oben , dafür kannst du in BB die Transform
Befehle nutzen . z.B. für den Geschwindigkeitsvector nen Pivot nehmen
den du ans Rad hängst , drehst manipulierst drehst und wieder ausließt .
Wie ich das in 2D gemacht habe .

Dann kannst du einfach sagen links und rechts darf es wenig bewegt werden und in roll richtung wird es nur sehr wenig gedämpft .
Heißt wenn du nen Würfel als Karosse nimmst das er sich auch überschlagen würde aber nach vorne rutschen darf .

In meinem Auto Quelltext habe ich die Würfel Punkte auskommentiert
weil die Form nicht stabil bleibt .

Beim Rad ist nur wichtig ob es Kontakt hat was einem festhalten nahe kommt . In Z Richtung ist es gelagert und rollt
und seitlich eher nen Radiergummi Smile

Damit sich mein Auto nicht in 2D überschlägt wollte ich einfach die Räder
auf eine mindest höhe festhalten . Also nur so das die Räder ein bischen
abheben und Kontakt verlieren damit es richtig ins schleudern kommt .

Sobald ich viele Verbinder nutze und ne 3D Karosse forme
passiert sowas wie ne Kettenreaktion und mir fliegt alles auseinander Sad

Das mit dem Ping Pong (abprallen) ist wie Raytracing .

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group