[Blitz 3D] gebogener Zylinder-Mesh (Update 07.07.)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

AMY

Betreff: [Blitz 3D] gebogener Zylinder-Mesh (Update 07.07.)

BeitragMi, Jul 05, 2017 2:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Um die Meshsammlung zu erweitern hier eine Funktion zum erstellen eines gebogenen Zylindermeshes.

[EDIT] Habe die Funktion umbenannt damit diese eindeutiger ist. Zudem gibt es jetzt auch die Möglichkeit einen gebogenen Hohlzylinder zu erstellen.
Und hier auch mal ein screen von den Funktionen:
user posted image
Und wie immer freue ich mich über Feedback

Code: [AUSKLAPPEN]
Graphics3D(1920,1080,32,2)
camera=CreateCamera()
camlight=CreateLight(2,camera)
LightRange camlight,10

;###########################
;Die Funtionen erstellen ein RAW-Objekt wie z.B. CreateCube()
;Für eine Texturierung müssen noch die TextureCoords eingegeben werden
;######################################################

;######################################################
;Funktionsparameter
;CreateCurvedCylinder(Ringabschnitt 1-360 Grad (in 2 grad schritten), Biegeradius des Zylinders, Radius des Zylinders, optional mit boden)
;###########################
Function CreateCurvedCylinder(Abschnitt,Gr,r,bottom=0)
   CP=CreatePivot()
   mesh=CreateMesh()
   surface=CreateSurface(mesh)
   Local VertexPoints[65000]
   For T=0 To Abschnitt Step 2
      MoveEntity CP,Gr,0,0
      For C=0 To 358 Step 2
         MoveEntity CP,r,0,0
         VertexPoints[T*(360/2)+(C/2)]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         MoveEntity CP,-r,0,0
         TurnEntity CP,0,2,0
      Next
      MoveEntity CP,-Gr,0,0
      TurnEntity CP,0,0,2
   Next
   For CreateTris=0 To Abschnitt/2-1
      For CreateTris2=0 To 178
         AddTriangle(surface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+1+360],VertexPoints[(CreateTris*360)+CreateTris2+1])
         AddTriangle(surface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+360],VertexPoints[(CreateTris*360)+CreateTris2+1+360])
      Next
   Next
   For CreateTris=0 To Abschnitt/2-1
      AddTriangle(surface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+360+179],VertexPoints[(CreateTris*360)+360])
      AddTriangle(surface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+0+179],VertexPoints[(CreateTris*360)+360+179])
   Next
   If bottom=1 Then
      For I=0 To 178
         AddTriangle(surface,VertexPoints[I],VertexPoints[I+1],VertexPoints[0])
         AddTriangle(surface,VertexPoints[(Abschnitt*180)+I],VertexPoints[(Abschnitt*180)],VertexPoints[(Abschnitt*180)+I+1])
      Next
   EndIf
   UpdateNormals mesh
   Return mesh
End Function


