2D Schatten ... so gehts!!

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

bruZard

Betreff: 2D Schatten ... so gehts!!

BeitragMi, Sep 14, 2005 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass ich in Mathematik nicht wirklich eine Leuchte bin weiß ja nu' fast jeder ... und nun komme ich mit einem Problem welches genau das verlangt Confused

Zuerstmal eine Skizze die verdeutlichen soll was ich gleich beschreibe

user posted image

Ich habe eine punktförmige Lichtquelle deren Position ich natürlich ganz genau kenne ... nennen wir die Koords dieses Lichts einfach mal TLIght.x, TLight.y

Desweiteren habe ich einen Shadowcaster dessen Position und Grösse ich kenne ... TSCaster.x, TSCaster.y, TSCaster.width, TSCaster.height

Aus diesen Werten kann ich nun die Entfernung jedes einzelnen Punktes zueinander berechnen ... irgendwie kriegt man sicher auch noch die Winkel raus, aber bei Winkelfunktionen verglüht mir ständig die Hirnrinde...

Aaabeer: Wie kann ich den oben grau eingezeichneten Schatten nun berechnen? Es geht mir erstmal nur um die Berechnung der reinen Koordinaten ... Grafikanzeige ist hierbei garnicht so weichtig, das lese ich mir auch noch an Very Happy

Wäre cool wenn sich ein paar "Genies" mal beteiligen könnten Wink
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
  • Zuletzt bearbeitet von bruZard am Do, Sep 15, 2005 9:16, insgesamt einmal bearbeitet

TheShadow

Moderator

BeitragMi, Sep 14, 2005 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
*Genie hebt die Hand*

vor einigen Jahren habe ich mal sowas gemacht - > blitzbase/quellcodes

allerdings ist es "nur" Liniengrafik...

der Schatten hat auch eine gewisse länge - so groß, dass es über den Bildschirmrand hinausgeht...

sehr coole Formeln waren es bei Kreisen Smile
Da musste man Tangenten "suchen"

weiter musst du es zuende bringen...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

bruZard

BeitragMi, Sep 14, 2005 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp *Genie* Very Happy ... ich gucke mir mal an was Du da gezaubert hast
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

bruZard

BeitragDo, Sep 15, 2005 8:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs mir angeguckt und es könnte für das was ich brauche passen ... um den Kram aber auch irgendwann kapieren zu können habe ich es erstmal grob nach BMax übertragen ... könnte zwar alles noch etwas strukturierter und OOPiger sein, aber so gehts erstmal:

Code: [AUSKLAPPEN]

Strict

SetGraphicsDriver GLMax2DDriver()
Graphics 640,480,0
SetBlend ALPHABLEND


Rem
   ------------------------------------------------
   Kreis Shadowcaster
   ------------------------------------------------
EndRem
Type TCCircle
   Global _list:TList
   
  Field x:Int
   Field y:Int
   Field r:Int
   
   Method New()
      If _list:TList = Null Then _list:TList = New TList
      _list.AddLast(Self)
   End Method
   
   Method Add(x:Int, y:Int, r:Int)
      self.x = x
      self.y = y
      self.r = r
   End Method
   
   Method Kill()
      _list.Remove(Self)
   End Method
End Type
Global cast_circle:TCCircle


Rem
   ------------------------------------------------
   Polygon Shadowcaster
   ------------------------------------------------
EndRem
Type TCForm
   Global _list:TList
   
  Field x:Int
   Field y:Int
   Field r:Int
   Field c:Int
   Field a:Int
   
   Method New()
      If _list:TList = Null Then _list:TList = New TList
      _list.AddLast(Self)
   End Method
   
   Method Add(x:Int, y:Int, r:Int, c:Int, a:Int)
      self.x = x
      self.y = y
      self.r = r
      self.c = c
      self.a = a
   End Method
   
   Method Kill()
      _list.Remove(Self)
   End Method
End Type
Global cast_form:TCForm


