Schatten auf dem Terrain

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Black Spider

Betreff: Schatten auf dem Terrain

BeitragDo, Apr 27, 2006 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 27, 2006 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird wohl ohne richtige Schattenengine nicht mögich sein. Aber schatten sind Seehhhrr kompliziert.
MFG Darren
 

coldie

BeitragDo, Apr 27, 2006 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 27, 2006 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Apr 27, 2006 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 27, 2006 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Blitzcoder

Newsposter

BeitragDo, Apr 27, 2006 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 27, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 .

Blitzcoder

Newsposter

BeitragFr, Apr 28, 2006 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 28, 2006 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Statische oder Dynamische SChatten?
between angels and insects
 

coldie

BeitragFr, Apr 28, 2006 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Blitzcoder

Newsposter

BeitragFr, Apr 28, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 28, 2006 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 28, 2006 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Blitzcoder

Newsposter

BeitragFr, Apr 28, 2006 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 28, 2006 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy hey danke,
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

BeitragFr, Apr 28, 2006 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group