[B3d] Kleiner Lightmapper (Jack the Mapper)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

MrJack

Betreff: [B3d] Kleiner Lightmapper (Jack the Mapper)

BeitragDo, Aug 17, 2006 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal einen kleinen Lightmapper für Objektschatten auf einen
Terrain geschrieben. Das heißt, man erstellt in Blitzbasic sein Szene oder
Level und kann dann für das darunterliegende Terrain eine statische SchattenMap erzeugen. Vielleicht könnt ihr ja ein paar verbesserungsvorschläge machen, oder sogar ein paar funktionen
hinzufügen...

hier mal ein Beispiel, wie es aussehen kann
user posted image

Hier eine kurze anleitung :

Funktion: makeshadow(mapfile$,terrain,xpos#,zpos#,terrsize#,resolution#,light)

Parameter:

mapfile = Dateiname der fertigen ShadowMap (z.B.: "ShadowMap.bmp")

terrain = Handle für das Terrain, auf den der Schatten fallen soll

xpos,zpos = Position des Terrains. Ermitteln mit EntityX() und EntityZ()

terrsize = Die Größe nach Skalieren des Terrains
Wenn die Heightmap 256*256 groß ist, und man es
per ScaleEntity() auf das 2 Fache in x und z Skaliert,
ist das Terrain am Ende 512*512 groß.

resolution = Die größe der ShadowMap-Textur.
Angebracht sind größen wie 256 oder 512 etc.
Je größer die Textur desto länger dauert das Rendern.

light = Handle für das Licht. Dieses wird verwendet um
die Position zu ermitteln. Farbe, Typ oder Stärke
spielen keine Rolle

shadowcolor = Optional!
Die Schattenfarbe als Graustufe. 0 = Schwarz, 255 = Weiß
Standard ist 150

ambient = Optional!
Die Farbe der Standardbeleuchtung. Standard ist 255


Im MainFile Muss shadow_cube(0) Definiert werden!!!

und der Code:

Code: [AUSKLAPPEN]

Function makeshadow(mapfile$,terrain,xpos#,zpos#,terrsize#,resolution#,light,shadowcolor=150,ambient=255)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;; JACK THE MAPPER ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

If KeyHit(79) Then ;Aktivierung mit 1 auf NumPad
   gw = GraphicsWidth()
   gh = GraphicsHeight()
   Color 255,204,0
   bigfont = LoadFont("Courir New",24,1)
   SetFont bigfont
   FlushKeys
   schatten = CreateImage(resolution,resolution)
   SetBuffer ImageBuffer (schatten)
   ClsColor ambient,ambient,ambient
   Cls
   SetBuffer BackBuffer()
   terrcenter = CreatePivot()
   PositionENtity terrcenter,xpos+(terrsize/2.0),0,zpos+(terrsize/2.0)
   camera = CreateCamera()
   PositionEntity camera,EntityX#(light),EntityY#(light),EntityZ#(light)
   camerafogmode camera,0
   camerarange camera,.1,10000
   PointEntity camera,terrcenter
   RenderWorld
   Text gw/2,gh/2,"Diese Einstellung wird verwendet",1,1
   Text gw/2,gh/2+25,"zum Fortfahren Taste drücken...",1,1
   Flip
   WaitKey
   FlushKeys
   ;Schatten_Cube
   cubesize# = resolution/terrsize
   cubesize# =  1.0/cubesize#
   cubesize# = cubesize/10
   Dim shadow_cube(resolution-1)
   For i=0 To resolution-1
      shadow_cube(i) = CreateCube()
      EntityFX shadow_cube(i),1
      ScaleEntity shadow_cube(i),cubesize,cubesize,cubesize
   Next
   ;Schleife
   steps# = resolution/terrsize
   For y=0 To resolution-1
      RenderWorld
      For i=0 To resolution-1
         ;Würfel Bewegen
         PositionEntity shadow_cube(i),i/steps#,TerrainY(terrain,i/steps#,0,y/steps#),y/steps#
         If Not EntityVisible (camera,shadow_cube(i))
            paint(i,y,shadowcolor,schatten,1)
         EndIf
      Next
      ;;;;;;;;;;;STATUS ANZEIGEN;;;;;;;;;;;;;;;;;
      prz# =((y/resolution)*100)
      v$ = Floor(prz) + " % Fertig"
      Cls
      Color 255,204,0
      Text gw/2,gh/2,v$,1,1
      Flip
      If KeyDown(1) Then
         ssmap mapfile,schatten,gw,gh
         Return
      EndIf
   Next
   ssmap mapfile,schatten,gw,gh
   Return
EndIf

End Function

Function paint(X,Y,c,shadow,radius)
   SetBuffer ImageBuffer(shadow)
   rgb=0*$1000000 + c*$10000 + c*$100 + c
   LockBuffer ImageBuffer(shadow)
      WritePixelFast (X),(ImageWidth(shadow)-Y),rgb
   UnLockBuffer ImageBuffer(shadow)
   SetBuffer BackBuffer()
End Function

Function ssmap(mapfile$,map,gw#,gh#)
      FlushKeys
      Cls
      Text gw/2,gh/2,"SAVE MAP...",1,1
      Flip
      SaveImage map,mapfile
      Cls
      Text gw/2,gh/2,"Rendern erfolgreich",1,1
      Flip
      WaitKey
      End
End Function

Black Spider

BeitragDo, Aug 17, 2006 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hhmm... schick Very Happy
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif
 

martin_moehler

BeitragDi, Jun 17, 2008 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habdein lightmapper ausprobiert und er funktioniert auch an sich voll und ganz, nur das bei mir die cubes und die camera immer entityvisible = 1 sind.
Mit anderern Worten erkennt er meine Objekte nicht!

Kannst du mir weiterhelfen?

Mr.Keks

BeitragDi, Jun 17, 2008 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm... Das ist eher was fürs Codearchiv, auch wenns nicht sonderlich mächtig is. Ich verschiebe mal.

Eigenwerbung: Habe dazu auch mal was geschrieben. http://mrkeks.net/?show=artikel161
(Das beiliegende Programm ist allerdings nicht zur Verwendung, sondern nur zum Testen gedacht.)
MrKeks.net
 

martin_moehler

BeitragFr, Jun 20, 2008 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok Ich hab das Problem selbst gefunden!
Man muss für alle Objekte die einen Schatten werfen sollen einen EntityPickmode einstellen!
Lg Martin

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group