Skysphere zu Skybox - Textur aligned nicht richtig

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Krischan

Betreff: Skysphere zu Skybox - Textur aligned nicht richtig

BeitragMi, Okt 22, 2008 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich beisse mal wieder in die Tischkante, vielleicht habt Ihr eine Lösung. Ich möchte gerne die Innenseite einer Kugel ähnlich wie in Terragen so abfotografieren, dass wir nachher 6 Texturen (vorne,rechts,hinten,links,oben,unten) haben, die wir auf eine Skybox klatschen. Mein Code funktioniert nur am "Äquator", ich bekomme aber die Pole einfach nicht richtig angeflanscht. Wo liegt der Fehler?

Stimmt da irgendwas mit dem Zoom nicht oder habe ich einen Befehl falsch eingesetzt? Die Kameradrehung habe ich so eingestellt, wie ich es in Terragen machen würde und dort kommt eine saubere Skybox bei raus, nur bei mir nicht Sad

Zum Testen einfach die Zeile EntityTexture sphere,raster in EntityTexture sphere,nebel ändern und dann mit Taste 1/2 oder SPACE die Szene anschauen.

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

; Gittertextur
raster=Gitter(256,256,16,255,0,0,0,0,255)
nebel=LoadTexture("nebel.jpg")

; Dummysphere erstellen
sphere=CreateSphere(48)
EntityFX sphere,1+16
FlipMesh sphere
ScaleMesh sphere,10,10,10

; Textur zuweisen
EntityTexture sphere,raster


; Texturgrösse Skyboxseite
s=512

; Textur für Skyboxseite erstellen
tex=CreateTexture(s,s)
tb=TextureBuffer(tex)
bb=BackBuffer()

; Kamera erstellen
cam=CreateCamera()
PositionEntity cam,0,0,0
CameraViewport cam,0,0,s,s
CameraZoom cam,1

; alle 6 Seiten abfotografieren und als Textur speichern
RotateEntity cam,  0,  0,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_FR.bmp") ; vorne
RotateEntity cam,  0, 90,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_RT.bmp") ; rechts
RotateEntity cam,  0,180,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_BK.bmp") ; hinten
RotateEntity cam,  0,270,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_LT.bmp") ; links
RotateEntity cam, 90,  0,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_UP.bmp") ; oben
RotateEntity cam,-90,  0,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_DN.bmp") ; unten

; Kamera rücksetzen
CameraViewport cam,0,0,800,600
RotateEntity cam,0,0,0

; Skybox erstellen
skybox = MakeSkybox()

; Standardmässig Skybox anzeigen und Sphere verstecken
HideEntity sphere : ShowEntity skybox
sb=2

;Mauszeiger in die Mitte
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

; Hauptschleife
While Not KeyHit(1)
   
   
   ;Mausbewegung holen
   mxs#=MouseXSpeed()
   mys#=MouseYSpeed()
   
   ;Mauszeiger in die Mitte
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   
   ;Kamera anhand der Mausbewegung rotieren
   RotateEntity cam,EntityPitch(cam)+(mys#/5),EntityYaw(cam)-(mxs#/5),0
   
   ; SPACE = Wireframe
   If KeyHit(57) Then wf=1-wf : WireFrame wf
   
   ; 1=Sphere, 2=Skybox zeigen
   If KeyHit(2) Then ShowEntity sphere : HideEntity skybox : sb=1
   If KeyHit(3) Then HideEntity sphere : ShowEntity skybox : sb=2
   
   RenderWorld
   
   Color 255,255,255
   
   If sb=1 Then Text 0,0,"Sphere wird angezeigt"
   If sb=2 Then Text 0,0,"Skybox wird angezeigt"
   
   Text 0,20,TrisRendered()+" Tris"
   
   Flip
   
Wend

End

; Simple Gittertextur basteln
Function Gitter(x,y,st,r,g,b,r1,g1,b1)
   tex=CreateTexture(x,y)
   SetBuffer TextureBuffer(tex)
   Color r1,g1,b1
   Rect 0,0,x,y
   Color r,g,b
   For x1=0 To x
      For y1=0 To y
         Rect x1,y1,st,st,0
         y1=y1+st-1
      Next
      x1=x1+st-1
   Next
   SetBuffer BackBuffer()
   Return tex
End Function

; Skybox basteln
Function MakeSkybox()
   m=CreateMesh()
   
   b=LoadBrush( "skybox_FR.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
   AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   b=LoadBrush( "skybox_LT.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
   AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   b=LoadBrush( "skybox_BK.bmp",49 )
   s=CreateSurface( m,b ) AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
   AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   b=LoadBrush( "skybox_RT.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
   AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   b=LoadBrush( "skybox_UP.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
   AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   b=LoadBrush( "skybox_DN.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
   AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   ScaleMesh m,5,5,5
   EntityOrder m,1
   FlipMesh m
   EntityFX m,1
   Return m
   
End Function


Hier die Nebeltextur:
user posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Okt 22, 2008 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Graphics3D 800,600,32,2 auf eine Auflösung zum Beispiel 256,256 oder 512,512 oder 1024,1024 stellen... CameraZoom muß auf 1.0 stehen (also Standard). Beim aneinander fügen kann es aber zu unschönen UV-Verläufen kommen, dann sollte CameraZoom - ich glaub das war - auf 1.0/(RenderWidth-1)*RenderWidth stehen. Das hängt davon ab, ob du mit Sprites oder Singlesurface arbeitest. Man sollte - muß aber nicht - alle Texturen in den VRAM kopieren (+256), damit diese nicht so verschwommen sind. abfotografieren dann den gesamt gerenderten Inhalt.

Danach dann alle 6 Himmelsrichtungen abfotografieren.

Edit1: Sorry, ich sehe gerade, dass du mit CameraViewport arbeitest. Dann sollte das Graphics3D 512,512 weg fallen können.

Edit2: Su hast da was verwechselt. Lösung:

Code: [AUSKLAPPEN]
RotateEntity cam,-90,  0,270 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_UP.bmp") ; oben
RotateEntity cam,+90,  0,90 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_DN.bmp") ; unten
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Krischan

BeitragMi, Okt 22, 2008 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectic, you made my day! Ich raffs zwar net ganz wieso da gerollt werden muss aber wichtig ist, was hinten raus kommt. Anstatt einer Sphere mit zwei Surfaces bei 100FPS habe ich nun eine Skybox mit 6 Surfaces und 150FPS bei 1024er Texturgrösse und 170FPS bei 256er. Shocked und ca. 32.000 Tris weniger Razz

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Okt 22, 2008 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit weiterem ''Rollen'' ist garnicht so relevant. Du hast ganz einfach oben mit unten verwechselt. Denn ''RotateEntity cam, 90, 0,0 : RenderWorld : CopyRect 0,0,s,s,0,0,bb,tb : SaveBuffer(tb,"skybox_UP.bmp") ; oben'' dreht die Kamera nach unten, da in der X-Achse positiv gedreht wird. Beim erstellen der Vertices wiederrum, hast du mit der Bezeichnung ''oben'' auch oben die Vertices erstellt.

Ansonsten ein schöner Nebel. Hast du den selbst erstellt? Wenn ja, mit welchem Programm?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

DerHase

BeitragMi, Okt 22, 2008 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
CubeMapGen kannst Du Dir auch mal ankucken Wink
Play Satyr!
 

Krischan

BeitragDo, Okt 23, 2008 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nettes Tool, ich wollte aber eine BB-interne Lösung. Der Hintergrund der ganzen Sache ist eine "Fastsky" Option. Im Moment erstelle ich den Sternenhimmel einer Spacesim bei jedem Start neu, nur gibt das ziemlich viele Tris, ich habe dann bis zu 200.000 Sterne, und da dacht ich mir, das kann man doch abfotografieren und mit 12 Tris darstellen.

Leider verwischt die Textur, so dass feinere Details verloren gehen (dafür aber 380FPS gegen 80FPS!), evt. müsste man hier mit 2048x2048er Texturen für die Skybox arbeiten, die kann ich aber nicht mehr mit Cameraviewport abfotografieren, er spuckt mir glaube ich höchstens 1920x1200 (meine Notebook-Auflösung) heraus. In BB fehlt sowas wie eine virtuelle Kamera, die Render2Texture mit beliebigen Auflösungen unterstützt. Sad Oder die Sterne erst nachträglich auf die 6 Faces einzeichnen, mal sehen. Auf jeden Fall erinnert mich dieses Verfahren an ein Entity im Q3Radiant, da konnte man eine Miniaturlandschaft mit einer Kamera so darstellen, dass es aussah, als ob am Horizont eine unendliche Landschaft ist. War gut im ersten Level von "Rückkehr zum Schloss Hundefels" zu sehen.

Ausserdem ist mir aufgefallen, dass die Skybox in der horizontalen um 180° spiegelverkehrt zu sein scheint. Muss ich noch mal untersuchen, wieso...

Die Nebeltextur ist recht simpel in Photoshop mit den Filtern Clouds, Twirl und Polar Coordinates entstanden. Ich habe damit letztens mal ein wenig experimentiert und dabei ist ein sehr komplex aufgebauter Space-Hintergrund entstanden (18 Layer):

user posted image

Daraus kann man dann mit Sternen, Planet und Raumschiff sowas machen:

user posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Okt 23, 2008 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Vernünftigen Sternenhimmel zu erstellen ist garnicht so einfach. Mit einer Skybox bräuchte man eine 4096x4096er Textur, um die feinen Sterne zeichnen zu können. Deswegen hatte ich mal eine andere Vorgehensweise eingeschlagen. Jeder Stern ein Quad, und davon dann ganz viele. https://www.blitzforum.de/foru...highlight= Leider ist auch dieses Vorgehen sehr vom System abhängig. Ganz grob: ATI kann diese Variante mit vielen Triangles schneller darstellen als eine hochauflösende Skybox, und eine GeForce kann eine hochauflösende Skybox schneller darstellen als viele kleine Triangles.

Aus diesem Grund habe ich mich an eine Mischung vom beiden ran gewagt. Idee dazu: Man erstelle eine Sphere mit möglichst gleichförmigen Triangles (also nicht in die Länge gezogene Triangles). Ein Super-Ikosaeder hatte dazu die besten Vorraussetzungen. Die UV-Koordinaten werden nun aus einer relativ gering aufgelösten Textur ausgelesen. Jedes Triangle hat dann seine eigene UV-Koordinaten. Aus der Kombination und drehung einzelner Triangles, werden wiederholungen kaum erkennbar und man kann denoch den Himmel gut designen.

Nachteil ist das erschwerliche erstellen der Texturen selbst, da die UV-Verläufe diagonal auf der Textur verlaufen.

Vielleicht kannst du ja damit was anfangen

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(50)
Local Camera=CreateCamera()

Local Mesh=CreateMesh()
Local Face=CreateSurface(Mesh)

Local Texture=LoadTexture("data\mond.png",1)
EntityTexture Mesh,Texture
ScaleTexture Texture,4,4
EntityFX Mesh,1




Local MX#,MY#

Const A#=00.00000
Const B#=05.25731
Const C#=08.50651
Const D#=03.56822
Const E#=09.34172
Const F#=05.77350

AddTriangle(Face,AddVertex(Face,+A,+B,+C,2,0),AddVertex(Face,+D,+A,+E,3,2),AddVertex(Face,-D,+A,+E,1,2)) ;MainCenter1
AddTriangle(Face,AddVertex(Face,+A,-B,+C,2,4),AddVertex(Face,-D,+A,+E,1,2),AddVertex(Face,+D,+A,+E,3,2)) ;MainCenter1
AddTriangle(Face,AddVertex(Face,+A,+B,+C,5,2),AddVertex(Face,-D,+A,+E,3,2),AddVertex(Face,-F,+F,+F,4,4)) ;FirstRound1
AddTriangle(Face,AddVertex(Face,+D,+A,+E,5,2),AddVertex(Face,+A,+B,+C,3,2),AddVertex(Face,+F,+F,+F,4,4)) ;FirstRound1
AddTriangle(Face,AddVertex(Face,+A,-B,+C,5,2),AddVertex(Face,+D,+A,+E,3,2),AddVertex(Face,+F,-F,+F,4,4)) ;FirstRound1
AddTriangle(Face,AddVertex(Face,-D,+A,+E,5,2),AddVertex(Face,+A,-B,+C,3,2),AddVertex(Face,-F,-F,+F,4,4)) ;FirstRound1
AddTriangle(Face,AddVertex(Face,+F,+F,+F,4,4),AddVertex(Face,+A,+B,+C,3,2),AddVertex(Face,+A,+E,+D,2,4)) ;ArrowRound1
AddTriangle(Face,AddVertex(Face,+F,-F,+F,4,4),AddVertex(Face,+D,+A,+E,3,2),AddVertex(Face,+C,+A,+B,2,4)) ;ArrowRound1
AddTriangle(Face,AddVertex(Face,-F,-F,+F,4,4),AddVertex(Face,+A,-B,+C,3,2),AddVertex(Face,+A,-E,+D,2,4)) ;ArrowRound1
AddTriangle(Face,AddVertex(Face,-F,+F,+F,4,4),AddVertex(Face,-D,+A,+E,3,2),AddVertex(Face,-C,+A,+B,2,4)) ;ArrowRound1
AddTriangle(Face,AddVertex(Face,+A,+E,-D,0,0),AddVertex(Face,+F,+F,-F,2,0),AddVertex(Face,+B,+C,+A,1,2)) ;MainCenter2
AddTriangle(Face,AddVertex(Face,+A,+E,-D,3,2),AddVertex(Face,+B,+C,+A,5,2),AddVertex(Face,+A,+E,+D,4,4)) ;FirstRound2
AddTriangle(Face,AddVertex(Face,+F,+F,-F,3,2),AddVertex(Face,+A,+E,-D,5,2),AddVertex(Face,+A,+B,-C,4,4)) ;FirstRound2
AddTriangle(Face,AddVertex(Face,+B,+C,+A,3,2),AddVertex(Face,+F,+F,-F,5,2),AddVertex(Face,+E,+D,+A,4,4)) ;FirstRound2
AddTriangle(Face,AddVertex(Face,+B,+C,+A,3,2),AddVertex(Face,+E,+D,+A,4,4),AddVertex(Face,+F,+F,+F,2,4)) ;ArrowRound2
AddTriangle(Face,AddVertex(Face,-B,+C,+A,2,4),AddVertex(Face,+A,+E,-D,3,2),AddVertex(Face,+A,+E,+D,4,4)) ;ArrowRound2
AddTriangle(Face,AddVertex(Face,+D,+A,-E,2,4),AddVertex(Face,+F,+F,-F,3,2),AddVertex(Face,+A,+B,-C,4,4)) ;ArrowRound2
AddTriangle(Face,AddVertex(Face,-F,+F,-F,2,0),AddVertex(Face,-E,+D,+A,4,0),AddVertex(Face,-C,+A,-B,3,2)) ;MainCenter3
AddTriangle(Face,AddVertex(Face,-E,+D,+A,5,2),AddVertex(Face,-F,+F,-F,3,2),AddVertex(Face,-B,+C,+A,4,4)) ;FirstRound3
AddTriangle(Face,AddVertex(Face,-C,+A,-B,5,2),AddVertex(Face,-E,+D,+A,3,2),AddVertex(Face,-E,-D,+A,4,4)) ;FirstRound3
AddTriangle(Face,AddVertex(Face,-F,+F,-F,5,2),AddVertex(Face,-C,+A,-B,3,2),AddVertex(Face,-D,+A,-E,4,4)) ;FirstRound3
AddTriangle(Face,AddVertex(Face,-F,+F,-F,3,2),AddVertex(Face,+A,+E,-D,2,4),AddVertex(Face,-B,+C,+A,4,4)) ;ArrowRound3
AddTriangle(Face,AddVertex(Face,-F,-F,-F,2,4),AddVertex(Face,-D,+A,-E,4,4),AddVertex(Face,-C,+A,-B,3,2)) ;ArrowRound3
AddTriangle(Face,AddVertex(Face,-E,-D,+A,4,4),AddVertex(Face,-E,+D,+A,3,2),AddVertex(Face,-C,+A,+B,2,4)) ;ArrowRound3
AddTriangle(Face,AddVertex(Face,+A,-E,-D,4,0),AddVertex(Face,+B,-C,+A,5,2),AddVertex(Face,+F,-F,-F,3,2)) ;MainCenter4
AddTriangle(Face,AddVertex(Face,+A,-E,-D,3,2),AddVertex(Face,+F,-F,-F,5,2),AddVertex(Face,+A,-B,-C,4,4)) ;FirstRound4
AddTriangle(Face,AddVertex(Face,+B,-C,+A,3,2),AddVertex(Face,+A,-E,-D,5,2),AddVertex(Face,+A,-E,+D,4,4)) ;FirstRound4
AddTriangle(Face,AddVertex(Face,+F,-F,-F,3,2),AddVertex(Face,+B,-C,+A,5,2),AddVertex(Face,+E,-D,+A,4,4)) ;FirstRound4
AddTriangle(Face,AddVertex(Face,+F,-F,-F,3,2),AddVertex(Face,+E,-D,+A,4,4),AddVertex(Face,+C,+A,-B,2,4)) ;ArrowRound4
AddTriangle(Face,AddVertex(Face,+A,-E,-D,3,2),AddVertex(Face,+A,-B,-C,4,4),AddVertex(Face,-F,-F,-F,2,4)) ;ArrowRound4
AddTriangle(Face,AddVertex(Face,+B,-C,+A,3,2),AddVertex(Face,+A,-E,+D,4,4),AddVertex(Face,+F,-F,+F,2,4)) ;ArrowRound4
AddTriangle(Face,AddVertex(Face,-F,+F,+F,0,4),AddVertex(Face,-B,+C,+A,2,4),AddVertex(Face,+A,+E,+D,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+C,+A,+B,1,2),AddVertex(Face,+E,+D,+A,0,4),AddVertex(Face,+E,-D,+A,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+E,+D,+A,0,4),AddVertex(Face,+C,+A,-B,1,2),AddVertex(Face,+E,-D,+A,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+C,+A,+B,1,2),AddVertex(Face,+E,-D,+A,0,4),AddVertex(Face,+F,-F,+F,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+F,-F,+F,0,4),AddVertex(Face,+E,-D,+A,1,2),AddVertex(Face,+B,-C,+A,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-E,+D,+A,2,4),AddVertex(Face,-F,+F,+F,1,2),AddVertex(Face,-C,+A,+B,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-C,+A,+B,0,4),AddVertex(Face,-D,+A,+E,2,4),AddVertex(Face,-F,-F,+F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,-E,-D,1,2),AddVertex(Face,-F,-F,-F,0,4),AddVertex(Face,-B,-C,+A,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-B,-C,+A,2,4),AddVertex(Face,-F,-F,-F,1,2),AddVertex(Face,-E,-D,+A,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-B,-C,+A,1,2),AddVertex(Face,-E,-D,+A,0,4),AddVertex(Face,-F,-F,+F,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-F,-F,+F,0,4),AddVertex(Face,-E,-D,+A,2,4),AddVertex(Face,-C,+A,+B,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-B,-C,+A,0,4),AddVertex(Face,-F,-F,+F,2,4),AddVertex(Face,+A,-E,+D,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,-E,-D,1,2),AddVertex(Face,-B,-C,+A,0,4),AddVertex(Face,+A,-E,+D,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,+B,+C,2,4),AddVertex(Face,-F,+F,+F,1,2),AddVertex(Face,+A,+E,+D,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+C,+A,-B,2,4),AddVertex(Face,+F,+F,-F,1,2),AddVertex(Face,+D,+A,-E,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+D,+A,-E,2,4),AddVertex(Face,+A,+B,-C,1,2),AddVertex(Face,-D,+A,-E,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+F,-F,-F,1,2),AddVertex(Face,+C,+A,-B,0,4),AddVertex(Face,+D,+A,-E,2,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+F,-F,-F,0,4),AddVertex(Face,+D,+A,-E,2,4),AddVertex(Face,+A,-B,-C,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,-B,-C,0,4),AddVertex(Face,+D,+A,-E,2,4),AddVertex(Face,-D,+A,-E,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,-B,-C,0,4),AddVertex(Face,-D,+A,-E,2,4),AddVertex(Face,-F,-F,-F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,+E,+D,2,4),AddVertex(Face,+B,+C,+A,0,4),AddVertex(Face,+F,+F,+F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,+B,-C,2,4),AddVertex(Face,+A,+E,-D,0,4),AddVertex(Face,-F,+F,-F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+E,+D,+A,2,4),AddVertex(Face,+F,+F,-F,0,4),AddVertex(Face,+C,+A,-B,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-E,+D,+A,0,4),AddVertex(Face,-B,+C,+A,2,4),AddVertex(Face,-F,+F,+F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-C,+A,-B,0,4),AddVertex(Face,-E,-D,+A,2,4),AddVertex(Face,-F,-F,-F,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,-F,+F,-F,0,4),AddVertex(Face,-D,+A,-E,2,4),AddVertex(Face,+A,+B,-C,1,2)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+A,-B,+C,2,4),AddVertex(Face,+F,-F,+F,1,2),AddVertex(Face,+A,-E,+D,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+D,+A,+E,2,4),AddVertex(Face,+F,+F,+F,1,2),AddVertex(Face,+C,+A,+B,0,4)) ;EmptySpace
AddTriangle(Face,AddVertex(Face,+F,+F,+F,2,4),AddVertex(Face,+E,+D,+A,1,2),AddVertex(Face,+C,+A,+B,0,4)) ;EmptySpace

MoveMouse 400,300


While Not KeyHit(1)
   
   MX=MX-MouseXSpeed()/100.0:MX=MX*.99
   MY=MY+MouseYSpeed()/100.0:MY=MY*.99
   
   TurnEntity Camera,MY,MX,0
   
   MoveEntity Camera,0,0,-MouseZSpeed()
   
   WaitTimer(Timer)
   RenderWorld
;   Text 20,100,CountVertices(Face)
;   Text 20,120,CountTriangles(Face)
   Flip 0
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Krischan

BeitragDo, Okt 23, 2008 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectic, drei mal darfst Du raten, mit wessen Algorithmus ich die Sterne gezaubert habe, ich habe mir erlaubt, Dein Script von damals extrem umzubauen (Farbe, Grösse, Auftraten von Fixsternen, Nebelbackground usw...), das ist jetzt zusammen mit Mr. Keks' "AddtoSurface" Funktion ein mächtiges Script für Sternenfetischisten.

Der Einbau ist ganz einfach:

Include "starsphere.bb"
InitStarSphere()


und nachher im Loop die Sphere an die Cam hängen:

If STARSPHERE Then PositionEntity STARSPHERE,EntityX(cam,1),EntityY(cam,1),EntityZ(cam,1)

Deinen neuen Code schaue ich mir nachher mal an.

Als "stern.bmp" z.B. diese Datei verwenden und als "nebel.jpg" die Datei oben:
user posted image


starsphere.bb Code: [AUSKLAPPEN]
Global STARSPHERE%                              ; Sternenhimmel Objekt
Global STARSPHERE_Seed%                           ; Sternenhimmel Zufallsseed
Global STARSPHERE_Brush1%                        ; Sternenhimmel Pinsel Sterne 1
Global STARSPHERE_Brush2%                        ; Sternenhimmel Pinsel Nebel
Global STARSPHERE_Texture1%                        ; Sternenhimmel Textur (eines Sterns)
Global STARSPHERE_Texture2%                        ; Sternenhimmel Textur (des Nebels)

Const STARSPHERE_Layers%      =   7               ; Anzahl Layer (1-7)
Const STARSPHERE_Percentage%   =   100               ; Anzahl Sterne in % pro Layer
Const STARSPHERE_Fixed%         =   1               ; davon Fixsterne in %
Const STARSPHERE_Clustering%   =   50               ; Sternhäufungen in %
Const STARSPHERE_StarsYellow%   =   3               ; Wahrscheinlichkeit gelber Fixsterne in %
Const STARSPHERE_StarsOrange%   =   3               ; Wahrscheinlichkeit orangefarbener Fixsterne in %
Const STARSPHERE_StarsBlue%      =   3               ; Wahrscheinlichkeit blauer Fixsterne in %
Const STARSPHERE_StarsWhite%   =   91               ; Wahrscheinlichkeit weisser Fixsterne in %

Const STARSPHERE_MinStarSize#   =   1.0               ; Minimale Sterngrösse
Const STARSPHERE_MidStarSize#   =   2.0               ; Durchschnittliche Sterngrösse
Const STARSPHERE_MaxStarSize#   =   3.0               ; Maximale Sterngrösse (Fixsterne)
Const STARSPHERE_MinStarLight%   =   64               ; Minimale Helligkeit eines Sterns
Const STARSPHERE_MidStarLight%   =   160               ; Durchschnittliche Helligkeit eines Sterns
Const STARSPHERE_MaxStarLight%   =   255               ; Maximale Helligkeit eines Sterns
Const STARSPHERE_Scale#         =   2.0               ; Grösse der Sternenkugel

Const STARSPHERE_StarTexture$   =   "stern.bmp"         ; Sterntextur
Const STARSPHERE_NebulaTexture$   =   "nebel.jpg"         ; Nebeltextur

Const STARSPHERE_Red%         =   128               ; Nebelvertexfarbe Rot (0-128 oder grösser = overbright)
Const STARSPHERE_Green%         =   128               ; Nebelvertexfarbe Grün (0-128 oder grösser = overbright)
Const STARSPHERE_Blue%         =   128               ; Nebelvertexfarbe Blau (0-128 oder grösser = overbright)
Const STARSPHERE_Alpha#         =   1.0               ; Nebelvertexfarbe Alpha

Dim STARSPHERE_Surface(7)

; -------------------------------------------------------------------------------------------------
; FUNKTION: Starsphere initialisieren
; -------------------------------------------------------------------------------------------------
Function InitStarsphere()
   
   ; Mesh erstellen
   STARSPHERE=CreateMesh()
   STARSPHERE_Brush1=CreateBrush(0,0,0)
   STARSPHERE_Brush2=CreateBrush(0,0,0)
   STARSPHERE_Texture1=LoadTexture(STARSPHERE_StarTexture$,1+2+16+32)
   STARSPHERE_Texture2=LoadTexture(STARSPHERE_NebulaTexture,1)
   
   ; Pinsel mit Textur versehen
   BrushTexture STARSPHERE_Brush1,STARSPHERE_Texture1
   BrushTexture STARSPHERE_Brush2,STARSPHERE_Texture2
   ScaleEntity STARSPHERE,STARSPHERE_Scale,STARSPHERE_Scale,STARSPHERE_Scale
   TextureBlend STARSPHERE_Texture1,5
   TextureBlend STARSPHERE_Texture2,5
   
   ; Surface 0 enthält immer den Nebel, die restlichen (bis zu 7) die Sterne,
   For i=1 To STARSPHERE_Layers : STARSPHERE_Surface(i)=CreateSurface(STARSPHERE,STARSPHERE_Brush1) : Next
   STARSPHERE_Surface(0)=CreateSurface(STARSPHERE,STARSPHERE_Brush2)
   
   ; FX
   EntityFX STARSPHERE,1+2+32
   EntityBlend STARSPHERE,3
   
   ; Sternenhimmel erstellen und immer zuerst einzeichnen
   CreateStarSphere()
   EntityOrder STARSPHERE,1
   
End Function

; -------------------------------------------------------------------------------------------------
; FUNKTION: Single Surface Starsphere erstellen
; -------------------------------------------------------------------------------------------------
Function CreateStarSphere()
   
   Local pm%,p0%,p1%,p2%,p3%,p4%,x#,y#,z#,s#,si#,star%,random#
   Local x1#,x2#,x3#,x4#,y1#,y2#,y3#,y4#,z1#,z2#,z3#,z4#
   Local h#,hm#,ha#,r#,g#,b#,col%,red%,green%,blue%,alpha#
   Local v0%,v1%,v2%,v3%,max%,dist#
   Local sphere%,surf%,i%
   
   Local t1%=0
   Local t2%=STARSPHERE_StarsYellow
   Local t3%=STARSPHERE_StarsYellow+STARSPHERE_StarsOrange
   Local t4%=STARSPHERE_StarsYellow+STARSPHERE_StarsOrange+STARSPHERE_StarsBlue
   Local t5%=STARSPHERE_StarsYellow+STARSPHERE_StarsOrange+STARSPHERE_StarsBlue+STARSPHERE_StarsWhite
   
   ; Zufallsgenerator
   SeedRnd STARSPHERE_Seed
   
   For i=1 To STARSPHERE_Layers
   
   max=(STARSPHERE_Percentage*163)-1
   
   ; Pivots erzeugen
   pm=CreatePivot()
   p0=CreatePivot()
   p1=CreatePivot(p0)
   p2=CreatePivot(p0)
   p3=CreatePivot(p0)
   p4=CreatePivot(p0)
   
   ; Alle-Sterne-Einzeichnen
   For star=0 To max
      
      ; Zufallsfaktor für Grösse und Farbe
      random=Rnd(0,1)
      
      ; 2% werden Fixsterne, 98% Hintergrund
      If random>(1.0-(STARSPHERE_Fixed%/100.0)) Then
         si=Rnd(STARSPHERE_MidStarSize,STARSPHERE_MaxStarSize)
      Else
         si=Rnd(STARSPHERE_MinStarSize,STARSPHERE_MidStarSize)
      EndIf
      
      PositionEntity p1,0,si,0
      PositionEntity p2,-si,0,0
      PositionEntity p3,0,-si,0
      PositionEntity p4,si,0,0
      
      ; Sternclustering
      If star>(max*(STARSPHERE_Clustering/100.0)) Then dist=Rnd(8,16) Else dist=Rnd(1,8)
      x=x+Rnd(-dist/STARSPHERE_Percentage,dist/STARSPHERE_Percentage)
      y=y+Rnd(-dist/STARSPHERE_Percentage,dist/STARSPHERE_Percentage)
      z=z+Rnd(-dist/STARSPHERE_Percentage,dist/STARSPHERE_Percentage)
      
      ; Position normalisieren
      TFormNormal x,y,z,0,0
      x=TFormedX()
      y=TFormedY()
      z=TFormedZ()
      
      ; Sternskalierung und Ausrichtung
      s=2.0/GraphicsWidth()
      PositionEntity p0,x,y,z
      
      ScaleEntity p0,s,s,s
      PointEntity p0,pm
      
      ; neue Pivotposition berechnen
      x1=EntityX(p1,1) : y1=EntityY(p1,1) : z1=EntityZ(p1,1)
      x2=EntityX(p2,1) : y2=EntityY(p2,1) : z2=EntityZ(p2,1)
      x3=EntityX(p3,1) : y3=EntityY(p3,1) : z3=EntityZ(p3,1)
      x4=EntityX(p4,1) : y4=EntityY(p4,1) : z4=EntityZ(p4,1)
      
      
      ; Sternhelligkeit- und Farbe von "normalen" Sternen (sind immer weiss)
      col=Rand(STARSPHERE_MinStarLight,STARSPHERE_MidStarLight)
      r=1.0 : g=1.0 : b=1.0
      
      ; Sternhelligkeit- und Farbe von Fixsternen
      If random>(1.0-(STARSPHERE_Fixed%/100.0)) Then
         
         col=col+(STARSPHERE_MaxStarLight-STARSPHERE_MidStarLight)
         
      EndIf
      
      If random*t5>=t1 And random*t5<t2 Then r=1.0:g=1:b=Rnd(0.25,0.5)         ; Gelbe Sterne
      If random*t5>=t2 And random*t5<t3 Then r=1.0:g=Rnd(0.5,0.75):b=0.5         ; Orangene Sterne
      If random*t5>=t3 And random*t5<t4 Then r=0.25:g=Rnd(0.5,0.75):b=1.0         ; Blaue Sterne
      If random*t5>=t4 And random*t5<t5 Then r=1.0:g=1.0:b=1                  ; Weisse Sterne
      
      ; Farben mischen
      red=col*r : green=col*g : blue=col*b
      
      ; Vertexe erstellen
      v0=AddVertex(STARSPHERE_Surface(i),x1,y1,z1,0,0)
      v1=AddVertex(STARSPHERE_Surface(i),x2,y2,z2,1,0)
      v2=AddVertex(STARSPHERE_Surface(i),x3,y3,z3,1,1)
      v3=AddVertex(STARSPHERE_Surface(i),x4,y4,z4,0,1)
      
      ; Vertexfarbe
      VertexColor STARSPHERE_Surface(i),v0,red,green,blue,1
      VertexColor STARSPHERE_Surface(i),v1,red,green,blue,1
      VertexColor STARSPHERE_Surface(i),v2,red,green,blue,1
      VertexColor STARSPHERE_Surface(i),v3,red,green,blue,1
      
      ; Vertexe > Dreiecke
      AddTriangle(STARSPHERE_Surface(i),v0,v1,v2)
      AddTriangle(STARSPHERE_Surface(i),v0,v2,v3)
      
   Next
   
   ; Hilfpivots löschen
   FreeEntity p4
   FreeEntity p3
   FreeEntity p2
   FreeEntity p1
   FreeEntity p0
   FreeEntity pm
   
Next

   ; Nebelsphere erstellen, flippen, skalieren
   sphere=CreateSphere(32)
   FlipMesh sphere
   ScaleMesh sphere,STARSPHERE_Scale,STARSPHERE_Scale,STARSPHERE_Scale
   
   ; Nebelsphere einfärben und Alphawert setzen
   surf=GetSurface(sphere,1)
   For i=0 To CountVertices(surf)-1
      VertexColor surf,i,STARSPHERE_Red,STARSPHERE_Green,STARSPHERE_Blue,STARSPHERE_Alpha
   Next
   
   ; Nebelsphere zur zweiten Surface hinzufügen
   AddToSurface sphere,STARSPHERE_Surface(0),STARSPHERE
   FreeEntity sphere
   
End Function

; -------------------------------------------------------------------------------------------------
; Ein Mesh mit seinen Daten zu einer Single Surface hinzufügen
; -------------------------------------------------------------------------------------------------
Function AddToSurface(mesh, surf,singlesurfaceentity)
   
   Local vert%[2],s%,surface%,i%,i2%,oldvert%
   
   For s = 1 To CountSurfaces(mesh)
      
      surface = GetSurface(mesh,s)     
      
      For i = 0 To  CountTriangles(surface)-1
         
         For i2 = 0 To 2
            oldvert = TriangleVertex(surface,i,i2)
            TFormPoint VertexX(surface,oldvert),VertexY(surface,oldvert),VertexZ(surface,oldvert), mesh,singlesurfaceentity
            vert[i2] = AddVertex(surf,TFormedX(),TFormedY(),TFormedZ(),VertexU(surface,oldvert),VertexV(surface,oldvert))
            VertexColor surf,vert[i2],VertexRed(surface,oldvert),VertexGreen(surface,oldvert),VertexBlue(surface,oldvert),VertexAlpha(surface,oldvert)
         Next
         
         AddTriangle(surf, vert[0], vert[1], vert[2])
         
      Next
      
   Next
   
End Function
 

Krischan

BeitragDo, Okt 23, 2008 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Du mal eine Beispieltextur für Deinen Code? Ich raffs net...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Okt 23, 2008 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Grad hochgeladen:

http://www.hectic.de/data/sterne0.png Aufteilung
http://www.hectic.de/data/sterne1.png Testbild

Das Ergebnis hat mich allerdings noch nicht überzeugt. Man müsste die Sterne separat zu den Galaxien machen. Die Galaxien allerdings dann nich über ein Super-Ikosaeder sonder über ein normalen Ikosaeder überziehen und vor den Sternen packen. Ich denke, dass man dann ganz gute Ergebnisse erzielen könnte.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group