Rem
   ------------------------------------------------
   ein paar Tatsachen in Stein meißeln
   ------------------------------------------------
EndRem
Global shadowlenght:Int   = 2000
Global playerx:Int            = 320
Global playery:Int          = 240


Rem
   einige Shadow-Caster erzeugen
EndRem
cast_circle:TCCircle = New TCCircle
cast_circle.Add(160,110,80)

cast_circle:TCCircle = New TCCircle
cast_circle.Add(470,380,50)

cast_form:TCForm = New TCForm
cast_form.Add(200,350,50,3,0)

cast_form:TCForm = New TCForm
cast_form.Add(400,200,50,6,0)


Rem
   ------------------------------------------------
   Mainloop
   ------------------------------------------------
EndRem
SetClsColor 128,128,128

While Not KeyHit(KEY_ESCAPE)
  Cls

  If KeyDown(KEY_LEFT) Then playerx=playerx-5
  If KeyDown(KEY_RIGHT) Then playerx=playerx+5
  If KeyDown(KEY_UP) Then playery=playery-5
  If KeyDown(KEY_DOWN) Then playery=playery+5

  draw_shadow()
  draw_obj()

  Flip
   FlushMem()
Wend
End


Function draw_shadow()
  Local p1x:Int
   Local p2x:Int
   Local p3x:Int
   Local p4x:Int
   Local p1y:Int
   Local p2y:Int
   Local p3y:Int
   Local p4y:Int
      
   SetColor 0,0,0

  For cast_circle:TCCircle=EachIn cast_circle._list
    Local dist:Float      = Sqr((cast_circle.x - playerx)^2 + (cast_circle.y - playery)^2)
    Local angle:Float   = ATan2(cast_circle.y - playery, cast_circle.x - playerx)
    Local distX:Float   = Sqr(dist^2 - cast_circle.r^2)
    Local angleX:Float   = ASin(Float(cast_circle.r) / dist)

    p1x = playerx + Cos(angle + angleX) * distX
    p1y = playery + Sin(angle + angleX) * distX
    p2x = playerx + Cos(angle - angleX) * distX
    p2y = playery + Sin(angle - angleX) * distX
    p3x = playerx + Cos(angle + angleX) * (distX + shadowlenght)
    p3y = playery + Sin(angle + angleX) * (distX + shadowlenght)
    p4x = playerx + Cos(angle - angleX) * (distX + shadowlenght)
    p4y = playery + Sin(angle - angleX) * (distX + shadowlenght)

    DrawLine p1x,p1y,p2x,p2y
    DrawLine p3x,p3y,p4x,p4y
    DrawLine p1x,p1y,p3x,p3y
    DrawLine p2x,p2y,p4x,p4y
'   DrawLine p1x,p1y,p4x,p4y <-triangle
  Next

  For cast_form:TCForm = EachIn cast_form._list
    Local angle:Float = (ATan2(cast_form.y - playery, cast_form.x - playerx) + 360) Mod 360
    Local _min:Float = 0.0
    Local _max:Float = 0.0

    Local a:Float = 360/cast_form.c

    For Local i:Int = 0 To cast_form.c-1
      Local px:Int = cast_form.x + Cos(i * a + cast_form.a) * cast_form.r
      Local py:Int = cast_form.y + Sin(i * a + cast_form.a) * cast_form.r

         Local angleX:Float = ((ATan2(py - playery, px - playerx) + 360) - angle + 720) Mod 360
      If angleX>180 Then angleX:-360
      If angleX<_min Then _min = angleX; p1x = px; p1y = py
      If angleX>_max Then _max = angleX; p2x = px; p2y = py
    Next
      
    p3x = p1x + Cos(angle + _min) * shadowlenght
    p3y = p1y + Sin(angle + _min) * shadowlenght
    p4x = p2x + Cos(angle + _max) * shadowlenght
    p4y = p2y + Sin(angle + _max) * shadowlenght
   
      DrawLine p1x,p1y,p2x,p2y
    DrawLine p3x,p3y,p4x,p4y
    DrawLine p1x,p1y,p3x,p3y
    DrawLine p2x,p2y,p4x,p4y
    'Line p1x,p1y,p4x,p4y <-triangle
  Next

   SetColor 255,255,255
