Schatten auf dem Terrain
Übersicht

![]() |
Black SpiderBetreff: Schatten auf dem Terrain |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
da schatten schick aussehen, sollte unser Game auch welche haben... Nur leider habe ich nicht wirklich viel ahnung von sowas, und möchte keine fertige Schattenengine vorgesetzt bekommen, sondern selber eine schreiben. Der Schatten soll nicht ultramegamäßig Detailiert sein, doch ein Sprite schatten reicht bei weitem nicht. zur Info: das Objekt selber Bewegt sich nicht, es dreht sich und ist aus 2 Objekten zusammen gesetzt, wobei das obere ständig Rotiert. (Is ne Flak, und der "Kopf" lässt sich frei drehen).. Die Sonne hat eine Feste position, und das Licht ist direkt auf die Flak gerichtet. Weiss jemand, wie ich eine einfache, doch halbwegs vernünftige schattenengine schreiben kann? Kann mir jemand einen Denkanstoß geben, oder einen Ansatz zeigen? Danke! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Darren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wird wohl ohne richtige Schattenengine nicht mögich sein. Aber schatten sind Seehhhrr kompliziert. | ||
MFG Darren |
coldie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man kann doch den schatten auch aus mehreren Sprites zusammensetzen, so das sich nur teile des Schattens (für den flakkopf) drehen.
Ich frag mich schon länger, wie man es eigentlich machen soll, dass so ein Sprite schatten flach auf dem boden liegt, auch wenn das Gelände z.B. steil ansteigt (?). |
||
![]() |
MhhF |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich hab es volgendermaßen gelöst um auf den terrain schatten zu haben:
-eine multitextur erstellt die ich dem terrain auf einer höeren ebene als der terrain selbst zuwies -eine "sonne" in form einesr sphere und am "himmel" plaziert -eine "testsphere" erstellt die zur schattenerzeugung wichtig ist -nun positionierte ich die testsphere auf jedem punkt vom terrain (x,terrainY(x,0,z),z) und überprüfte per entityvisible(sonne,testsphere) ob die beiden durch irgendwas behindert werden wen ja hab ich bei der schattenmap (mus mindestens so groß sein wie der terrain selbst und auf die größe des terrains skaliert) einen schwarzen punkt raufgemalt wobei alle anderen punkte alpha=0 hatten jenachdem wie hoch der tetailgrad der schattenmap ist hast du eine detailierten schatten auf deinem terrain |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das kann man auch allein aus den Highmapinformationen berechnen. Hier hätte man dann auch die Möglichkeit unterschiedliche Helligkeiten für unterschiedliche Steigungen zu erstellen. Folgendes Beispiel kann Bilder erstellen die dann mit der selben Auflösung komplett über das ganze Terrain gezogen werden. Es werden auch 'Schlagschatten' (Also ein hocher 'Turm' auf einer flachen Ebene wird auf der Ebene lang gezogen) eingezeichnet. Den Lichteinfallswinkel kann man durch %-Angabe mit der Variable ls erledigen (voreingestellt ~20%). Die ls-Variable hängt natürlich wieder von der Skallierung des Terrains ab! Bessere Resultata bekommt man, wenn man dem erzeugtem Bild einen Blur verpasst und zusätzlich etwas mehr Helligkeit gibt.
Code: [AUSKLAPPEN] Graphics 512,512,0,2
SetBuffer FrontBuffer() hm%=0;Highmap Höheninformation lf#=0;Lichtfall für Schattenberechnung la#=0;Alter Lichteinfall(Winkel) fa#=0;Errechnete Farbe ls#=2;Lichtfall-Geschwindigkeit [User-Variabel] kt#=3;Kontrast [User-Variabel] name1$=Input$("LOAD Highmap Dateiname: ") name2$=Input$("SAVE Shadows Dateiname: ") bild1=LoadImage(name1) ix%=ImageWidth(bild1) iy%=ImageHeight(bild1) DrawBlock bild1,0,0 bild2=CreateImage(ix,iy) ;---- --- -- - - - - - For y=0 To iy-1 la=0 lf=0 For x=0 To ix-1 hm=ReadPixel(x+1,y-1) And $FF la=lf If lf>hm lf=lf-ls Else lf=hm fa=ATan2(lf-la+ls,1)*kt If fa>255 fa=255 If fa<0 fa=0 SetBuffer ImageBuffer(bild2) Color fa,fa,fa Plot x,y SetBuffer FrontBuffer() Next Next save=SaveImage(bild2,name2) End |
||
![]() |
MhhF |
![]() Antworten mit Zitat ![]() |
---|---|---|
hectics methode hat aber ein nachteil den es werden keine metshes benutzt die sich auf dem terrain befinden es ist nur der schatten den der terrain wirft | ||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
HI. Ich hab mal einen Ansatz geschrieben:
Code: [AUSKLAPPEN] Graphics3D 1024,768,0,2 AppTitle "Schatten Demo" cam=createcamera() PositionEntity cam,0,2,-12 cam2=createcamera() CameraViewport cam2,0,0,200,200 PositionEntity cam2,0,20,0 boden=createplane() PositionEntity boden,0,-2.4,0 EntityColor boden,255,50,50 schatten=createcone(30) EntityColor schatten,0,0,0 schattenobjekt=createcone(100) EntityColor schattenobjekt,200,130,0 PointEntity cam,schattenobjekt PointEntity cam2,schattenobjekt licht=createsphere(100) PositionEntity licht,0,2,3 ScaleEntity licht,0.3,0.3,0.3 EntityColor licht,0,255,0 SetBuffer BackBuffer() Repeat If KeyDown(200) Then MoveEntity licht,0,0,0.1 If KeyDown(208) Then MoveEntity licht,0,0,-0.1 If KeyDown(205) Then MoveEntity licht,0.1,0,0 If KeyDown(203) Then MoveEntity licht,-0.1,0,0 If KeyDown(2) Then MoveEntity licht,0,-0.1,0 If KeyDown(3) Then MoveEntity licht,0,0.1,0 surfaces=countsurfaces(schatten) For a=1 To surfaces surf=getsurface(schatten,a) punkte=countvertices(surf) For b=0 To (punkte-1) x#=(VertexX#(surf,b)-EntityX#(licht))/10 z#=(VertexZ#(surf,b)-EntityZ#(licht))/10 While VertexY(surf,b)>(-2) VertexCoords surf,b,VertexX(surf,b)+x,VertexY(surf,b)-0.2,vertexz(surf,b)+z If KeyDown(1) Then End Wend Next Next UpdateWorld RenderWorld ;FPS----------------------------------- If (MilliSecs()-fpszeit)<200 Then ; fps=fps+1 ; Else ; fpsanzeige=fps*5 ; fpszeit=MilliSecs() ; fps=0 ; EndIf ; Text 0,0,"FPS: "+fpsanzeige ; ;FPS----------------------------------- FreeEntity(schatten) schatten=createcone(100) EntityColor schatten,0,0,0 Flip Until KeyDown(1) End Das funht aber nur, wenn die ganu höhe des dings bekannt ist, auf das die Schtatten treffen. Bei nem Terrain kann man das ja mit terrainY() lösen. Also würde es so funzen MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
coldie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sieht sehr gut aus. Ich versteh nicht so ganz warum der Kegel flach auf dem plane angezeigt wird. Aber insgesamt scheint mir das zu einfach zu sein, um universal anwendbar zu sein.^^ Auf jedenfall mal austesten.
edit: Ach nee jetzt seh ich warum das flach ist. Cool kann ich gleich auch noch ein bischen Vertex movements üben . |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man muss den schatten noch ein bisschen entityalpha geben.
Und muss hlat ändern, dass er nicht auf der pos 0 oder wo auch immer ist, sondern auf terrainY() der jeweiligen stelle MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Statische oder Dynamische SChatten? | ||
between angels and insects |
coldie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
jetzt weis ich, wo der Hacken bei der Sache ist: Die Methode schluckt unglaublich viel fps wenn man mal ein komplizierteres model nimmt. Ich habs mit nem Flugzeug mit ca.3000 polys versucht. Natürlich würde man für den Schatten ein model mit viel geringerer polyzahl erstellen, aber bei mehreren Objekten läppert es sich trotzdem. Sehr cool ist allerdings, das das transparente glas vom Flugzeug auch beim Schatten transparent ist. | ||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
JO. Man müsste eine einfachere Möglichkeit finden, die Punkte des Modles in jeder schleife wieder auf die alten positionen zu setzten.
MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
coldie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ginge es vielleicht irgendwie, das der schatten gerendert und auf die geländetextur gezeichnet wird anstatt die vertexes zu bewegen? Weil ich glaub das die methode außerdem probleme bei Kanten von flachem zu steilem terrain hat. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, da du keine Textur machen kannst die gross genug wäre, so das vom Spieler mehr als eine verpixelte Form übrig bleiben würde. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das geht und ist auch sehr viel schneller, hat aber 2 Nachteile:
1. Das müsste dann exact so gamcht werden(die Neue Textur), dass sie auf die jeweilige lichtquelle passt. D.h. wenn man mehrere LIchter hat, gehts nicht mehr. 2. Es wird nicht verzogen, und passt sich den geläde nicht an. D.h. , dass der Schtten auch hinter einem Hügel erscheint, auf den er nicht sein kann. MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() die ansätze sind geil! @Blitzcoder: das ganze zieht aber massig FPS ! Das Model hat über 1000 Poly´s, und besteht aus 2 Teilen, die ich dann einzeln berechnen müsste... @Jan_: im prinzip dynamisch. Code: [AUSKLAPPEN] ginge es vielleicht irgendwie, das der schatten gerendert und auf die geländetextur gezeichnet wird anstatt die vertexes zu bewegen? Weil ich glaub das die methode außerdem probleme bei Kanten von flachem zu steilem terrain hat.
das wäre ziemliche geil, vor allem, da das objekt auf einem Flachen stück terrain steht. Wie würd´ das funzen? Danke! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dazu müsstest du die UV an welcher du dich gerade befindest herausfinden (das geht für u über Terrainbreite / (EntityX(player)-EntityX(terrain)) und für v entsprechend mit "höhe" und der y position). Dann müsstest du dort nur noch den entsprechend berechneten schatten zeichnen.
Aber wie gesagt, würde der nicht stimmend, da er nicht auf den untergrund eingeht (zb über bergspitzen hinaus projizieren und so). |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group