Licht/Schatten in 3d/ES

Previous topic - Next topic

BumbleBee

Hab auch noch was mit Schatten die aber eigentlich gar nicht da sind.  Nur manchmal. Vielleicht mach ich kurzes Video.

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

kanonet

Nochetwas aufgefallen:

5. X_SPRITE wird nicht korrekt beleuchtet. Die Beleuchtung scheint berechnet zu werden, als ob das Sprite sich nicht zur Kamera gedreht hätte, sondern noch in die "ursprüngliche" Richtung schaut.

Ich habe den Beispielcode in meinen vorherigen Post um ein X_SPRITE erweitert um dies zu demonstrieren. Siehe bitte dort.
Grüße.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

X_SPRITE sollte eigentlich gar nicht beleuchtet sein, oder?
Order wird's verkehrt herum gezeichent? Puh - da brauch ich mal nen Tag frei dafür.

kanonet

#18
Also aktuell wird es mal beleuchtet und mal nicht, je nachdem wo das Licht steht. Wohin das Sprite dabei gedreht ist, hat keinen Einfluss. Siehe Codebeispiel.

Wie es idealerweise sein sollte? Hmm, bin mir nicht ganz sicher es gibt Fälle in denen es als normales Objekt behandelt (also auch beleuchtet)  werden sollte (z.B. Laub, Partikel) und es gibt Fälle in denen die Beleuchtung keine Rolle spielen sollte (z.B. Explosionen). Ist also nicht ganz einfach zu beantworten. Ideal wäre da wohl eine Wahlmöglichkeit, wobei ich dem keine hohe Priorität geben würde, da wäre eine Rotationsmöglichkeit des X_Sprites schon wichtiger. Aber auch hier hat das Bugfixing eine höhere Priorität als die Implementierung neuer Features.
So ungefähr sollte X_SPRITE auch funktionieren:
Code (glbasic) Select
FUNCTION CreateBillboard: num, sz
sz=sz/2
X_AUTONORMALS 1
X_OBJSTART num
X_OBJADDVERTEX  sz, -sz,  sz, 1, 1, RGB(255,255,255)
X_OBJADDVERTEX -sz, -sz,  sz, 0, 1, RGB(255,255,255)
X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, RGB(255,255,255)
X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, RGB(255,255,255)
X_OBJEND
ENDFUNCTION

FUNCTION DrawBillboard: num, x,y,z, cx,cy,cz, scale, rotation
X_MOVEMENT x, y, z
X_SCALING scale, scale, scale
X_ROTATION rotation, 0,0,1
z=cz-z
IF NOT z THEN INC z, 0.0000000000001
X_ROTATION -ATAN((cy-y)*COS(ATAN(cx-x, ABS(z))), ABS(z)), 1,0,0
X_ROTATION ATAN(cx-x, z), 0,1,0
X_DRAWOBJ num, 0
ENDFUNCTION


Quote from: kanonet on 2011-Mar-01
Übrigens verhält sich X_LINE seltsam, es [...] färbt die ganze Szene entsprechend der eigenen Farbe [...], siehe Code.
Tritt vor allem im Releasemodus auf, im Debugmodus jedoch kaum.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

BumbleBee

Hab schnell mal ein kleines Video (ohne Ton) gemacht das den Fehler mit dem Schatten zeigt. Mal ist er da dann wieder weg. Muß wohl wieder was mit dem Clipping zu tun haben.  =D Den Bug gibts schon sehr sehr lange nicht erst seit Version 9. Kommt dir die Figur bekannt vor, Gernot?  =D
 
Hier gehts direkt zum Blockbuster.   :P
           
          http://img132.imageshack.us/i/cpf.mp4/
   
Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

