[B3D] Twisted Cube

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: [B3D] Twisted Cube

BeitragSo, Mai 10, 2009 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Twisted Cubes
Function CreateCube_Twisted(StartRot#, EndRot#, DivCount=10, TopBottom=1, Parent=0)
   Local VList[4], LVList[4]
   ;Create Mesh/Surface
   Mesh = CreateMesh(Parent)
      Surf = CreateSurface(Mesh)
   
   ;Get Subdivide Count
   Local SubDivCount = (EndRot# - StartRot#) / DivCount + 1               ;We dont need Vertex Spam :)
   If EndRot# < StartRot# SubDivCount = (StartRot# - EndRot#) / DivCount + 1   ;StartRot > EndRot? OK, lets change their positions
   Local YAddValue# = 2.0/SubDivCount
   Local RotAddValue# = (EndRot# - StartRot#) / SubDivCount
   
   ;Generate Cube:D
   If TopBottom = 1
   ;Bottom
      VList[1] = AddVertex(Surf, Cos(StartRot#), -1, Sin(StartRot#), 0, 0)
      VList[2] = AddVertex(Surf, Cos(StartRot#+90), -1, Sin(StartRot#+90), 0, 1)
      VList[3] = AddVertex(Surf, Cos(StartRot#+180), -1, Sin(StartRot#+180), 1, 1)
      VList[4] = AddVertex(Surf, Cos(StartRot#+270), -1, Sin(StartRot#+270), 1, 0)
      
      AddTriangle Surf, VList[1], VList[2], VList[3]
      AddTriangle Surf, VList[1], VList[3], VList[4]
   
   ;Top
      VList[1] = AddVertex(Surf, Cos(EndRot#), 1, Sin(EndRot#), 0, 0)
      VList[2] = AddVertex(Surf, Cos(EndRot#+90), 1, Sin(EndRot#+90), 0, 1)
      VList[3] = AddVertex(Surf, Cos(EndRot#+180), 1, Sin(EndRot#+180), 1, 1)
      VList[4] = AddVertex(Surf, Cos(EndRot#+270), 1, Sin(EndRot#+270), 1, 0)
      
      AddTriangle Surf, VList[3], VList[2], VList[1]
      AddTriangle Surf, VList[4], VList[3], VList[1]
   EndIf
   
   Local CurY# = -1
   Local CurRot# = 0
   For CurSubDiv = 1 To SubDivCount + 1
      If CurSubDiv = 1
         VList[1] = AddVertex(Surf, Cos(StartRot# + CurRot#), CurY#, Sin(StartRot# + CurRot#), 0, CurY#/2+.5)
         VList[2] = AddVertex(Surf, Cos(StartRot# + CurRot# + 90), CurY#, Sin(StartRot# + CurRot# + 90), 1, CurY#/2+.5)
         VList[3] = AddVertex(Surf, Cos(StartRot# + CurRot# + 180), CurY#, Sin(StartRot# + CurRot# + 180), 0, CurY#/2+.5)
         VList[4] = AddVertex(Surf, Cos(StartRot# + CurRot# + 270), CurY#, Sin(StartRot# + CurRot# + 270), 1, CurY#/2+.5)
      Else
         For Vertex = 1 To 4
            LVList[Vertex]  = VList[Vertex]
         Next
         VList[1] = AddVertex(Surf, Cos(StartRot# + CurRot#), CurY#, Sin(StartRot# + CurRot#), 0, CurY#/2+.5)
         VList[2] = AddVertex(Surf, Cos(StartRot# + CurRot# + 90), CurY#, Sin(StartRot# + CurRot# + 90), 1, CurY#/2+.5)
         VList[3] = AddVertex(Surf, Cos(StartRot# + CurRot# + 180), CurY#, Sin(StartRot# + CurRot# + 180), 0, CurY#/2+.5)
         VList[4] = AddVertex(Surf, Cos(StartRot# + CurRot# + 270), CurY#, Sin(StartRot# + CurRot# + 270), 1, CurY#/2+.5)
         
         AddTriangle Surf, VList[1], LVList[2], LVList[1]
         AddTriangle Surf, VList[1], VList[2], LVList[2]
         
         AddTriangle Surf, VList[2], LVList[3], LVList[2]
         AddTriangle Surf, VList[2], VList[3], LVList[3]
         
         AddTriangle Surf, VList[3], LVList[4], LVList[3]
         AddTriangle Surf, VList[3], VList[4], LVList[4]
         
         AddTriangle Surf, VList[4], LVList[1], LVList[4]
         AddTriangle Surf, VList[4], VList[1], LVList[1]
      EndIf
      
      CurY# = CurY# + YAddValue#
      CurRot# = CurRot# + RotAddValue#
   Next
   
   UpdateNormals Mesh
   Return Mesh
End Function

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

cam=CreateCamera()
MoveEntity cam, 0, 0, -5
light = CreateLight(1, cam)

box = CreateCube_Twisted(360, -360, 15)
ScaleEntity box, .25, 2, .25

While Not KeyHit(1)
   Cls
   
   TurnEntity box, (KeyDown(17)-KeyDown(31))/2.0, (KeyDown(32)-KeyDown(30))/2.0, 0
   
   RenderWorld
   Flip
Wend
End


Dieser Code erstellt eine Box die gedreht ist. Sieht ungefähr so aus;) :
user posted image

Je niedriger der Detailgrad ist, desto mehr Vertexe/Polys braucht es. Detailgrad 5 ist ideal für jede Rotationsstärke

MfG
Cgamer

[Update] Nun funktionieren auch Texturen

~Editiert~
Ich hab mal ein "[B3D]" dem Topic angefügt. Bitte zukünftig selbst machen! MfG D2006
  • Zuletzt bearbeitet von Xaymar am So, Mai 10, 2009 23:46, insgesamt einmal bearbeitet

Chrise

Betreff: Re: Twisted Cube

BeitragSo, Mai 10, 2009 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Lol, das ist mal was witziges. Gefällt mir sehr gut.
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Xaymar

ehemals "Cgamer"

BeitragSo, Mai 10, 2009 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Twisted Cubes
Function CreateCube_Twisted(StartRot#, EndRot#, DivCount=10, TopBottom=1, Parent=0)
   Local VList[4], LVList[4]
   ;Create Mesh/Surface
   Mesh = CreateMesh(Parent)
      Surf = CreateSurface(Mesh)
   
   ;Get Subdivide Count
   Local SubDivCount = (EndRot# - StartRot#) / DivCount + 1               ;We dont need Vertex Spam :)
   If EndRot# < StartRot# SubDivCount = (StartRot# - EndRot#) / DivCount + 1   ;StartRot > EndRot? OK, lets change their positions
   Local YAddValue# = 2.0/SubDivCount
   Local RotAddValue# = (EndRot# - StartRot#) / SubDivCount
   
   ;Generate Cube:D
   If TopBottom = 1
   ;Bottom
      VList[1] = AddVertex(Surf, Cos(StartRot#), -1, Sin(StartRot#), 0, 0)
      VList[2] = AddVertex(Surf, Cos(StartRot#+90), -1, Sin(StartRot#+90), 0, 1)
      VList[3] = AddVertex(Surf, Cos(StartRot#+180), -1, Sin(StartRot#+180), 1, 1)
      VList[4] = AddVertex(Surf, Cos(StartRot#+270), -1, Sin(StartRot#+270), 1, 0)
      
      AddTriangle Surf, VList[1], VList[2], VList[3]
      AddTriangle Surf, VList[1], VList[3], VList[4]
   
   ;Top
      VList[1] = AddVertex(Surf, Cos(EndRot#), 1, Sin(EndRot#), 0, 0)
      VList[2] = AddVertex(Surf, Cos(EndRot#+90), 1, Sin(EndRot#+90), 0, 1)
      VList[3] = AddVertex(Surf, Cos(EndRot#+180), 1, Sin(EndRot#+180), 1, 1)
      VList[4] = AddVertex(Surf, Cos(EndRot#+270), 1, Sin(EndRot#+270), 1, 0)
      
      AddTriangle Surf, VList[3], VList[2], VList[1]
      AddTriangle Surf, VList[4], VList[3], VList[1]
   EndIf
   
   Local CurY# = -1
   Local CurRot# = 0
   For CurSubDiv = 1 To SubDivCount + 1
      If CurSubDiv = 1
         VList[1] = AddVertex(Surf, Cos(StartRot# + CurRot#), CurY#, Sin(StartRot# + CurRot#), 0, CurY#/2+.5)
         VList[2] = AddVertex(Surf, Cos(StartRot# + CurRot# + 90), CurY#, Sin(StartRot# + CurRot# + 90), 1, CurY#/2+.5)
         VList[3] = AddVertex(Surf, Cos(StartRot# + CurRot# + 180), CurY#, Sin(StartRot# + CurRot# + 180), 0, CurY#/2+.5)
         VList[4] = AddVertex(Surf, Cos(StartRot# + CurRot# + 270), CurY#, Sin(StartRot# + CurRot# + 270), 1, CurY#/2+.5)
      Else
         For Vertex = 1 To 4
            LVList[Vertex]  = VList[Vertex]
         Next
         VList[1] = AddVertex(Surf, Cos(StartRot# + CurRot#), CurY#, Sin(StartRot# + CurRot#), 0, CurY#/2+.5)
         VList[2] = AddVertex(Surf, Cos(StartRot# + CurRot# + 90), CurY#, Sin(StartRot# + CurRot# + 90), 1, CurY#/2+.5)
         VList[3] = AddVertex(Surf, Cos(StartRot# + CurRot# + 180), CurY#, Sin(StartRot# + CurRot# + 180), 0, CurY#/2+.5)
         VList[4] = AddVertex(Surf, Cos(StartRot# + CurRot# + 270), CurY#, Sin(StartRot# + CurRot# + 270), 1, CurY#/2+.5)
         
         AddTriangle Surf, VList[1], LVList[2], LVList[1]
         AddTriangle Surf, VList[1], VList[2], LVList[2]
         
         AddTriangle Surf, VList[2], LVList[3], LVList[2]
         AddTriangle Surf, VList[2], VList[3], LVList[3]
         
         AddTriangle Surf, VList[3], LVList[4], LVList[3]
         AddTriangle Surf, VList[3], VList[4], LVList[4]
         
         AddTriangle Surf, VList[4], LVList[1], LVList[4]
         AddTriangle Surf, VList[4], VList[1], LVList[1]
      EndIf
      
      CurY# = CurY# + YAddValue#
      CurRot# = CurRot# + RotAddValue#
   Next
   
   UpdateNormals Mesh
   Return Mesh
End Function

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

AntiAlias 1
Dither 1

cam=CreateCamera()
MoveEntity cam, 0, 0, -5
light = CreateLight(1, cam)

tex = CreateTexture(512, 512, 48)
SetBuffer TextureBuffer(tex)
Cls
Color 255,255,255
Rect 0, 0, 511, 511, 1
Color 0,0,0
Oval 0, 0, 511, 511, 1
SetBuffer BackBuffer()

box = CreateCube_Twisted(-360, 360, 1)
EntityTexture box, tex
ScaleEntity box, 1, 3, 1

white = CreateTexture(1, 1)
SetBuffer TextureBuffer(white)
Color 255,255,255
Plot 0, 0
SetBuffer BackBuffer()

While Not KeyHit(1)
   Cls
   
   TurnEntity box, 0, .1, 0
   
   rot = rot + (KeyDown(17)-KeyDown(31))
   rot = rot + (KeyHit(18)-KeyHit(32))
   FreeEntity box
   box = CreateCube_Twisted(-rot, rot, 5)
   EntityTexture box, tex

   ScaleEntity box, 1, (rot/180.0) + 1, 1   
   
   RenderWorld
   If KeyDown(16)
      CameraClsMode cam, 0, 1
      WireFrame 1
      
      EntityTexture box, white
      
      RenderWorld
      
      CameraClsMode cam, 1, 1
      WireFrame 0
      
      EntityTexture box, tex
   EndIf
   
   
   Color 255,255,255
   Text 0,0, rot
   Text 0,15, TrisRendered()
   
   Flip
Wend
End

anderes beispiel wo man mit w/d/e/f rotation hoch oder runterschrauben kann. die box scaled mit. q ist wireframe(man kann die verteilung gut sehen:D)

ozzi789

BeitragMo, Mai 11, 2009 7:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir kommt nur ein weisser Würfel mit einem schwarzen Loch in jeder Seite (oberer code 1:1 compiliert)
user posted image
Edit:

Huch jetzt hat es funktioniert, naja sieht ganz lustig aus Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group