Verzerrter Cube
Übersicht

![]() |
Ecoman68Betreff: Verzerrter Cube |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
gibt es eine Möglichkeit die Kantenlängen eines Cubes von einander unabhängig zu beeinflussen? Im folgendem Beispiel, kann ich mit Hilfe von "ScaleEntity" immer nur alle Kanten des Cubes manipulieren: Code: [AUSKLAPPEN] Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer() Global camera=CreateCamera() Global cube=CreateCube() PositionEntity cube, 0, 0, 5 RotateEntity cube, 25,10,15 ScaleEntity cube, 1, 0.3, 1 While Not KeyHit(1) WireFrame(1) UpdateWorld RenderWorld Flip Wend Ich möchte jedoch, daß einzelne Kantenlängen explizit definiert werden können, um im späteren Endresultat eine Art wackelnden Gelantine-Cube erstellen zu können. Hat hierfür jemand einen Tipp für mich? Auf meiner Suche wurde ich leider bisher nicht fündig... ![]() Vielen Dank! Gruß, Ecoman68 ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst dir ein Cude selbst aus Vertices und Triangles zusammen basteln. Stichwort: Singlesurface
Das wackeln dagegen kannst du dann mithilfe einer Physiklibrary berechnen lassen. Dazu gibt es hier im Codearchiv ein paar Beispiele. Eines davon ist mein 4WD-Physik-Buggy in 3D. Die Physikthematik beruht auf die Berechnungsmethode (dank Benibaerenstark konnte ich mich darin weiter informieren) von Verlet. Falls du ein vereinfachtes Würfelmodel benötigst, so kann ich auch den Code dazu posten. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Ecoman68 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo hectic,
Danke für die schnelle Antwort. Ich werde mal im Codearchiv suchen gehen. Solltest Du einen Würfelcode parat haben, wäre ich dafür natürlich dankbar. Bis denne! Gruß, Ecoman68 ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ist mal ein alter Code von mir. Im grunde das gleiche wie mein Buggy, nur sehr viel einfacher, da es nur wenige Elemente besitzt:
Code: [AUSKLAPPEN] Graphics3D 800,600,0,1
SetBuffer BackBuffer() Local Timer=CreateTimer(100) Local Light=CreateLight() Local Camera=CreateCamera() RotateEntity Light,-30,30,0 CameraClsColor Camera,64,64,96 PositionEntity Camera,0,-3,-12 Local RP=CreatePivot() Dim KP%(7);KnotenPunkte Dim VK#(27,2);VerKlinkungen Dim XG#(27);X-Geschwindigkeit Dim YG#(27);Y-Geschwindigkeit Dim ZG#(27);Z-Geschwindigkeit Local DX#=0,DY#=0,DZ#=0,DS#=0,Position%=0 ;KnotenPunkte Restore KP For q=0 To 7 Read DX,DY,DZ KP(q)=CreateSphere(16) ScaleEntity KP(q),.3,.3,.3 PositionEntity KP(q),DX,DY,DZ EntityRadius KP(q),.3 EntityType KP(q),1 Next ;VerKlinkungen Restore VK For q=0 To 27 Read a,b VK(q,0)=a VK(q,1)=b VK(q,2)=EntityDistance(KP(VK(q,0)),KP(VK(q,1))) Next ;Boden erstellen Local plane=CreatePlane() Local mirror=CreateMirror() RotateEntity plane,0,0,8 RotateEntity mirror,0,0,8 PositionEntity plane,0,-4,0 PositionEntity mirror,0,-4,0 EntityAlpha plane,.8 EntityType plane,2 Collisions 1,2,2,1 ;====-===-==-=-=--=---=----=---- --- -- - - - - - While Not KeyHit(1) For w=1 To 1 For q=0 To 27 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 Next UpdateWorld For q=0 To 7 YG(q)=YG(q)-.001 MoveEntity KP(q),XG(q),YG(q),ZG(q) If CountCollisions(KP(q))>0 Then XG(q)=0:YG(q)=0:ZG(q)=0 Next If KeyHit(29) Then Position=Position-1:If Position<0 Then Position=7 If KeyHit(56) Then Position=Position+1:If Position>7 Then Position=0 For q=0 To 7:EntityColor KP(q),240,240,240:Next EntityColor KP(Position),255,0,0 If KeyDown(203) Then XG(Position)=XG(Position)-.01 If KeyDown(205) Then XG(Position)=XG(Position)+.01 If KeyDown(200) Then YG(Position)=YG(Position)+.01 If KeyDown(208) Then YG(Position)=YG(Position)-.01 WaitTimer(Timer) RenderWorld Flip 0 Wend End ;====-===-==-=-=--=---=----=---- --- -- - - - - - .KP;08-Koordinaten der KnotenPunkte Data -01,-01,-01, -01,-01,+01, -01,+01,-01, -01,+01,+01 Data +01,-01,-01, +01,-01,+01, +01,+01,-01, +01,+01,+01 .VK;28-Verweise der VerKlinkungen Data 00,01, 00,02, 00,03, 00,04, 00,05, 00,06, 00,07, 01,02, 01,03, 01,04 Data 01,05, 01,06, 01,07, 02,03, 02,04, 02,05, 02,06, 02,07, 03,04, 03,05 Data 03,06, 03,07, 04,05, 04,06, 04,07, 05,06, 05,07, 06,07 ;====-===-==-=-=--=---=----=---- --- -- - - - - - Der Code ist schon etwas älter. Daher hab erbarmen. Ich bin aber denoch mal schnell den Code überflogen, und habe ein paar 'Updates' darin gemacht. Mit Cursor, kannst du den roten Punkt in jeweilige Richtung beschleunigen Mit Strg und Alt kannst du den nächsten oder vorherigen Punkt anwählen Da dieser Code für eine Physikfunktion gedacht ist, sollte bereits bei einmaligem Durchlauf eine äusserst stabile Konstruktion bestehen. Benötigst du sie noch stabiler, so müssen mehrere Durchläufe pro Frame gemacht werden, was auch mehr Rechenzeit bedeutet. Da du aber ein Schwabelwürfel haben willst (eine Verunglimpfung meines Codes), solltest du die drei ''.../4'' durch ''.../200'' oder so ersetzen. Weniger als ''4'' würde eine Übersteuerung bedeuten und sollte nur angewendet werden, wenn man weiß was man tut. Eine Übersteuerung macht das Konstrukt zwar härter, kann aber zu einer 'Selbstzerstörung' der Konstruktion führen. Viel Spaß! Edit1: Ach Misst! Ich sehe grade wie Hardcodet (Array mit festgelegter Anzahl etc.) das ganze noch ist. Ist echt noch eines meiner frühen Anfänge, sorry. Sollte aber zum Verstäntnis nicht weiter störend sein. Edit2: Falls du mit dem Code weiter arbeiten willst, so tue dir selbst einen Gefallen, und ersetze Local RP=CreatePivot() und alles was damit in Verbindung steht durch eigene Berechnung mithilfe TFormNormal...TFormVector. Ansonsten ist es 'quick and dirty'. |
||
![]() |
Ecoman68 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo hectic,
vielen Dank für das Beispiel. Das wird mir wirklich helfen. Ich habe die letzten Tage ziemlich erfolglos rumgegoogelt, obwohl mir letztendlich die Programmiersprache eigentlich egal ist. Inzwischen ist der Cube per Triangles aufgebaut. Anbei das Codebeispiel für Interessierte: Code: [AUSKLAPPEN] ;Grafik
Graphics3D 1024,768,0,2 SetBuffer BackBuffer() ;Erzeugung der Kamera camera=CreateCamera() MoveEntity camera, 0,0,-15 ;Erzeugung des Mesh mesh = CreateMesh() face = CreateSurface(mesh) ;Definition der Vertex v0 = AddVertex (face,-5, 5, 5) v1 = AddVertex (face, 5, 5, 5) v2 = AddVertex (face, 5,-5, 5) v3 = AddVertex (face,-5,-5, 5) v4 = AddVertex (face,-5, 5,-5) v5 = AddVertex (face, 5, 5,-5) v6 = AddVertex (face, 5,-5,-5) v7 = AddVertex (face,-5,-5,-5) ;Aufbau der Seiten t1 = AddTriangle (face,v1,v0,v3) t2 = AddTriangle (face,v3,v2,v1) t3 = AddTriangle (face,v7,v4,v5) t4 = AddTriangle (face,v5,v6,v7) t5 = AddTriangle (face,v5,v1,v2) t6 = AddTriangle (face,v2,v6,v5) t7 = AddTriangle (face,v3,v0,v4) t8 = AddTriangle (face,v4,v7,v3) t9 = AddTriangle (face,v5,v4,v0) t10= AddTriangle (face,v0,v1,v5) t11= AddTriangle (face,v3,v7,v6) t12= AddTriangle (face,v6,v2,v3) pitch = 0 yaw = 0 roll = 0 wire = 1 ;Hauptschleife While Not KeyHit(1) WireFrame(wire) ;Ziffern 1-7 zur Steuerung: If KeyDown( 2 )=True Then pitch=pitch-1 If KeyDown( 3 )=True Then pitch=pitch+1 If KeyDown( 4 )=True Then yaw=yaw-1 If KeyDown( 5 )=True Then yaw=yaw+1 If KeyDown( 6 )=True Then roll=roll-1 If KeyDown( 7 )=True Then roll=roll+1 ;Ziffer 7 = Solid an/aus: If KeyDown( 8 )=True Then While KeyDown(8) Wend If wire=0 Then wire=1 Else wire=0 EndIf EndIf RotateEntity mesh,pitch,yaw,roll UpdateWorld RenderWorld Flip Wend End Also noch mal vielen Dank und ein dickes Lob für Deine Antwortgeschwindigkeit und Deine wirklich guten Beispiele! ![]() Gruß, Ecoman68 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group