2D Schatten ... so gehts!!
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
bruZardBetreff: 2D Schatten ... so gehts!! |
Mi, Sep 14, 2005 17:07 Antworten mit Zitat |
|
---|---|---|
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
Zuerstmal eine Skizze die verdeutlichen soll was ich gleich beschreibe 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 Wäre cool wenn sich ein paar "Genies" mal beteiligen könnten |
||
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
TheShadowModerator |
Mi, Sep 14, 2005 18:25 Antworten mit Zitat |
|
---|---|---|
*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 Da musste man Tangenten "suchen" weiter musst du es zuende bringen... |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
bruZard |
Mi, Sep 14, 2005 18:28 Antworten mit Zitat |
|
---|---|---|
Danke für den Tipp *Genie* ... 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 |
Do, Sep 15, 2005 8:36 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Sep 15, 2005 9:08 Antworten mit Zitat |
|
---|---|---|
Sorry wenn ich hier ein wenig spamme ... aber ich habe es hinbekommen: Transparente Schatten in Echtzeit und 2D
Nochmal vielen Dank an TheShadow für die super Vorlage! Ersmo 'n Shot ...und dann noch das Archiv mit Exe und Source 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 |
Do, Sep 15, 2005 12:24 Antworten mit Zitat |
|
---|---|---|
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 |
D2006Administrator |
Do, Sep 15, 2005 12:44 Antworten mit Zitat |
|
---|---|---|
kann das gut B3D schon lange:
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 |
Do, Sep 15, 2005 13:06 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Sep 15, 2005 16:37 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Sep 15, 2005 17:03 Antworten mit Zitat |
|
---|---|---|
*Goilomat!* | ||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group