Skysphere zu Skybox - Textur aligned nicht richtig
Übersicht

KrischanBetreff: Skysphere zu Skybox - Textur aligned nicht richtig |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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: ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
CubeMapGen kannst Du Dir auch mal ankucken ![]() |
||
Play Satyr! |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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): Daraus kann man dann mit Sternen, Planet und Raumschiff sowas machen: |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hast Du mal eine Beispieltextur für Deinen Code? Ich raffs net... | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group