Probleme mit 3D-Geometrie
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Probleme mit 3D-Geometrie |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ? . |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Guck mal,ob du sowas meinst . Ist sehr flott , also vorsichtig die Tasten drücken oder neu starten ![]() 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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() Das mit dem Ping Pong (abprallen) ist wie Raytracing . |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group