Verzerrter Cube

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Ecoman68

Betreff: Verzerrter Cube

BeitragMi, Nov 14, 2007 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Sad

Vielen Dank!

Gruß,
Ecoman68 Twisted Evil

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 14, 2007 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 14, 2007 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Twisted Evil

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 14, 2007 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 14, 2007 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Razz

Gruß,
Ecoman68 Twisted Evil

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group