Einen unendlichen 3D Raum erzeugen von ???
Es geht hier um Weltraum Szenen in 3D ... das Problem der "Box als Space" ist, daß man irgendwann gegen die Wand stoßen kann und daß sich die Darstellung des Weltraums bei der Bewegung des Players ändert. Dies ist in der Realität aber nicht so. Also muß ein Weg gefunden werden den Weltraum unendlich erscheinen zu lassen und dabei die Sterne an ihrem Platz zu lassen.

Eine Möglichkeit wäre die Skybox mit dem Player zu bewegen ... sehr schlecht, man wäre immer noch auf den Platz angewiesen den die Skybox bietet um andere Objekte darzustellen. Bleibt nur eins, die Skybox darf keine Box im eigentlichen Sinne sein...

Hier setzt meine Vorgehensweise an:

Erzeuge eine Kugel, belege sie mit einer Sternentextur und setze eine Kamera hinein.

Eine zweite Kamera dient als Player.

[code:1:8ae673eeb1]Graphics3D 800,600,16,1
SetBuffer BackBuffer()

;-------------------------------------------------
; Hintergrundbuffer erzeugen
; in dieses Bild malt die Sky-Kamera ihr Bild
Global backimg=CreateImage(800,600)

;-------------------------------------------------
; Jetzt erzeugen wir eine Kugel die als Skybox dient
Global sky=CreateSphere(32)

; Eine leere Textur erzeugen
skytex1=CreateTexture(768,768)

; Diese Funktion füllt die Textur mit unterschiedlich
; hellen Punkten
MakeStars(skytex1)
EntityTexture sky,skytex1,0,0

; Skybox umdrehen damit man sie von innen sieht
FlipMesh sky
ScaleMesh sky,4,4,4

; und verstecken...
HideEntity sky

; Einen Planeten erzeugen ...
Global planet=CreateSphere(16)
planettex=LoadTexture("venus.bmp")
EntityTexture planet,planettex
ScaleEntity planet,40,40,40

;-------------------------------------------------
; Kameras erzeugen

;1. Playercamera
Global cam_player=CreateCamera()

;2. Skycamera
Global cam_sky=CreateCamera()
CameraProjMode cam_sky,0

;-------------------------------------------------
; Playervariablen
; diese Daten können auch in normalen Variablen
; abgelegt werden. Ich verwende, der Gewohnheit
; halber, aber ein Type
Type tPlayer
;Die Drehung des Players speichern
Field rx#,ry#,rz#
End Type
Global player.tPlayer=New tPlayer

;-------------------------------------------------
; Initialisierungen

; Die ClsMode so einstellen daß der Hintergrund
; nicht gelöscht wird
CameraClsMode cam_player,0,1

; ein paar Einstellungen im Zoom um den
; "Fischaugeneffekt" zu vermeiden
CameraZoom cam_sky,1.5
CameraZoom cam_player,1.5

; Jetzt noch den Planeten in den Himmel hängen
PositionEntity planet,0,0,200

;-------------------------------------------------
; Hauptschleife
;-------------------------------------------------
Repeat
If KeyHit(1) Then End

msx#=MouseXSpeed() : msy#=MouseYSpeed()

; Hintergrund rendern
RenderSky()
DrawImage backimg,0,0

If KeyDown(200) Then MoveEntity cam_player,0,0,0.1
If KeyDown(208) Then MoveEntity cam_player,0,0,-0.1
If KeyHit(15) PointEntity cam_player,planet
player
y#=-msx#*0.1
player
x#=msy#*0.1

TurnEntity cam_player,player
x#,player
y#,0
MoveMouse 320,240

UpdateWorld : RenderWorld

Flip
Forever

;-------------------------------------------------
; Hintergrund rendern
Function RenderSky()
; Zuerst wird alles ausgeschaltet was die
; Sky-Camera nicht sehen darf
CameraProjMode cam_player,0
HideEntity planet

; Jetzt wird die Skybox sichtbar gemacht...
ShowEntity sky

; ...und die Ausgabe der Sky-Camera auf das
; Hintergrundbild gelegt
SetBuffer ImageBuffer(backimg)
CameraProjMode cam_sky,1

; nun drehen wir die Kamera um denselben Winkel
; wie der Player
TurnEntity cam_sky,player
x#,player
y#,player
z#

; ...schwups ... rein mit dem Bild in das
; Hintergrundbild
UpdateWorld : RenderWorld

; Nun schalten wir die Skybox mit Kamera wieder aus
; und geben die Kontrolle zurück an die normale
; Kamera
CameraProjMode cam_sky,0
HideEntity sky
ShowEntity planet
SetBuffer BackBuffer()
CameraProjMode cam_player,1

End Function