uh-oh!!
OK, no clipping if shadows are enabled then. :(

kanonet

Bumblebee, interessant ist auch, dass Wumbo einige male korrekt beleuchtet, d.h. nicht "zu dunkel" gezeichnet wird. Das habe ich noch gar nicht gesehen, bisher wurde bei mir jedes Objekt zu dunkel dargestellt (wenn es Schatten werfen soll...), ich habe es auf 3 Grafikkarten probiert... Was mich zu der Frage führt: warum tritt das bei dir (einige mal) nicht auf?

Noch was anderes: funktioniert bei jemanden Bumpmapping korrekt? Wenn ich z.B. das samples/3D/BumpMapping nehme, dann wird zwar das Bumpmapping an sich korrekt durchgeführt, jedoch wird das Objekt (+eigentliche Textur) dann bunt (grün/blau/lila) texturiert.

Je mehr ich mich mit GLBasics 3D Befehlen veschäfftige, desto mehr glaube ich, dass diese in weiten Teilen überarbeitet werden müssten. Schade bei dieser ansonsten vorzüglichen Sprache.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

#22
Ich glaube, dass ich die Punkte alle lösen konnte (bis auf die Skalierung, aber dazu habe ich auch eine Idee).

Code (glbasic) Select


SETCURRENTDIR("..")
// LOADSPRITE "icon.png", 0

DRAWRECT  0,0,16,16,0xffffff
DRAWRECT 16,0,16,16,0x00ff00
DRAWRECT  0,16,16,16,0xf0000
DRAWRECT 16,16,16,16,0x0000ff
PRINT "TEST",0,0
GRABSPRITE 0,0,0,32,32

LOCAL skybox=0, box1=1, box2=2, phi, lx, ly, lz, mx, my=600, mz=15, scale=1
LOCAL plane%=5

// Objekte erzeugen
CreateCube  (skybox, -100, RGB(255, 255, 255))
CreateCube  (box1, 5, RGB(255,255,255))
CreateCube  (box2, 5, RGB(255,255,255))




X_OBJSTART plane
X_OBJADDVERTEX -100,0, -100, 0,0,0xffffff
X_OBJADDVERTEX  100,0, -100, 0,0,0xffffff
X_OBJADDVERTEX -100,0,  100, 0,0,0xffffff
X_OBJADDVERTEX  100,0,  100, 0,0,0xffffff
X_OBJEND

X_SCALEMODEL box1, 3,1,1

// Hauptschleife
WHILE TRUE
// Eingaben abfragen
mx = mx + MOUSEAXIS(0) // Maus X-Achse -> Kamera drehen
my = my + MOUSEAXIS(1) // Maus Y-Achse -> Kamera zoomen
mz = mz + MOUSEAXIS(2) // Mausrad -> Licht bewegen
IF KEY(27) THEN INC scale, 0.1 // + gedrückt -> Quader strecken
IF KEY(53) THEN DEC scale, 0.1 // - gedrückt -> Quader stauchen

// Bewegung des Lichts berechnen
phi = GETTIMERALL() / 250
lx = SIN(-phi*3)*mz*2
ly = (SIN(3*phi)-COS(4*phi)) // bitte auch konstanten Wert ausprobieren, z.B. ly=2
lz = COS(-phi*3)*mz*2

// 3D Szene zeichnen
X_MAKE3D 1, 500, 45
X_CULLMODE 1
X_FOG RGB(180,180,200), FALSE, 250,270

// Kamera
X_CAMERA  my*COS(mx)/10,14,my*SIN(mx)/10 , 0,0,0


// Lichtquelle
X_SPOT_LT   0, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// Skybox
X_DRAWOBJ skybox, 0


X_DRAWOBJ plane, 0


// Box1 (mit Schatten)
X_MOVEMENT 25,0,0
X_SCALING scale,1,1 // spiele mal etwas damit rum, das Verhalten der Schatten ist interessant ;)
X_DRAWOBJ box1,0

// Box2 (ohne Schatten)
X_MOVEMENT 0,-7,0
X_SCALING scale,1,1
X_DRAWOBJ box2, 0

// Billboard
X_SPRITE 0, 0,0,0, 1.0


// Lichtquelle für Schatten setzen
X_SPOT_LT  -3, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// schattenwerfenden Würfel zeichnen
X_MOVEMENT 25,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1,0

X_SPOT_LT  -3, RGB(255,255,255), lx,ly,lz, 0,0,0, 0

// zeigt uns wo der Schatten liegen und wie er aussehen sollte (siehe Hinweise bei der Funktionsdefinition)
ShadowLines(box1, lx,ly,lz)

// etwas Text ausgeben
X_MAKE2D
DRAWRECT 0,0,800,20,RGB(0,0,0)
PRINT "KAMERASTEUERUNG: MAUS BEWEGEN    |    LICHTQUELLE BEWEGEN: MAUSRAD    |    QUADER SKALIEREN: +/-", 0,0

DRAWSPRITE 0,0,0
// und alles auf den Bildschirm bringen
SHOWSCREEN
WEND


// zeichnet eine Linie von der Lichtquelle durch jeden Vertex des Objekts und bietet somit eine Orientierung wie der Schatten aussehen sollte
// ignoriert GLBasic-bedingt sämtliche Drehungen, Skalierungen und Bewegungen des Objekts
FUNCTION ShadowLines: obj, x,y,z
LOCAL face[], count = X_NUMFACES( obj )
X_CULLMODE 0 // X_DOT und X_LINE funktionieren nur bei X_CULLMODE 0
FOR i = 0 TO count - 1
X_GETFACE obj , 0 , i , face[]
X_LINE x,y,z, 4*(25+face[0][0])-3*x, 4*face[0][1]-3*y, 4*face[0][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*(25+face[1][0])-3*x, 4*face[1][1]-3*y, 4*face[1][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*(25+face[2][0])-3*x, 4*face[2][1]-3*y, 4*face[2][2]-3*z, 3, RGB(255,255,0)
NEXT
X_CULLMODE 1
ENDFUNCTION


Das dann wenn ein Update da ist mal testen. Jetzt geht bei mir alles.

BumbleBee

Klingt super. :good: Ich bin auf jeden fall der Erste der das testet. Ich warte dann mal aufs Update. =D

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

Ich hab so viel geändert, dass ich das gar nicht als live-update rausgeben kann... Hmmm...
Mal sehen, wie ich das wieder mache.

BumbleBee

Quote from: Kitty Hello
   Ich hab so viel geändert, dass ich das gar nicht als live-update rausgeben kann
Na dann leg uns doch einfach Version 10 ins Osternest.  :booze:

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

Die wollte ich eigentlich Android vorbehalten. Hmm... Oder Trucidare muss sich schicken  :whip:

Nein, der Arme macht eh so viel...

kanonet

Habe mir die Beta (V9.052) gezogen und die 3D-Änderungen ausprobiert. Bin damit nicht zufrieden, wurde das nicht vollständig implementiert?

Allgemein zur Beta:
- Installer behauptet er würde V9.033 installieren.
- Nachdem ein Programm compiliert, gestartet und wieder beendet wurde, reagiert die IDE manchmal für eine zweistellige Sekundenzahl nicht, manchmal hilft nur noch ein beenden des Prozesses. Ich benutze in Win 7 64 Bit das dringend mal neu aufgesetzt werden müsste, kann also auch an meinem System liegen, jedoch gab es das Problem bei V9.040 nicht.

Zu 3d in der Beta und den bisher von mir gemeldeten Fehlern (detailliertere Beschreibungen und Bilder/Beispiele, siehe frühere Posts), soweit ich es bisher testen konnte:
1. Schatten skalierter Objekte werden in falscher Größe und/oder an falsche Stelle projiziert.
- bei x_scalemodel behoben, jedoch scheint x_scalemodel nur vor dem ersten x_drawobj zu funktionieren. Versucht man ein Objekt später noch einmal zu skalieren, dann ändert sich zwar der die Größe des Schattens korrekt, jedoch bleibt die Größe des (sichtbaren) Objekts gleich.
- bei x_scaling keine Veränderung, Problem besteht weiterhin. Ich vermute der Befehl soll ersetzt werden? Ich würde ihn nach Möglichkeit jedoch gern behalten wollen.

2. Objekte die Schatten werfen sollen sind zu dunkel / liegen immer selbst im Schatten.
- keine Veränderung / Problem besteht weiterhin.

3. Schatten werden von Nebel nicht beeinträchtigt, sind immer zu sehen.
- keine Veränderung / Problem besteht weiterhin.

4. Schatten werden an falsche Stelle projiziert.
- sie 1.

5. x_sprite wird falsch beleuchtet.
- Problem behoben, funktioniert wie es soll.

6. x_line färbt die ganze Szene in der eigenen Farbe ein. Tritt nur im Releasemodus auf, nicht bei aktiviertem Debugger.
- keine Veränderung / Problem besteht weiterhin.

Außerdem neu:
7. x_getface funktioniert als ob das Objekt sich auf der Position 25,0,0 befinden würde und nicht mehr wie bisher üblich auf der Position 0,0,0 (siehe meine Funktion shadowlines()).

Grüße.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

BumbleBee

Hab ich was verpasst? Das letzte SDK (heute nochmal runtergeladen) ist 9.033 und dann gibts halt das Update auf V.9.040. Wo ist da eine Beta 9.052? Ich seh nichts. Vielleicht war ich zu lange in der Sonne.  8)

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

kanonet

Die Aktuelle Beta hat die Nummer 9.052, einen Log der genauen Änderungen gibt es glaube ich noch nicht.
Zu finden ist sie (wie vorherige Betas) hier: http://www.glbasic.com/beta/glbasic_sdk.exe
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64