Seite 2 von 6

Verfasst: 14.03.2006 16:24
von Laurin
Meiner Meinung nach dürfte ein Lupeneffekt auf einem Sprite einen halbwegs realistischen Planeten hinbekommen.

(Das dürfte inetwa das sein, was NTQ schon gesagt hat.)

Jetzt komm ich

Verfasst: 14.03.2006 16:42
von Xaby
Ich bin ja ein Fan vom KC85, hatte selbst einen KC85/3, aber den besseren, nicht den aus Mühlhausen.

Hier: http://www.iee.et.tu-dresden.de/~kc-clu ... BRIK05.HTM

Also mit KC-Emu kann man einen KC85 emulieren. Die SSS und BAS-Dateien können einfach geöffnet werden und müssen nicht erst mit einer Kassette eingespielt werden :o

Das Programm, dass ich speziell meine ist GLOBUS.
Ich finds genial. Und da die heutigen Rechner nicht nur 1,7 MHz haben, sondern mehr als tausend mal so viel, dürfte es auch recht zügig gehen.
Keine Sprites, keine 3D-Engine und trotzdem genial.

:allright: :freak: Naja, aber eher Spielerei. Ansonsten bleiben dir noch Metaballs :lol:

Viel Erfolg mit deinem Vorhaben. Gruß, Folker

Verfasst: 14.03.2006 20:41
von STARGÅTE
danke danke aber mein Planet ist schon fix und fertig :allright:

er ist balt bei DUNE 2077 zu sehen

habe es mit TransformSprite3D gamascht und die punkte mit meinem code von vorne errechnet

her schnell ne test-Demo haben will hier:
http://hometown.aol.de/Hmmpgutt/Kugel_Mond.exe
zum schluss ist dann die eine Kante weg und licht!

Verfasst: 14.03.2006 20:55
von Sebe
Nice! :allright:
Wie genau hast du das denn nun gemacht?

Verfasst: 15.03.2006 01:58
von STARGÅTE
Sebe hat geschrieben:Nice! :allright:
Wie genau hast du das denn nun gemacht?
Also hier erst mal der Code

Kann sein das er bei dir/euch nicht mehr geht weil er mit 3.3 geschrieben ist oder das manche dinge überflüssig sind.

Das ist der Ansatz für die Kugel ich habe noch andere dinge hinzugefügt.
Wie schon gesagt, Licht, Effekte, ...

1. Bild laden und in kleine Quadrate teilen und diese als Sprite3D laden.
2. gleichmäßig die Punkte der Bild platzieren (360° um die Kugel und dann vom Äquator jeweils 90°) also ist es noch ein Rechteck.
3. Immer 4 Punkte für die Kugel berechnen und ein Sprite3D transformen.

Wenn ich dir die Formel da unten noch mal erläutern soll sag bescheid :allright:

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024, 768, 32, "Kugel") 

Structure P
 Px.l
 Py.l
 x.f
 y.f
EndStructure
NewList P.P()
Procedure Punkt(Px, Py, x.f, y.f)
 AddElement(P())
 P()\Px = Px         ; X-Sprite (0..36)
 P()\Py = Py         ; Y-Sprite (0..18)
 P()\x = x           ; Winkel (   0 .. 3600 )
 P()\y = y           ; Höhe   (  -r ..   r )
EndProcedure

b.f = 3.14159265/180 ; Bogenmaß

Poly = 12  ; Anzahl der Polygone durch 96
r.l = 200  ; Radius der Kugel in Pixel

q.f = 36/Poly/4*10 ; Konstante für später

Sprite$ = "textur_mond.bmp"


If LoadSprite(0, Sprite$)  ; das Bild muss 540 * 270 sein
 DisplaySprite(0, 0, 0)
 For x = 0 To Poly*4
  For y = 0 To Poly*2
   GrabSprite(4000, x*540/Poly/4, y*270/Poly/2, 270/Poly/2, 270/Poly/2, #PB_Sprite_Texture)
   SaveSprite(4000, "C:\Quadrat_Kugel.bmp")
   If LoadSprite(x*100+y, "C:\Quadrat_Kugel.bmp", #PB_Sprite_Texture)
    CreateSprite3D(x*100+y, x*100+y)
   Else
    End
   EndIf
  Next y
 Next x
 DeleteFile("C:\Quadrat_Kugel.bmp")
Else
 End
EndIf


; Erstellen der Punkte auf der Kugel
For x = 0 To Poly*4 :
 For y = -Poly To Poly
  Punkt(x, y+Poly, x*36/Poly/4*10, y*36/Poly/4*10)
 Next y
Next x


Repeat

 Kreis = Kreis + 1 ; rotation
 If Kreis >= 3600 : Kreis = Kreis - 3600 : EndIf

 ClearScreen(0,0,0)

 Start3D()
  ResetList(P())
  While NextElement(P())
   If P()\Px < Poly*4 :
    ; Berechung der 4 Punkte für TransformSprite3D
    x1 = 512+Sin((P()\x+Kreis  )*b)*Sqr(Pow(r,2)-Pow(Sin((P()\y  )*b)*r,2))
    x2 = 512+Sin((P()\x+Kreis+q)*b)*Sqr(Pow(r,2)-Pow(Sin((P()\y  )*b)*r,2))
    x3 = 512+Sin((P()\x+Kreis+q)*b)*Sqr(Pow(r,2)-Pow(Sin((P()\y+q)*b)*r,2))
    x4 = 512+Sin((P()\x+Kreis  )*b)*Sqr(Pow(r,2)-Pow(Sin((P()\y+q)*b)*r,2))
    y1 = 384+Sin((P()\y  )*b)*r
    y2 = 384+Sin((P()\y  )*b)*r
    y3 = 384+Sin((P()\y+q)*b)*r
    y4 = 384+Sin((P()\y+q)*b)*r
    TransformSprite3D(P()\Px*100+P()\Py, x1, y1, x2, y2, x3, y3, x4, y4)
    DisplaySprite3D(P()\Px*100+P()\Py, 0, 0, 255)
   EndIf
  Wend
 Stop3D()

 FlipBuffers()          
 ExamineKeyboard() 

Until KeyboardPushed(#PB_Key_Escape)

CloseScreen()

End

Verfasst: 15.03.2006 03:49
von Sebe
Danke, man lernt nie aus :mrgreen:

Verfasst: 15.03.2006 04:22
von KTX82
Da ich mich mit 3D-Formeln kein millimeter auskenne und demnach im Code nichts erkennen kann meine Frage: wird nur das gerendert, was auch sichtbar ist, oder auch der Hintere Teil der Kugel? Es ruckelt nämlich zwischenzeitlich etwas. Und den Kanten der Kugel (logisch *g*) nach zu urteilen sind es nicht mal all zu viele Sprites die hier zum Einsatz kommen müssen.

Verfasst: 15.03.2006 16:49
von STARGÅTE
KTX82 hat geschrieben:Da ich mich mit 3D-Formeln kein millimeter auskenne und demnach im Code nichts erkennen kann meine Frage: wird nur das gerendert, was auch sichtbar ist, oder auch der Hintere Teil der Kugel? Es ruckelt nämlich zwischenzeitlich etwas. Und den Kanten der Kugel (logisch *g*) nach zu urteilen sind es nicht mal all zu viele Sprites die hier zum Einsatz kommen müssen.
was du noch reinmach kannst ist das er die hinteren winkel nicht durchrechet aner das nix angezeit wird macht TransformSprite3D() automatisch <)

PS : wenn du ein problem mit den Kanter der Sprites zueinander hat (weise striche), dann nimm einfach ein negativen Radis. :allright:
Es entsteht trotzdem noch ein Planet nur andersherum :lol:

Verfasst: 16.03.2006 16:52
von NicTheQuick
Was ich an dem Code nicht verstehe:
Wozu ist diese Zeile gut:

Code: Alles auswählen

SaveSprite(4000, "C:\Quadrat_Kugel.bmp")
und wieso nimmst du überhaupt eine SpriteID von 4000? Bisschen hoch
vielleicht... Achso, du kennst noch kein [c]#PB_Any[/c], oder?

Aber trotzdem ist das mit dem Speichern doch bestimmt ziemlich langsam. Geht das mit [c]ClipSprite()[/c] nicht?

Am Ende könnte man die Sprites und Sprite3Ds wieder freigeben.

Verfasst: 16.03.2006 17:19
von STARGÅTE
NicTheQuick hat geschrieben:Was ich an dem Code nicht verstehe:
Wozu ist diese Zeile gut:

Code: Alles auswählen

SaveSprite(4000, "C:\Quadrat_Kugel.bmp")
und wieso nimmst du überhaupt eine SpriteID von 4000? Bisschen hoch
vielleicht... Achso, du kennst noch kein [c]#PB_Any[/c], oder?

Aber trotzdem ist das mit dem Speichern doch bestimmt ziemlich langsam. Geht das mit [c]ClipSprite()[/c] nicht?

Am Ende könnte man die Sprites und Sprite3Ds wieder freigeben.
wollte ich ja auch eigendlich machen aber! wenn ich ein [c]ClipSprite()[/c] nehme und dann [c]CreateSprite3D()[/c] ausführe nimmt er das original :freak:
Und wenn ich bei [c]GrabSprite()[/c] sage das es ein #PB_Sprite_Texture werden muss nimmt er das nicht an :freak: und [c]CreateSprite3D()[/c] schlägt fehl deswegen Speicher ich einen bereich und lade diesen als Sprite3D.

Umständlich aber es geht :allright:

Ich denke das liegt am verBUGten 3.3 :roll:

Aber ich habe mich in 3.3 verliebt ^^