; Hier eine simple Funktion um ein paar Sterne
; zu erzeugen
Function MakeStars(tex)
SeedRnd MilliSecs()
SetBuffer TextureBuffer(tex)
w=TextureWidth(tex)
h=TextureHeight(tex)
Color 0,0,0
Rect 0,0,w,h,1
For i=0 To 3000
c=Rnd(0,255)
Color c,c,c
Plot Rnd(0,w),Rnd(0,h)
Next
SetBuffer BackBuffer()
End Function[/code:1:8ae673eeb1]
===
von dann ist c kaputt
Komisch, bei mir passiert nichts. In Vollbild oder Fenstermodus...
Das Programm startet und beendet gleich wieder...!??!!
===
von ???
Sage mal bitte BB-Version an
===
von ???
Sehr, sehr merkwürdig ... ich habe jetzt einen neuen Rechner (P4-2.4GHz mit GF4 und WinXP) und es läuft bei mir nur noch im Window-Mode (Wonder-Mode?)
Ich debugge das mal, könnte aber auch an BB1.78e Beta liegen.
===
von ???
Habe grade kein Bild der Venus parat... ...
===
von ???
Nimm das:
[img:044915565b]http://hot-server.de/darthmatze/venus.jpg[/img:044915565b]
also bei mir läufts, Vollbild und Fenster.
Aber im Vollbild ist es etwas langsam, kann aber auch sein das es an meiner Maus liegt, die ist etwas...kaputt...mal nen Counter einbauen...
[EDIT]
Ne liegt an der Maus, sind volle 75FPS.
===
von ???
Warum erstellst du nicht einfach mit plane() einen boden und ein dach?
===
von ???
Wie wärs wemma einfach ne Sphere erstellen, die imma auf die Pos von
der Cam aktualisieren und EntityOrder Sphere, x ...
===
von ???
Hmm lesen bildet sagt man
[quote:74dc36d8dd]
Eine Möglichkeit wäre die Skybox mit dem Player zu bewegen ... sehr schlecht, man wäre immer noch auf den Platz angewiesen den die Skybox bietet um andere Objekte darzustellen. Bleibt nur eins, die Skybox darf keine Box im eigentlichen Sinne sein...
[/quote:74dc36d8dd][/list]
===
von ???
Also ganz raff ich´s auch nicht wozu das hier gut sein soll (auch wenn´s sicherlich funktioniert). Kann ja sein daß ich das ebenfalls falsch verstehe aber - EntityOrder macht Platz so viel man will - da passt auch in ´ne Skysphere die 5x5x5 ist ein Objekt (z.B. eine Flotte) rein die 100000x100000x100000 gross ist. Einzige Beschränkung ist dann nur noch die CameraRange() aber die besteht so oder so. Falls eine Lage nicht ausreicht erhöht man halt für die Sphere den EntityOrderwert - aber "abgeschnitten" wird nicht durch die Sphere bei 5x5x5 sondern bei erhöhtem Orderwert erst bei der max CameraRange. Ausserdem sträubt sich bei mir der Gedanke in ´nem Weltraumgame das meist an Objekten wie Raumschiffen, Schüssen (Licht), usw usw. ohnehin schon recht an der Renderleistung zehrt hier noch einen zusätzlichen Rendergang einzulegen für den Sterne-effekt und auch wenn man´s mit EntityChild sicher zusammenfassen kann - im Endeffekt wird hier nicht nur 1 Planet zu hiden sein sondern sehr sehr viele Objekte und das in jeder Schleife.
===
von ???
@Grasy:
Wieso alle objekte etwas weiter nach vorne bringen, anstatt die Skybox nach hinten zu bringen?

[code:1:7072aa7e33]
MySky = CreateSphere(200)
EntityOrdner MySky, -1
[/code:1:7072aa7e33]
^ des reicht schon aus, und schon bleibt der himmel im Hindergrund.

MfG ShadowTurtle
===
von ???
Hi.....

hir gbt es doch ne rubrik...Was keiner weis. Stell das doch da rein.
===
von ???
@ShadowTurtle genau das tue ich... aber so:

[code:1:dd6bbece64]
MySky = CreateSphere(200)
EntityOrdner MySky, 1 ;oder höher
[/code:1:dd6bbece64]

Alle normalen Objekte lasse ich unverändert.
Ich weiss ja nicht wie gross du den Himmel machst und wie du ihn "mitträgst" aber wenn ich einen negativen Wert für die Sky-layer einsetze dann bewirkt das genau das Gegenteil von dem was du beschreibst: Der Himmel ist IMMER im Vordergrund und wird als letzer über alles andere gezeichnet. Minuswerte sind meiner Meinung nach gut für Waffen/Gegenstände am Player, gefaktem Nebel oder ähnlichem.
===
von ???
Stimmt, grasy. Das hatte ich vor Zwei/Drei Tagen auch bemerkt, dass es anderherum (also 1 statt -1) gehört. Ich war nur zu faul um es zu ändern... *löl*

MfG ShadowTurtle
===
von ???
Hi, grins :

Liegt mal wieder, wie bei fast allen BB-Codes, daran, daß der Programmierer einfach ein mieses Framework hat und keinerlei Zeitabhängigkeit im Rendering verwendet. Schau im BB Forum mal in die Code-Archives, da gibt es einige Beispiele für einigermaßen gutes Framework.

Autsch, Toni
===
von ???
Sorry,

@bruzard
===
von ???
@Hot-Bit:
Das hast Du zwar Hart ausgedrückt, aber irgendwie muss ich dir Recht geben.

MfG ShadowTurtle
===
von ???
Hi, grins,

das war nur die Retour-Kutsche !

*freu*

Toni
===
von ???
Trotzdem. Du hast Recht.
MfG ShadowTurtle



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: