[B3D] Sky(hauben)generator

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: [B3D] Sky(hauben)generator

BeitragDo, Feb 01, 2007 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ich bereits in einem anderem Beitrag versprochen habe, stelle ich mal den Code zu meinem Sky-'Hauben'-Generator hier ein.

Wie der Name schon sagt, wird eine art Skybox erstellt, die aber nur die Hälfte einer kompletten Skybox beinhaltet. Es ist nämlich in den meisten Fällen, garnicht notwendig eine komplette Skybox zu erstellen, da man es eh nie ganz sehen kann.

Vorteile:
- Etwas schneller (ja, ja, ich weiß) da weniger 'Fillrate' gezeichnet werden muß.
- Textur hat verzehrbedingt die Eigenschaft, dass zum Horizont hin die Auflösung zunimmt.
- Textur wird komplett genutzt. Keine Leerstellen bzw. nur eine Textur daher Singlesurface.


Nachteile:
- Die Handhabung ist etwas schwieriger, da die abfallenden Flächen schräg sind und somit große Höhenunterschiede vom Betrachter eher auffallen als bei einer gewöhnlichen Skybox.


Handhabung:
Zunächst mal muß eine Skybox bereits vorhanden sein. Also jeweils ein Bild vorne, rechts, hinten, links und oben. Dann sollten die mit den Namen von 1.bmp bis 5.bmp im selben Verzeichnis des Editors rumfliegen oder man ändert einfach die Zeilen im Code. Einmal gestartet kann man die Endtexturgröße angeben. Diese sollte sinniger weise nicht größer sein, als die Kantenlänge der Quellbilder.

Im ersten Schritt (ausser man hat '[4] nur ansehen' gewält) im Edit-Modus kann man mit den Tasten 1-5 jedweilige Unklarheiten der Rotation einzelner Bilder korrigieren. Mit A und Y kann man eventuelle Ungereimheiten zwischen zweier Bilder (sichtbare Kante oder Überlappung) korrigieren. Mit ESC gelangt man dann in den View-Modus, wo man sein Werk betrachten kann. Zusätzlich kann man mit den Maustasten ranzoomen, um bestimmte 'Fehler' besser erkennen zu können.

Hier ein Beispiel, wie sowas aussieht (sorry wegen dem Urheberrecht, aber mein Contestgewinnsponsor verlangt es von mir so, dass seine Bilder anderen nicht zur Verfügung gestellt werden):

user posted image

Hier geht's zum Code: [AUSKLAPPEN]
;skypacker-by-hectic
;
;
;
Graphics 256,128,0,2
SetBuffer FrontBuffer()

Text 128,16,"Endtexturformat wählen",1
Text 64,48,"[1] 256×256"
Text 64,64,"[2] 512×512"
Text 64,80,"[3] 1024×1024"
Text 64,96,"[4] nur ansehen"

.meno
FlushKeys
WaitKey

If KeyHit(1) End
If KeyHit(2) size=256
If KeyHit(3) size=512
If KeyHit(4) size=1024
If KeyHit(5) Goto show
If size=0 Goto meno

;Grafik-Einstellung
Graphics3D size,size,0,2
SetBuffer BackBuffer()

;Kamera-Einstellung
camera=CreateCamera()
CameraZoom camera,.5
CameraRange camera,.1,2000
PositionEntity camera,0,0,-.5
RotateEntity camera,0,0,0

;Sprites-Laden
sprite1=LoadSprite("1.bmp",260)
sprite2=LoadSprite("2.bmp",260)
sprite3=LoadSprite("3.bmp",260)
sprite4=LoadSprite("4.bmp",260)
sprite5=LoadSprite("5.bmp",260)

;Sprite-Darstellung
SpriteViewMode sprite1,2
SpriteViewMode sprite2,2
SpriteViewMode sprite3,2
SpriteViewMode sprite4,2
SpriteViewMode sprite5,2

;Grund-Positionen
PositionEntity sprite1,0,-1,0
PositionEntity sprite2,+1,0,0
PositionEntity sprite3,0,+1,0
PositionEntity sprite4,-1,0,0
PositionEntity sprite5,0,0,+1

;Standard-Rotation
RotateEntity sprite1,90,0,0
RotateEntity sprite2,0,-90,90
RotateEntity sprite3,-90,0,180
RotateEntity sprite4,0,90,-90
RotateEntity sprite5,0,0,-90

;Skallierungs-Vorgaben
If size=1024 scal#=1.002
If size=512 scal#=1.004
If size=256 scal#=1.002




;Edit-Schleife
While Not KeyHit(1)

 ;Tastaturabfrage
 If KeyHit(2) TurnEntity sprite1,0,0,-90
 If KeyHit(3) TurnEntity sprite2,0,0,-90
 If KeyHit(4) TurnEntity sprite3,0,0,-90
 If KeyHit(5) TurnEntity sprite4,0,0,-90
 If KeyHit(6) TurnEntity sprite5,0,0,-90
 If KeyHit(30) scal=scal+.001:If scal>1.1 scal=1.1
 If KeyHit(44) scal=scal-.001:If scal<1 scal=1

 ;Sprite-Skallierung
 ScaleSprite sprite1,scal,scal
 ScaleSprite sprite2,scal,scal
 ScaleSprite sprite3,scal,scal
 ScaleSprite sprite4,scal,scal
 ScaleSprite sprite5,scal,scal

 ;3D-Kramm
 RenderWorld

 ;Kontrast
 Color 0,0,0
 Origin size/2-4,size/2-5
 Rect -100,12-size/2,200,15,1
 Rect 0,+size/3,11,15,1
 Rect +size/3,0,11,15,1
 Rect 0,-size/3,11,15,1
 Rect -size/3,0,11,15,1
 Rect 0,0,11,15,1

 ;Anzeige
 Color 255,255,255
 Origin size/2-3,size/2-4
 Text 0,12-size/2,"[A/Y] Skallierung: "+scal,1
 Text 0,+size/3,"1"
 Text +size/3,0,"2"
 Text 0,-size/3,"3"
 Text -size/3,0,"4"
 Text 0,0,"5"
 Flip
Wend




;2D-Bereinigen
RenderWorld
Origin 0,0
Flip

;Aufnahme-Bild-Erstellen
bild=CreateImage(size,size)

;Aufnahme-Tätigen
GrabImage bild,0,0

;Aufnahme-Speichern
save=SaveImage(bild,"skygen.bmp")

;Sprites-Freigeben
FreeEntity sprite1
FreeEntity sprite2
FreeEntity sprite3
FreeEntity sprite4
FreeEntity sprite5

.show




;Grafik-Einstellung
Graphics3D 800,600,32,1
SetBuffer BackBuffer()

;Kamera-Einstellung
camera=CreateCamera()
PositionEntity camera,0,2,0
RotateEntity camera,0,90,0
CameraZoom camera,1

;Sky-Mesh-Erstellen
sky_mesh=CreateMesh()
skytex=LoadBrush("skygen.bmp",0,6,6)
sky_face=CreateSurface(sky_mesh,skytex)
AmbientLight 255,255,255
EntityFX sky_mesh,.5

;Sky-Mesh-Zusammen-Stellen
v0=AddVertex(sky_face,-3,0,-3,0,6)
v1=AddVertex(sky_face,-3,0,+3,0,0)
v2=AddVertex(sky_face,+3,0,+3,6,0)
v3=AddVertex(sky_face,+3,0,-3,6,6)
v4=AddVertex(sky_face,-1,1,-1,2,4)
v5=AddVertex(sky_face,-1,1,+1,2,2)
v6=AddVertex(sky_face,+1,1,+1,4,2)
v7=AddVertex(sky_face,+1,1,-1,4,4)

;Sky-Mesh-Triangulieren
AddTriangle(sky_face,v1,v0,v4)
AddTriangle(sky_face,v1,v4,v5)
AddTriangle(sky_face,v2,v1,v5)
AddTriangle(sky_face,v2,v5,v6)
AddTriangle(sky_face,v3,v2,v6)
AddTriangle(sky_face,v3,v6,v7)
AddTriangle(sky_face,v0,v3,v7)
AddTriangle(sky_face,v0,v7,v4)
AddTriangle(sky_face,v5,v4,v7)
AddTriangle(sky_face,v7,v6,v5)

;Sky-Mesh-Standard-Größe
ScaleMesh sky_mesh,200,200,200
PositionEntity sky_mesh,0,-2,0

;Schönheit
CreateMirror
plane=CreatePlane()
EntityColor plane,112,112,112
EntityAlpha plane,.75




;View-Schleife
While Not KeyHit(1)
 xw=xw-MouseXSpeed()
 yw=yw+MouseYSpeed()
 If yw<-90 yw=-90
 If yw>90 yw=90
 If MouseDown(1) MoveEntity camera,0,0,-1
 If MouseDown(2) MoveEntity camera,0,0,1
 If EntityY(camera)<2 TranslateEntity camera,0,1,0
 If KeyDown(57) w#=w#+.01
 RotateEntity camera,0,xw+w,0
 TurnEntity camera,yw,0,0
 MoveMouse 100,100
 RenderWorld
 Flip
 Cls
Wend
End

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group