End Function


Function draw_obj()
  SetColor 255,255,255
   Local ox:Int
   Local oy:Int
   
  For cast_circle:TCCircle = EachIn cast_circle._list
    DrawOval cast_circle.x - cast_circle.r, cast_circle.y - cast_circle.r, cast_circle.r*2, cast_circle.r*2
  Next

  For cast_form:TCForm = EachIn cast_form._list
    Local a:Float = 360/cast_form.c
    For Local i:Int = 0 To cast_form.c
      Local x:Int = cast_form.x + Cos(i * a + cast_form.a) * cast_form.r
      Local y:Int = cast_form.y + Sin(i * a + cast_form.a) * cast_form.r
      If i>0 Then DrawLine x,y,ox,oy
     
         ox=x
      oy=y
    Next
  Next

  SetColor 255,0,0
  DrawOval playerx-10,playery-10,20,20

   SetColor 255,255,255
End Function
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

bruZard

BeitragDo, Sep 15, 2005 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wenn ich hier ein wenig spamme ... aber ich habe es hinbekommen: Transparente Schatten in Echtzeit und 2D Smile

Nochmal vielen Dank an TheShadow für die super Vorlage!

Ersmo 'n Shot
user posted image

...und dann noch das Archiv mit Exe und Source Smile

http://www.timemill.de/pub/download/shadows.zip (ca. 1.42MB, habe kein Framework verwendet)
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

soli

BeitragDo, Sep 15, 2005 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein wenig OffTopic, aber da du gerade Framework erwähnt hast.
Kennt ihr den Framework Assistant?
Zitat:

Framework Assistant is a utility which creates BlitzMax 'Framework' templates.

When you compile a BlitzMax source file without a framework every module (in the mods folder) gets included in the final executable.
What Framework Assistant does is examine a *.bmx file and display only those modules needed by the program.
The output framework code can the be pasted into the source code.
After re-compiling the executables file size should be significantly smaller.


Features:

* Simple to use with HTML output
* Drag & Drop
* Separate reports for Imported code
* Frameworks for DX/OpenGL (depending on what is present in the source)

http://www.codersworkshop.com/...php?id=403


*****

Und danke euch beiden für die Transparenten Schatten,
sieht nach sehr guter Arbeit aus.
solitaire

D2006

Administrator

BeitragDo, Sep 15, 2005 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
kann das gut B3D schon lange:
user posted imageuser posted image
Anklicken zum vergrößern

Hier ein Download wo man ein paar Runden drehen kann:
Hier klicken.

Ich weiß ja nicht wie TheShadow das gemacht hat, aber ich nutze Vektoren -> Keine einzige Winkelfunktion.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

bruZard

BeitragDo, Sep 15, 2005 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
D2006 hat Folgendes geschrieben:
kann das gut B3D schon lange


B3D gibts ja auch schon eine Ecke länger und 3D Sprites wie in B3D gibt es in BMax nunmal nicht.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

klepto2

BeitragDo, Sep 15, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich hab das ganze mal in ModulForm gebracht und ein paar kleinigkeiten
hinzugefügt:

-Mehrere LichtQuellen
-Verschiedene Schattenfarben (jede Lichtquelle kann ihre eigene Farbe haben)
-Die Objekte kann man abschalten, das heißt sie werden nicht gezeichnet und
können durch Bilder oder ähnliches ersetzt werden.
-Die Lichtquellen sind beweglich
-Alle Formen ebenfalls
-Die n-Ecken können einfach rotiert werden

Link:

http://www.blitz-pasting.net/i...amp;id=309

beinhaltet das Modul und ein Sample.

Ich hoffe es ist nützlich.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

bruZard

BeitragDo, Sep 15, 2005 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
*Goilomat!*
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group