3d Kegel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

3d Kegel

Beitrag von Batze »

Vor kurzem hatte ich mal ein par Beispiele für SetMeshData() gezeigt, die auf allgemeine Zustimmung trafen.
(oh cooler Satz, warum schreib ich sowas nie in Aufsätzen? <) )
Hier hab ich nun auch noch einen Code für eine Sinnvolle Anwendung:

Code: Alles auswählen

;Fenster für 3D

If InitEngine3D() = 0 : End : EndIf
InitSprite()

Procedure Open3DWindow(ID, Width, Height, Titel.s)

 OpenWindow(ID, 10, 35, Width, Height+20, #PB_Window_MinimizeGadget, Titel)
 CreateStatusBar(0, WindowID(ID))  
   AddStatusBarField(50)

 OpenWindowedScreen(WindowID(ID), 0, 0, Width, Height, 0, 0, 0)
 ClearScreen(0,0,0)
 FlipBuffers()

 Add3DArchive("3D-Data", #PB_3DArchive_FileSystem)


EndProcedure

Procedure Write_V(X.f, Y.f, Z.f)
 Shared *Vertix
 Static *Mem
 
 PokeF(*Vertix + *Mem    , X)
 PokeF(*Vertix + *Mem + 4, Y)
 PokeF(*Vertix + *Mem + 8, Z)
 *Mem + 12
EndProcedure

Procedure Write_F(A.w, b.w, C.w)
 Shared *Face
 Static *Mem
 
 PokeW(*Face + *Mem    , A)
 PokeW(*Face + *Mem + 2, b)
 PokeW(*Face + *Mem + 4, C)
 *Mem + 6 
EndProcedure

Procedure Write_T(X.f, Y.f)
 Shared *Texture
 Static *Mem
 
 PokeF(*Texture + *Mem    , X)
 PokeF(*Texture + *Mem + 4, Y)
 *Mem + 8
EndProcedure

;******************************************************************************************************

*Vertix   = AllocateMemory( 408)
*Face     = AllocateMemory( 384)
*Texture  = AllocateMemory( 272)

#Pi = 3.14159
#F  = 0.0625 * #Pi

Write_V(0  , 0  , 0)
Write_T(0.5, 0.5)

For i = 1 To 32
 Write_V( Sin(i * #F), Cos(i * #F), 0)
 If i <> 32
  Write_F(  0, i+1,  i)
  Write_F( 33,   i,i+1)
 Else
  Write_F(  0,  1,  i)
  Write_F( 33,  i,  1)
 EndIf
 Write_T( Sin(i * #F) / 2 + 0.5, Cos(i * #F) / 2 + 0.5)
Next
Write_V(0,0,-2)
Write_T(0.5,0.5)

;******************************************************************************************************

Open3DWindow(0, 800, 600, "3D")

CreateCamera(0,0,0,100,100)
 CameraLocate(0,  0,0,-8)
 CameraLookAt(0,  0,0, 0)


CreateTexture(0, 256, 256)
StartDrawing(TextureOutput(0))
For i=0 To 255
  Circle(128,128,255-i, RGB(i,i,i))
Next
StopDrawing()

CreateMesh(0)
  SetMeshData(0, 0, *Vertix,   34)
  SetMeshData(0, 1, *Face,     64)
  SetMeshData(0, 2, *Texture,  34)
  CreateEntity(0, MeshID(0), CreateMaterial(0, TextureID(0)))
  ;CreateEntity(0, MeshID(0), CreateMaterial(0, LoadTexture(0, "berg.jpg"))) ; Mit Bergtextur siehts noch cooler aus!

#MSpeed = 5

Repeat

 RenderWorld()
 FlipBuffers()
 Event = WindowEvent()
  
 Select Event
  Case 513 : MoveMode = 1 : AltM = WindowMouseX() / #MSpeed
  Case 514 : MoveMode = 0
 EndSelect
 
 If MoveMode = 1
  M    =   WindowMouseX() / #MSpeed
  RotateEntity(0, M - AltM, 0, 0)
  AltM    =   M
 EndIf 

Until Event = #PB_Event_CloseWindow
Und, Verbesserungsvorschläge !?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

cool, nicht schlkecht herr specht.
gefällt mir :allright:

habe ich gleich in mein code archiv geschmissen :lol:
-.-"
Antworten