;######################################################
;Funktionsparameter
;CreateCurvedPipe(Ringabschnitt 1-360 Grad (in 2 grad schritten), Biegeradius, Innenradius des Rohrs, Aussenradius des Rohrs)
;###########################
Function CreateCurvedPipe(Abschnitt,Gr,Ir,Ar)
   CP=CreatePivot()
   mesh=CreateMesh()
   surface=CreateSurface(mesh)
   innersurface=CreateSurface(mesh)
   Local VertexPoints[70000]
   For T=0 To Abschnitt Step 2
      MoveEntity CP,Gr,0,0
      For C=0 To 358 Step 2
         MoveEntity CP,Ar,0,0
         VertexPoints[T*(360/2)+(C/2)]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         If T=0 Then VertexPoints[66000+C]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         If T=Abschnitt Then VertexPoints[68000+C]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         MoveEntity CP,-Ar,0,0
         TurnEntity CP,0,2,0
      Next
      MoveEntity CP,-Gr,0,0
      TurnEntity CP,0,0,2
   Next
   For CreateTris=0 To Abschnitt/2-1
      For CreateTris2=0 To 178
         AddTriangle(surface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+1+360],VertexPoints[(CreateTris*360)+CreateTris2+1])
         AddTriangle(surface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+360],VertexPoints[(CreateTris*360)+CreateTris2+1+360])
      Next
   Next
   For CreateTris=0 To Abschnitt/2-1
      AddTriangle(surface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+360+179],VertexPoints[(CreateTris*360)+360])
      AddTriangle(surface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+0+179],VertexPoints[(CreateTris*360)+360+179])
   Next
   RotateEntity CP,0,0,0
   weiter=0
   For T=weiter To weiter+Abschnitt Step 2
      MoveEntity CP,Gr,0,0
      For C=0 To 358 Step 2
         MoveEntity CP,Ir,0,0
         VertexPoints[T*(360/2)+(C/2)]=AddVertex(innersurface,EntityX(CP),EntityY(CP),EntityZ(CP))
         If T=0 Then VertexPoints[67000+C]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         If T=Abschnitt Then VertexPoints[69000+C]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
         MoveEntity CP,-Ir,0,0
         TurnEntity CP,0,2,0
      Next
      MoveEntity CP,-Gr,0,0
      TurnEntity CP,0,0,2
   Next
   For CreateTris=weiter To Abschnitt/2-1
      For CreateTris2=weiter To 178
         AddTriangle(innersurface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+1],VertexPoints[(CreateTris*360)+CreateTris2+1+360])
         AddTriangle(innersurface,VertexPoints[(CreateTris*360)+CreateTris2],VertexPoints[(CreateTris*360)+CreateTris2+1+360],VertexPoints[(CreateTris*360)+CreateTris2+360])
      Next
   Next
   For CreateTris=weiter To weiter+(Abschnitt/2-1)
      AddTriangle(innersurface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+360],VertexPoints[(CreateTris*360)+360+179])
      AddTriangle(innersurface,VertexPoints[(CreateTris*360)+0],VertexPoints[(CreateTris*360)+360+179],VertexPoints[(CreateTris*360)+0+179])
   Next
   
   For Front=66000 To 66356 Step 2
      AddTriangle(surface,VertexPoints[Front],VertexPoints[Front+2],VertexPoints[Front+1000])
      AddTriangle(surface,VertexPoints[Front+1000],VertexPoints[Front+2],VertexPoints[Front+1002])
   Next
   For Front=68000 To 68356 Step 2
      AddTriangle(surface,VertexPoints[Front],VertexPoints[Front+1000],VertexPoints[Front+2])
      AddTriangle(surface,VertexPoints[Front+1000],VertexPoints[Front+1002],VertexPoints[Front+2])
   Next
   AddTriangle(surface,VertexPoints[66358],VertexPoints[66000],VertexPoints[67358])
   AddTriangle(surface,VertexPoints[67000],VertexPoints[67358],VertexPoints[66000])
   AddTriangle(surface,VertexPoints[68358],VertexPoints[69358],VertexPoints[68000])
   AddTriangle(surface,VertexPoints[69000],VertexPoints[68000],VertexPoints[69358])
   UpdateNormals mesh
   EntityFX mesh,2
   Return mesh
End Function

;######################################################
;
;Die folgenden Codezeilen sind nur zur einfachen Demonstration gedacht
;
;###########################
;
;WASD - Bewegen
;1 (Zahlenleiste) - Wireframe-Umschaltung
;
;######################################################

a=CreateCurvedCylinder(120,10,3)
b=CreateCurvedCylinder(120,10,3,1)
c=CreateCurvedPipe(270,10,8,9)

PositionEntity a,0,0,0
PositionEntity b,0,0,10
PositionEntity c,0,0,20


Repeat
   
   Movement(camera,1,0.1)   
   If KeyHit(2) Then WFMode=1-WFMode
   WireFrame WFMode
   RenderWorld
   Text 0,0,TrisRendered()
   Flip
Until KeyDown(1)
End



Function Movement(camera,speedfast#=3,speedslow#=1)
   mspeedx=MouseXSpeed()
   mspeedy=MouseYSpeed()
   msensivityX#=mspeedx/2
   msensivityY#=mspeedy/2
   If mspeedy<>0 Then TurnEntity camera,msensivityy,0 ,0
   If mspeedx<>0 Then TurnEntity camera,0,-msensivityX,0
   If KeyDown(54) Or KeyDown(42) Then movespeed#=speedslow Else movespeed=speedfast
   If KeyDown(32)=True Then MoveEntity camera, movespeed, 0, 0;205
   If KeyDown(30)=True Then MoveEntity camera,-movespeed, 0, 0;203
   If KeyDown(201)=True Then MoveEntity camera, 0, movespeed, 0;201
   If KeyDown(209)=True Then MoveEntity camera, 0,-movespeed, 0;209
   If KeyDown(31)=True Then MoveEntity camera, 0, 0,-movespeed;208
   If KeyDown(17)=True Then MoveEntity camera, 0, 0, movespeed;200
   MoveMouse 512,384
End Function
;

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group