Objekte nur ausserhalb einer Kugel positionieren?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Hybrid

Betreff: Objekte nur ausserhalb einer Kugel positionieren?

BeitragMo, Okt 03, 2005 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal ein kleines Testprogramm gebastelt, welches Sterne erzeugt und zufällig im Raum positioniert. Leider habe ich überhaupt keine Ahnung, wie man es programmiert, dass die Sterne nur ausserhalb einer Kugel gesetzt werden, im Moment geschieht dies nur innerhalb eines virtuellen Kubus. Hat jemand eine Idee wie man dass umschreiben kann?

Screenshot:
user posted image

Source mit Grafiken:
http://www.extrasolar.de/bb/3dtest.zip (10KB)

Steuerung: mit den Pfeiltasten und der Maus, zusätzlich rechte Maustaste gedrückt gehalten verzehnfacht die Bewegungsgeschwindigkeit.

Gruß Hybrid
 

MegaTefyt

BeitragMo, Okt 03, 2005 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Jede Stelle der Kugelfläche hat vom Kugelmittelpunkt die gleiche Entfernung, nämlich den Kugelradius. Folgendes: du hast die Koordinate des Kugelmittelpunkts und setzt die Sterne nur, wenn der Abstand Kugelmitte <-> Stern größer als der Kugelradius ist.
 

Hybrid

BeitragDi, Okt 04, 2005 7:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok das hat soweit funktioniert, habe es mal so abgeändert:

BlitzBasic: [AUSKLAPPEN]
;Sterne laden / positionieren
For i=0 To 5000
nummer=Rnd(1,3)
stern=LoadSprite(\"stern\"+nummer+\".bmp\")
radius#=Rnd(.1,1)
ScaleSprite stern,radius#,radius#
x=Rnd(-150,150)
y=Rnd(-150,150)
z=Rnd(-150,150)
PositionEntity stern,x,y,z
If EntityDistance (stern,mitte) < 100 Then
If(x<0) Then x=x-120 Else x=x+120
If(y<0) Then y=y-120 Else y=y+120
If(z<0) Then z=z-120 Else z=z+120
PositionEntity stern,x,y,z
EndIf

Next


Und wie bekomme ich die Sterne genau auf den Radius der Kugel, also nicht kürzer aber auch nicht weiter? Da muss man doch bestimmt irgendwie mit Sinus/Cosinus arbeiten? Haben wir bestimmt mal in der Schule gelernt, habe ich aber offenbar verdrängt Embarassed

Gruß Hybrid
 

MegaTefyt

BeitragDi, Okt 04, 2005 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathematisch gesehen kannst du die Punkte ganz einfach "bestimmen":

user posted image
user posted image
user posted image
user posted image
(von wikipedia.de)


Mir ist aber auch noch eine andere, einfache Methode eingefallen, folgendes:

Du hast deinen Mittelpunkt, an diesem erstellst du deinen Stern. Nun erstellst du einen zufälligen Normalenvektor (drei mal RND(-1,1)) und richtest den Stern mit AlignToVector daran aus (Z-Achse). Das entspräche dann einer Zufallsrichtung, in die der Stern "schaut". Danach bewegst du dann den Stern um die Radiuslänge auf der Z-Achse, das wäre dann in die Zufallsrichtung. Ich hab dazu mal ein kleines Beispiel geschrieben (mit Zufallsfarben-Cubes Wink):

BlitzBasic: [AUSKLAPPEN]

Graphics3D 1280, 1024, 32, 1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Camera = CreateCamera()
CameraViewport Camera, 0, 0, GraphicsWidth(), GraphicsHeight()
CameraRange Camera, 0.001, 1000

Mittelpunkt = CreatePivot()
PositionEntity Mittelpunkt, 0, 0, 5
Radius# = 3

; 2000 \"Sterne\"
For I% = 1 To 2000

Cube = CreateCube(Mittelpunkt)
ScaleEntity Cube, 0.01, 0.01, 0.01
EntityColor Cube, Rand(0,255), Rand(0,255), Rand(0,255)

; Zufälligen Normalenvektor erstellen
NX# = Rnd(-1,1)
NY# = Rnd(-1,1)
NZ# = Rnd(-1,1)

; \"Stern\" am Normalenvektor ausrichten (Z-Achse)
AlignToVector Cube, NX, NY, NZ, 3

; \"Stern\" um Radiuslänge in Z-Richtung bewegen
MoveEntity Cube, 0, 0, Radius

Next

While Not KeyHit(1)

If KeyDown(203) Then TurnEntity Camera, 0, 1, 0
If KeyDown(205) Then TurnEntity Camera, 0, -1, 0
If KeyDown(200) Then MoveEntity Camera, 0, 0, 0.5
If KeyDown(208) Then MoveEntity Camera, 0, 0, -0.5

UpdateWorld
RenderWorld
Flip

Wend

End


Kannst du ja mal bei deinem Programm probieren. ^^
 

MegaTefyt

BeitragDi, Okt 04, 2005 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Achja, ich würde auch nicht jedesmal LoadSprite nehmen, sondern jedes Sprite einmal laden und dann mit CopyEntity arbeiten. Sprich:

BlitzBasic: [AUSKLAPPEN]

Global Sterne[10]
MaxAnzSterne% = 3

For I% = 1 To MaxAnzSterne Step 1
Sterne[I] = LoadSprite(\"Stern\" + I + \".bmp\")
HideEntity Sterne[I]
Next

; Und später im Programm dann halt:

Nummer% = Rand(1,3)
Stern = CopyEntity(Sterne[Nummer])



Nur so als Anmerkung noch dazu.
 

Hybrid

BeitragMi, Okt 05, 2005 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh prima, das ist genau das was ich gemeint habe! Ich werde mal damit herumexperimentieren Smile Den Wikipedia-Eintrag hatte ich mir bereits angesehen, bin aber nicht schlau draus geworden.

Vielen Dank nochmal, auch für den zweiten Tip, ich wollte das eh noch optimieren.

Gruß Hybrid

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group