Sternenhimmel

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Moses

Betreff: Sternenhimmel

BeitragMi, Feb 11, 2009 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
da ich mit ner skybox für diesen zweck recht unzufrieden war, hab ich mir gedacht, für jeden stern der sichtbar sein soll einfach nen nett texturiertes dreieck in nen mesh rein und in nem radius per zufall ins all klatschen, und das mesh dann mit der camera mitführen.... funktioniert soweit auch super, die dx7 beschränkung lässt mich zwar nicht sonderlich viele dreiecke in das mesh packen, aber grossartig mehr währen auch nicht nötig für mein vorhabe...

nun das problem: das erstellen des meshes dauert schweine lange, vermutlich liegt es daran, dass ich immer das mesh mit randomwerten drehe bevor ein neuer stern hinzukommt ...

mir fehlt aber gerade der mathematische hirnschmalz um den einzelnen stern zum zentrum ausgerichtet randommmäßig gleich richtig an dem himmel zu bringen, wenn das ginge müsste er pro schleifendurchlauf nicht 3*(n+1) vertexe verdrehen sondern nur 3, würde nur einen bruchteil am an rechenaufwand zur jetzigen version brauchen:

Code: [AUSKLAPPEN]

Function CreateStars(image$, densety%, seed%, scale#)
   ;mesh, load texture & stuff
   stars_mesh = CreateMesh()
   stars_tex  = LoadBrush(image$, 2, 8, 8)
   stars_face = CreateSurface(stars_mesh, stars_tex)
   BrushFX stars_tex, 13
   ;set the seed
   SeedRnd seed
   
   ;limit densety to avoid mav cause of f*****g dx7 limits
   If densety > 21845 densety = 21845
   
   ;build the stars
   For i = 1 To densety
      ;random select startextur from 8x8 -image
      imgu%  = Rand(0,7)
      imgv%  = Rand(0,7)
      ;build triangle <- sollte gleich richtig gestetzt werden
      vns1 = AddVertex(stars_face, -0.5, -0.4, scale, imgu-0.035, imgv+0.2  )
      vns2 = AddVertex(stars_face, +0.5, -0.4, scale, imgu+0.965, imgv+0.2  )
      vns3 = AddVertex(stars_face, +0.0, +0.4, scale, imgu+0.465, imgv+1    )
      AddTriangle(stars_face, vns3, vns2, vns1)
      ;random rotation
      yaw#   = Rnd(360)
      pitch# = Rnd(360)
      roll#  = Rnd(360)
      RotateMesh stars_mesh, yaw, pitch, roll ; <- weil das ist zu laaannnngsaaaaammmmmm
   Next
   Return stars_mesh
End Function


hier noch ne funky 8x8 sternensammlung zum testen:
user posted image

densety 5000 ist noch angenehm aber 20000 suckt mächtig gewaltig, hoffe ihr seid da fitter als ich und könnt mir helfen ...
 

Krischan

BeitragMi, Feb 11, 2009 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hab ich was für dich - hier ist meine eigene Starsphere-Lösung, basierend auf einer Idee von hectic. Eine Nebeltextur auf eine minimale Geosphere projiziert und als Cubetextur abfotografiert, diese mit Hintergrundsterntextur versehen und dazu eine kugelförmiges Single-Surface-Mesh mit Flare-Sternen, die sich sogar zu Clustern anhäufen lassen. Spiel einfach ein wenig mit herum. Ach und es läuft bei mir hier auf dem Notebook mit fast 1000 FPS auf 800x600!

Die Einbindung ist denkbar einfach:

Include "starsphere.bb"
cam=CreateCamera()
StarBox=Initstarsphere(Cam,100,512,180.0,1.0,1.0,1.0,255,255,255)
EntityOrder starbox,1


(erstellt eine Starbox mit Grösse 100, 512er Texturauflösung, um 180° gedreht, Nebelalpha=1, Hintergrundsternealpha=1, Flaresternealpha=1, Meshfarbe 255,255,255).

und im Mainloop

PositionEntity StarBox,EntityX(cam,1),EntityY(cam,1),EntityZ(cam,1)

user posted image

Download Source+Media (175KB): https://www.blitzforum.de/upload/file.php?id=4675
 

Moses

BeitragMi, Feb 11, 2009 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal n dickes danke, sieht wirklich gut aus, aber das mit dem cube wollte ich eigendlich umgehen wegen dem fischaugen-effekt den man irgendwie nur mit camerazoom bekämpfen kann, der wiederum die cubetexturierung irgendwie verhunzt...

ansonsten werd ich jetz mal einfach meine fixsterne mittels 3 wild um das zentrum kreisenden und um ihre normale rotierenden pivots setzen ... dann hab ich nähmlich nen linearen aufwand amstatt das ganze mesh jedesmal zu rotieren ...

geosphären-abschnitte sind übrigens ne fette idee um nebel wiederum mit ner seed anzuordnen, wobei für mein vorhaben das all realistischer daher kommen soll (keine kritik an eurer wirklich tollen nebeltextur), sprich ich damit eher sparsam umgehen möchte.

mal sehen Smile

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 11, 2009 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine ''Sky''box erzwingt kein Fischaugeneffekt. Wenn eine Skybox richtig erstellt worden ist, kann man nicht mal bei genausten hinsehen die Nahtstellen erkennen. Selbst bei der Kameradrehung in dieser werden keine perspektivischen verzerrungen festzustellen sein. Nur so zur Info....

Eine Skybox ist also die Textursparenste und somit die recourcenschonenste Art, eine Rundumsicht zu erstellen. Das einzige Problem mit einer Skybox, wenn damit Sterne angezeigt werden sollen, ist die tatsache, dass die Quelltextur eine sehr große Auflösung haben sollte, damit die Sterne nicht zu groß erscheinen. Das Problem hat allerdings eine sogenannte Skysphere noch viel mehr, da diese gerade im Zentrum oben und unten einen sehr großen Datenverschleiß hat. Um das Texturproblem in den Griff zu bekommen, habe ich eben die StarSphere ins Codearchiv gestellt. Diese sollte zumindest die Texturgröße so weit minimieren.

Krischan hat die Sache perfektioniert indem er eine Mischung aus beidem gemacht hat.
- Eine Skybox um Nebel und andere charakterristik darstellen zu können.
- Eine Ein-Quad-Pro-Stern-Technik um den Auflösungsverlust zu minimieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Moses

BeitragMi, Feb 11, 2009 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ka eventuell hab ich mich falsch ausgedrückt, obem in dem bild ist der von mir ungewollte effekt deutlich zu sehen:

am rand des bildes wirken die sterne deutlich grösser und leuchtender als in der mitte, kein problem der spheren und boxen eher der camera einstellung...

kann man sehr weit reduzieren, indem man zb camerazoom auf 2 stellt, nur wenn ich das mit dem gepostetem source mache ... hauts mit der nebeltextur irgendwie nichtmehr hin :/

skey-z

BeitragMi, Feb 11, 2009 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@krischan

habe es mir gerade mal angeschaut, bekomme aber einen Fehler angezeigt

demo.bb
EntityOrder starbox,1 -> Entity is not a model or camera

ohne sehe ich keinen Nebel, aber es läuft zumindest
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Krischan

BeitragDo, Feb 12, 2009 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
skey-z hat Folgendes geschrieben:
@krischan

habe es mir gerade mal angeschaut, bekomme aber einen Fehler angezeigt

demo.bb
EntityOrder starbox,1 -> Entity is not a model or camera

ohne sehe ich keinen Nebel, aber es läuft zumindest


Ja das ist mir auch schon aufgefallen, aber nur im Debug-Modus, sonst läufts. Irgendwie mag es BB nicht, wenn man einem Pivot ein Entityorder verpasst. Kannst ja testweise in der starsphere.bb in der Funktion InitStarsphere gleich oben Local pivot%=CreatePivot() in Local pivot%=CreateCube() oder so ändern, dann meckert es nicht mehr.

Und wie hectic schon schrieb gibt es kaum eine schnellere Möglichkeit einen Sternenhimmel mit dieser Detailtreue darzustellen. Das Ganze benutzt nur minimal 7 Surfaces. Wenn man den Nebel und die Hintergrundsterne weglässt soger nur 1 Surface. Und man erkennt nicht, dass das Ausgangsmesh mal eine Kugel war (sogar eine Geosphere). Eine perfekte Illusion sozusagen...

Hier noch ein Tip zum Abfotografieren der Nebeltextur: die horizontale/vertikale Auflösung darf die Texturgrösse (in meinem Beispiel: 512) nicht unterschreiten, sonst klappt das nicht. Das heisst umgekehrt: möchte man den Nebel mit 1024 abfotografieren geht das nur in höheren Auflösungen (oder man speichert die Textur als Datei vorab mit einer höheren Auflösung und lädt diese später nur ein anstatt sie realtime zu erzeugen).

Oh da sehe ich noch eine Frage:

Zitat:
kann man sehr weit reduzieren, indem man zb camerazoom auf 2 stellt, nur wenn ich das mit dem gepostetem source mache ... hauts mit der nebeltextur irgendwie nichtmehr hin :/


Für das Abfotografieren benutze ich dieselbe Cam wie später, deshalb solltest Du den Camerazoom-Befehl erst NACH der Initialisierung verwenden, dann haut es wieder hin.
 

Krischan

BeitragDo, Feb 12, 2009 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier noch eine auf die Schnelle gebastelte einfachere Variante, die aber ähnlich performant ist und keine Skybox benutzt (die beiden Mediadateien geo6.3ds und nebel.jpg sind in der im ersten Post verlinkten Datei zu finden). Mit Space kann man die Fogsphere an/ausschalten um die reine Performance der Starsphere zu testen.

Hiermit ist es sogar möglich, hunderttausende Quads (=Sterne) auf ein Mesh zu packen, wobei für mich bei 20.000 die optische Schmerzgrenze erreicht ist (sonst sieht der Himmel zu vollgepackt aus). Läuft bei mir mit 700FPS mit Fogsphere und 950 ohne). Das Mesh kann man auch texturieren, macht aber bei so weit entfernten Sternen nur bedingt Sinn.

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

SetBuffer BackBuffer()

cam = CreateCamera()

movespeed#=1

; Starsphere erstellen
starsphere=InitStarSphere(cam,20000,0.1,0.15,0.95,64,255,100,1)
EntityBlend starsphere,3

; Fogsphere erstellen
fogsphere=LoadMesh("geo6.3ds")
ScaleEntity fogsphere,100,100,100
fogtex=LoadTexture("nebel.jpg")
EntityTexture fogsphere,fogtex
EntityAlpha fogsphere,0.3
FlipMesh fogsphere
EntityFX fogsphere,1
EntityOrder fogsphere,1

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

; Main loop
While Not KeyHit(1)
   
   ; FPS
    FPS_C=FPS_C+1
    If ms<MilliSecs()
        ms=MilliSecs()+1000
        FPS=FPS_C
        FPS_C=0
    EndIf
       
    ; Frame tweening
    Tween#=Float(MilliSecs()-FrameTime)/Float(20.0) : FrameTime=MilliSecs()
   
   ; Bewegung
    mxs#=MouseXSpeed()
   mys#=MouseYSpeed()
   RotateEntity cam,EntityPitch(cam)+(mys#/5),EntityYaw(cam)-(mxs#/5),0
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   If KeyDown(200) Then MoveEntity cam,0,0,movespeed*tween
   If KeyDown(208) Then MoveEntity cam,0,0,-movespeed*tween
   If KeyDown(205) Then MoveEntity cam,movespeed*tween,0,0
   If KeyDown(203) Then MoveEntity cam,-movespeed*tween,0,0
   
   ; SPACE: Fogsphere zeigen/verstecken
   If KeyHit(57) Then fs=1-fs : If fs=1 Then HideEntity fogsphere Else ShowEntity fogsphere
   
   RenderWorld
   
    Text 0,0,FPS
   Text 0,15,TrisRendered()
   
   Flip 0
   
Wend

End

Function InitStarSphere(cam%,stars%,min#,max#,fix#,mincol%,maxcol%,range#,scale#=1.0)
   
   Local star%,mesh%,surf%
   Local i%,size#,h%,a#
   Local cx#,cy#,cz#
   
   ; einzelnes Sternenquad erstellen
   star=CreateQuad()
   
   ; Starsphere erstellen
   mesh = CreateMesh()
   surf = CreateSurface(mesh)
   EntityFX mesh,1+2+16
   
   cx=EntityX(cam)
   cy=EntityX(cam)
   cz=EntityX(cam)
   
   ; alle Sterne erstellen
   For i=1 To stars
      
      If CountVertices(surf)>30000 Then surf=CreateSurface(mesh)
      
      ; Sterngrösse
      size=min*scale;Rnd(min*scale,max*scale)
      
      If Rnd(1)>fix Then size=max*scale;size=Rnd(min,max)*scale
      
      ScaleEntity star,size,size,size
      
      ; Starquad zurück auf Kameraposition
      PositionEntity star,cx,cy,cz
      
      ; Starquad zufällig drehen, von der Mitte wegbewegen und auf die Kamera zeigen
      TurnEntity star,Rnd(0,Rnd(180,360)),Rnd(0,Rnd(180,360)),Rnd(0,Rnd(180,360))
      MoveEntity star,0,0,range*scale
      PointEntity star,cam
      
      ; Farbe
      h=Rand(mincol,maxcol)
      
      ; Starquad zur Starsphere hinzufügen
      AddToSurface(star,surf,mesh,h,h,h,1)
      
   Next
   
   Return mesh
   
End Function

; Mesh mit allen Eigenschaften einer Surface hinzufügen
Function AddToSurface(mesh, surf,singlesurfaceentity,r%,g%,b%,a#)
   
   Local vert%[2],vr%[2],vg%[2],vb%[2],va#[2]
   Local surface%,oldvert%,i%,i2%,s%
   
   surface = GetSurface(mesh,1)
   For i = 0 To CountTriangles(surface)-1
      For i2 = 0 To 2
         oldvert = TriangleVertex(surface,i,i2)
         vr[i2]=r
         vg[i2]=g
         vb[i2]=b
         va[i2]=a
         
         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],r,g,b,a
      Next
      
      AddTriangle(surf,vert[0],vert[1],vert[2])
      
   Next
   
End Function

; Quad erstellen
Function CreateQuad(r%=255,g%=255,b%=255,a#=1.0,fx%=0)
   
   Local mesh%,surf%,v1%,v2%,v3%,v4%
   
   mesh=CreateMesh()
   surf=CreateSurface(mesh)
   
   v1=AddVertex(surf,-1,1,0,1,0)
   v2=AddVertex(surf,1,1,0,0,0)
   v3=AddVertex(surf,-1,-1,0,1,1)
   v4=AddVertex(surf,1,-1,0,0,1)
   
   VertexColor surf,v1,r,g,b,a
   VertexColor surf,v3,r,g,b,a
   VertexColor surf,v2,r,g,b,a
   VertexColor surf,v4,r,g,b,a
   
   AddTriangle(surf,0,1,2)
   AddTriangle(surf,3,2,1)
   
   EntityFX mesh,fx
   
   Return mesh
   
End Function
 

vanjolo

BeitragDo, Feb 12, 2009 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Woah Krischan,
ich bin begeistert.

Was ich nicht ganz verstehe ist der Punkt mit dem Abfotografieren. Eine Skybox z.B. mit Terragen erstellen ist mir geläufig. Was meinst du aber mit abfotografieren?
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault
 

Krischan

BeitragDo, Feb 12, 2009 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Terragen ist das Stichwort, da macht man das genauso. Ich "fotografiere" mit der Cam genau in der Mitte der Sphere alle sechs Richtungen (vorne,hinten,links,rechts,oben,unten) ab und erhalte somit die 6 Würfelseitentexturen, die ich später dem Würfel genauso zuweise. Aber eben nur noch 6 Surfaces, sieht aber genauso aus Very Happy
 

BIG BUG

BeitragFr, Feb 13, 2009 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Eine ''Sky''box erzwingt kein Fischaugeneffekt. Wenn eine Skybox richtig erstellt worden ist, kann man nicht mal bei genausten hinsehen die Nahtstellen erkennen. Selbst bei der Kameradrehung in dieser werden keine perspektivischen verzerrungen festzustellen sein. Nur so zur Info....


Naja, so ganz stimmt das nicht. Gerade bei konstanter Drehung ist schon zu erkennen, dass sich ein Sky-Box-Himmel verzerrt. Auch wenn man keine Seams erkennt, so lassen sich die Ecken doch erahnen. Da sieht eine SkySphere besser aus.
Aber gerade wenn der Sky nur als Hintergrund dient kann man das Verzerren einer Sky-Box sicherlich vernachlässigen. Außerdem ist eine Skybox einfacher zu erstellen als eine gute Skysphere.

@Krishan
Sehr hübsche Demo Smile
Aber auch hier kann man bei gleichmäßiger Drehung der Kamera(mit z.B. Turnentity) die Box-Verzerrung des Nebels gut erkennen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Krischan

BeitragFr, Feb 13, 2009 8:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, dann eliminieren wir die Seams mittels einer optischen Täuschung und verbessern den zweiten Code noch ein wenig, so dass wir nun auch farbige Sterne haben. Im Prinzip besteht der Weltraum nun aus drei Layern, sieht noch besser aus, hat dafür aber nur noch 700-800FPS).

Layer 1: Flarelayer mit mittelgrossen Sternen bis zu Fixsternen (alle orange, gelb, blau weiss zu je 25%)
Layer 2: Geosphere mit Nebeltextur
Layer 3: Cube mit Hintergrundsternen

Der "Trick" hierbei ist, dass ich über die Hintergrundsterntextur noch ganz dezent Softlight-Clouds geblendet habe, so dass es nun extrem schwierig wird, da überhaupt einen Seam zu erkennen. Es sieht nun auch nicht mehr so regelmässig aus. Da die Nebeltextur nun wieder auf einer (Geo-)Sphere ist gibt es hier wenn überhaupt noch an den Polen eine Störung, an der Stelle ist mein Weltall aber rabenschwarz Twisted Evil

Die Funktion starsphere=InitStarSphere(cam,10000,0.1,0.25,0.97,255,255,10,1) noch etwas erläutert (Reihenfolge der Optionen):

- cam: Kamera-Entity
- 10000: Anzahl Sterne
- 0.1: minimale Sterngrösse
- 0.25: maximale Sterngrösse
- 0.97: Wahrscheinlichkeit von Fixsternen (0-1 z.B. 0.97 = 3%, 0.5 = 50%, 1.0 = 0%)
- 255: minimale Helligkeit von weissen Sternen
- 255: maximale Helligkeit von weissen Sternen
- 10: Range (also der Radius der Starsphere)
- 1: Skalierung

Preisfrage: wo treffen auf diesem Bild 5 Wires auf einen Vertex?
user posted image

Download (125KB): https://www.blitzforum.de/upload/file.php?id=4700


In der Demo gibt es folgende Tastenkombinationen:

SPACE = Nebel an/aus
W = Wireframe an/aus
D = Drehung an/aus

Steuerung über Pfeiltasten / Maus

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 13, 2009 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
BIG BUG
Das erahnen der Nachstellen kommt, wenn man zu kleine Texturauflösungen benutzt. Bzw. folgendes. Da wo eine Skyphere einfach unschärfer wird, erwartet man bei einer Skybox einfach höhere Auflösungsdichte. Demnach müsste man beim abfotografieren der Teilbilder zu den Ecken hin die Textur unschärfer machen, damit die höhere Texeldichte in der Endszene kompensiert wird.

- - -

Skybox

Vorteile:
- Eine einfache Skybox ist einfach und schnell zu erstellen
- Benötigt maximal nur 12 Triangles
- Vollumrumsicht möglich

Nachteile:
- Benötigt im schlechtestem Fall 6 Surfaces
- Will man eine perfekte Skybox, so wird der Erstellungsaufwand ungleich größer.

- - -

Skysphere

Vorteile:
- Eine einfache Skysphere benötigt nur ein Surface
- Vollumrumsicht möglich

Nachteile:
- Im Zentrum oben und unten wird eine unmenge Texelverschleiß durchzogen
- In beiden Zentren werden trotz hoher Texeldichte keine hochen Darstelungsqualitäten möglich
- Benötigt eine unmenge an Triangles

- - -

Skyshell

Vorteile:
- Benötigt nur ein Surface
- Benötigt maximal 10 Triangles
- Kaum Texelverschleiß vorhanden

Nachteile:
- Keine Vollumrumsicht möglich

- - -

(Super)Ikosaeder

Vorteile:
- Maximal 20 Triangles (Ikosaeder) oder 60 Triangles (Super-Ikosaeder) benötigt
- Kaum Pixelverschleiß oder Verzerrungen vorhanden
- Ein Surface benötigt
- Vollumrumsicht möglich

Nachteile:
- Das erstellen der Textur wird zur tourtur und selbst bei größer Geduld kaum zu schafen
 

Moses

BeitragSa, Feb 14, 2009 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hier nochmal die optimierte noob-lösung von mir (mesh wird nicht mehr gedreht für jeden stern):

Code: [AUSKLAPPEN]

Function CreateStars(image$, densety%, seed%, scale#, oder%=1, parent=0)
   ;dummy-pivots
   sm=CreatePivot()
   s1=CreatePivot(sm)
   s2=CreatePivot(sm)
   s3=CreatePivot(sm)
   MoveEntity s1, -0.5, -0.4, scale
   MoveEntity s2, +0.5, -0.4, scale
   MoveEntity s3, +0.0, +0.4, scale
   ;mesh, load texture & stuff
   stars_mesh = CreateMesh()
   stars_tex  = LoadBrush(image$, 2, 8, 8)
   stars_face = CreateSurface(stars_mesh, stars_tex)
   BrushFX stars_tex, 13
   ;set the seed
   SeedRnd seed
   ;limit densety to avoid mav cause of fucking dx7 limits
   If densety > 21845 densety = 21845
   For i = 1 To densety
      ;random select random textur-part from 8x8-image
      imgu%  = Rand(0,7)
      imgv%  = Rand(0,7)
      ;random rotation of the dummy-pivots
      TurnEntity sm, Rnd(360), Rnd(360), Rnd(360)
      ;build triangle with help of the dummy pivots
      vns1 = AddVertex(stars_face, EntityX(s1,1), EntityY(s1,1), EntityZ(s1,1), imgu-0.035, imgv+0.2  )
      vns2 = AddVertex(stars_face, EntityX(s2,1), EntityY(s2,1), EntityZ(s2,1), imgu+0.965, imgv+0.2  )
      vns3 = AddVertex(stars_face, EntityX(s3,1), EntityY(s3,1), EntityZ(s3,1), imgu+0.465, imgv+1    )
      AddTriangle(stars_face, vns3, vns2, vns1)
   Next
   ;delete dummy-pivots
   FreeEntity s3
   FreeEntity s2
   FreeEntity s1
   FreeEntity sm
   ;stars should be always in the background
   EntityOrder stars_mesh, order
   ;set the parent
   If parent > 0 EntityParent stars_mesh, parent
   ;return the stars
   Return stars_mesh
End Function


vorteile:
-minimal eine surface nötig
-alle sternenpositionen werden mittels der des seedwertes berechnet
-nur eine kleine textur mit sternen nötig(128pixel x128pixel mit 8x8(64) unterschiedlichen sternen reicht eigendlich völlig aus)
-keine konstanten und variablen im maincode nötig, funktionsaufruf genügt (empfinde das als gut und richtig)

nachteile:
-nicht mehr als 21845 sterne möglich (wenn man mehr möchte, einfach mehr sterne mit unterschidlicher seed und order und/oder anderer textur an ein pivot hängen)
-noch keine nebel

anmerkung:
scale sollte von der verwendeten bidschirmauflösung abhängen zb. breite/8 (geschmacksfrage)
  • Zuletzt bearbeitet von Moses am So, Feb 15, 2009 2:00, insgesamt 3-mal bearbeitet
 

Moses

BeitragSa, Feb 14, 2009 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine erster versuch mit nebeln, sieht ganz gut aus denke ich:
user posted image

Code: [AUSKLAPPEN]

Function CreateNebula(image$, dimx#, dimy#, yaw#, pitch#, roll#, scale#, oder%=1, parent=0)
   ;mesh, load texture & stuff
   nebula_mesh = CreateMesh()
   nebula_tex  = LoadBrush(image$, 2, 1, 1)
   nebula_face = CreateSurface(nebula_mesh, nebula_tex)
   BrushFX nebula_tex, 13
   ;build quad with help of dummy-pivots
   vnn1 = AddVertex(nebula_face, -dimx/2, -dimy/2, scale, 0, 0)
   vnn2 = AddVertex(nebula_face, +dimx/2, -dimy/2, scale, 1, 0)
   vnn3 = AddVertex(nebula_face, -dimx/2, +dimy/2, scale, 0, 1)
   vnn4 = AddVertex(nebula_face, +dimx/2, +dimy/2, scale, 1, 1)
   AddTriangle(nebula_face, vnn3, vnn2, vnn1)
   AddTriangle(nebula_face, vnn3, vnn4, vnn2)
   ;rotate nebula
   RotateMesh nebula_mesh, yaw, pitch, roll
    ;nebular should be always somewehre in the background but in front of the most stars
   EntityOrder nebula_mesh, order
   ;set the parent
   If parent > 0 EntityParent nebula_mesh, parent
   ;return the nebula
   Return nebula_mesh
End Function


user posted imageuser posted image

vorteil:
-jeder nebel frei positionierbar
-jeder nebel wiederverwendbar

nachtele:
-jeder nebel braucht ein surface


anmerkung:
camerazoom ist auf 2 zu stellen...
 

Krischan

BeitragDi, Feb 17, 2009 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Moses, ich war zwischenzeitlich auch fleissig. Ich habe mich an einer 4096x2048er Nebeltextur versucht, die doch recht realistisch geworden ist Very Happy So mit Dunkelwolken, Emissionsnebel wie der im Sternbild Orion usw... Alles reine Handarbeit.

Das richtige "Ambiente" fehlte auch noch, und da nicht alle Grafikkarten 4096er Texturen unterstützen habe ich ein Funktion gebastelt, die ein Panoramaquad für 360° Texturen erstellt, wobei die Textur "übereinanderliegt" und später nur die UV-Koordinaten angepasst werden. Effektiv gibt das nun bei 2048x2048 die Qualität einer 4096er Textur. Zusammen mit der Sternfunktion sieht das Ergebnis so aus und läuft auch sehr schnell:

Screenshot "Milkyway"
user posted image

Der Aufruf ist denkbar einfach:

Milkyway=InitMilkyway(500,0.2,10,40,Cam,100,0,0,0,0,255,192,128,1,0,0,0,0)
500 = 500 Sterne
0.2 = Verteilung Fixsterne / normale Sterne (hier: 80% Fixsterne)
10 = Fixsterne im Winkel von 0° bis 10° gegen die Galaxieebene
40 = Normale Sterne im Winkel von 10° bis 40° gegen die Galaxieebene
Cam = Kamera
100 = Skala
Danach folgen jeweils die RGBA-Werte der unteren, mittleren und oberen Vertexreihe, die mit Filter 5 geblendet werden.

Download Media+Source (512KB): https://www.blitzforum.de/upload/file.php?id=4740

In der Demo kann man mit SPACE zwischen zwei Beispielen hin- und herschalten, sowie mit W den Wireframe-Modus anzeigen lassen. Steuerung wie üblich mit Pfeiltasten und Maus.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group