Hallo,
habe hier mal ein kleines Testprojekt um ein paar Probleme zu dokumentieren, auf die ich gestoßen bin. Das Bild zeigt was ich meine:
(http://666kb.com/i/bp52yx320ul6m8zfv.gif)
1. Die gesamte Szene ist zu dunkel. Der Untergrund bspw. ist eigentlich weiß! Wenn ich kein Licht erzeuge ist alles ok, d.h. hell, erzeuge ich aber ein Licht (z.B. um Schatten erzeugen zu können), ist es so dunkel wie im Bild. Vermutlich ist das kein Bug, sondern nur ein Fehler meinerseits? Bitte um Hilfe.
2. Der Schattenwurf ist vollkommen falsch, es wirkt als würde das Licht viel niedriger hängen, als es hängt. Mir ist aufgefallen, dass dies nur bei skaliertem Mesh auftritt, behalte ich die Ursprungsgröße bei, sind die Schatten korrekt.
3. Eine "Lücke" im Schatten. Ich habe keine Ahnung, wie das kommt, aber mir ist folgendes aufgefallen: importiere ich das Objekt aus .md2 oder .obj tritt diese Lücke (und andere Fehler) auf, importiere ich aus .3ds gibt es diese Lücke nicht. Möglicherweise ein Fehler im 3d-Converter?
Beispielprojekt ist angehangen.
Vielen Danke.
[attachment deleted by admin]
My hint is that your model is not "closed" or some faces are flipped, it's a common error that 3d converting tools make. The flipped normals/surfaces are probably responsible for that shadow hole on number 3.
Mittlerweile habe ich mich wieder mit 3D beschäftigt und kann die gemeldeten Fehler genauer beschreiben:
1. Sämtliche Objekte für die Schatten gezeichnet werden sind zu dunkel, sowohl mit, als auch ohne Textur. Ein ein helles, nahe Pplatziertes Licht ändert dies nicht, das Objekt wird nie auch nur annähernd so hell beleuchet wie eines ohne Schatten. Dieser Fehler wurde bereits durch andere vor einer ganzen Weile gemeldet. -> länger bekannter Fehler in GLBasic 3D-Engine
2. Schatten werden falsch berechnet, wenn das Modell skaliert wurde. Wird es in Originalgröße verwendet, gibt es keine Probleme. Es wurden bereits Probleme mit Kollision skalierter Objekte gemeldet, vermutlich ist dies ein verwandtes Problem. -> länger bekannter Fehler in GLBasic 3D-Engine
3. Zu diesem Fehler habe ich nichts neues zu berichten, möglicherweise liegt dies wirklich nur an meinem Objekt, wobei es dann doch verwundert, dass es beim konvertieren aus manchen Formaten nicht auftritt.
Gernot, ich ich weiß, dass sich der Fokus der GLBasic-Entwicklung immer mehr vom PC auf Mobile Devices verschiebt, aber könntest du trotzdem bitte bei Gelegenheit ein Auge auf die 3D Engine werfen? Danke. ;)
Hmmmm ja leider geht im Moment iPhone und alles was man in die Hosentasche stecken kann vor. Ein paar deiner Probleme sind leider auch schon länger bekannt und nicht nur die. Ich trau mich nur nichts mehr zu sagen. ;) Da mußt du halt auch leider durch. Sei stark. =D
Cheers
Ich hab's auf die Todo geschrieben. Ich muss mal wieder paar Nachtschichten einlegen :/
1. Die Szene ist dunkel, weil hier keine Objekte gezeichnet wurden und der Schatten das nichts überdeckt.
Wenn Du eine Szene hast, sollte hier beleuchtet sein.
2. Ist ein Bug - behoben im nächsten Update. Probleme wirst Du bei inhomogenem Skalieren (x,y,z nicht alle gleich) aber auch mit den Kollisionen und anderen Spezialeffekten haben. Wenn ich das ändere, wird GLBasic viel langsamer. Ich halte das für unötig.
3. Das Loch kommt daher, weil das Model nicht ganz geschlossen ist. Bei Schatten ist es wichtig, dass die Modelle ganz sauber modelliert sind und nur aus geschlossenen Körpern bestehen.
Sorry für die lange Zeit.
Danke, dass du dir das angeschaut hast! :good:
1. Mir ist nicht ganz klar wie du das meinst (sorry falls ich dich nur nicht verstanden habe und die folgenden Ausführungen Blödsinn sind), aber ich kann ja meine Beobachtungen mal spezifizieren:
a) der Untergrund ("das Meer"):
Da Problem ist hier wohl einfach, dass das Objekt viel zu groß ist (5000x0x5000) und trotzdem nur aus 2 Faces besteht. Die Beleuchtung wird anscheinend an den Vertizes berechnet und deren Winkel zum Licht ist anscheinend zu spitz. Wenn ich das Licht auf extreme Höhe hänge (y=5000), dann ist es gut beleuchtet, d.h. es wird weiß dargestellt. Workaround ist es hier für mich, dass ich das Meer einfach in mehrere kleinere Faces teile, welche dann auch bei niedriger hängendem Licht korrekt beleuchtet werden. Schön wäre es, wenn die Beleutung auch bei so großen Faces (besser) funktionieren würde außerdem wäre ein Befehl CREATEPLANE() hier wohl auch nützlich. ;)
b) das Objekt ("das SCHIFF"):
Hier taucht der eigentlich von mir gemeinte Fehler auf: Objekte die einen Schatten werfen sollen sind immer zu dunkel, möglicherweise hängt dies damit zusammen, dass sie auf sich selbst keinen Schatten werfen. Wenn ich das richtig sehe, werden auf Objekte die Schatten werfen generell keine Schatten gezeichnet (bzw. sind sie so dunkel, dass Schatten auf ihnen nicht sichtbar sind). Ich habe dies bisher noch in keinem Projekt/Beispiel anders gesehen, daher wird dies wohl ein Fehler sein.? Siehe auch samples/3d/shadows und showroom/shadows (dies ist interessant, da der beschriebene Fehler in der beiliegenden exe nicht auftritt, jedoch taucht er auf, wenn ich den beiliegenden Code kompiliere; anscheinend bestand der vermutete Bug in der Schadowengine in V3 noch nicht).
2. Inhomogenes Skalieren brauche ich aber definitiv. In der Vergangenheit wurde bereits ein X_TRANSFORM Befehl vorgeschlagen, der ein Objekt dauerhaft in der Größe ändert (müsste im VRAM arbeiten?). Würde dies das Problem lösen/umgehen und wenn ja, würdest du dies implementieren?
3. Ok, habe das Modell jetzt mal probeweise geschlossen - und siehe da die Lücke ist verschwunden. Finde ich zwar seltsam, aber denn werde ich meine Modelle eben ab jetzt schließen.
In diesem Zusammenhang wäre interessant, wenn X_Ambient_LT einen größeren Einfluss auf alle Objekte hätte, d.h. auch Licht abgewandte Objekt/Faces etwas heller beleuchtet werden würden. In der Realität werden Objekte schließlich auch nicht nur durch direktes Licht angestrahlt, sondern meistens durch mehrfach reflektiertes, indirektes Licht.
Wenn ich gerade bei "wünsch dir was" bin: es wäre sehr nützlich, wenn die normalen sprite-Befehle (rotieren, zoomen,..) auch ein Äquivalent für X_SPRITE hätten, bzw. auf dieses anwendbar wären. 8)
Vielen Dank und Grüße,
Kanonet
Du zeichnest erst die ganze Szene(ganz normal) dann setzt du das Licht(X_SPOT_LT -3, 0, x,y,z, 0,0,0, 360
) und dann zeichnest du alles was schatten wirft!
Standardverfahren zum Erzeugen von Schatten. Sollte nicht das Problem sein, ich gehe mal davon aus, dass das ES dies korrekt umsetzt? Beschriebenes Problem tritt, soweit ich das sehe, auch bei korrekter Umsetzung auf.
Jo - das mit den großen Objekten ist ein Problem, da die Beleuchtung per vertice, nicht per pixel ist.
Aktuelle Liste der mir bekannten Bugs in der Schadowengine, das meiste wurde bereits genannt:
1. Update 9.014 hat kaum Verbesserungen gebrach, möglicherweise sogar Verschlechterungen, da sogar unskalierte Objekte falsche Schatten (zu kleine = wirkt als würde Licht weiter oben hängen als angezeigt) werfen. Hier ein Screenshot eines einfachen unscalierten Würfels (EntityCreateCube()), bei einer so niedrigen Lichtquelle sollte der Schatten deutlich größer sein.
(http://img143.imageshack.us/img143/2349/schattenzuklein.th.png) (http://img143.imageshack.us/i/schattenzuklein.png/)
Der Schatten scheint generell zu klein zu sein, bzw. hat er auch bei größerer Entfernung von Lichtquelle zu Objekt und von Objekt zur Projektionsfläche immer noch die Größe des Objektes, wird also nicht ausreichend hochskaliert. Eine kleinere Skalierung des Objekts erzeugt daher die Illusion, der Schatten würde korrekt berechnet werden, wobei dies nicht der Fall ist. Hier ein einfacher, nicht skalierter Würfel:
(http://img813.imageshack.us/img813/2349/schattenzuklein.th.png) (http://img813.imageshack.us/i/schattenzuklein.png/)
2. Objekte, die Schatten werfen sollen, sind immer noch zu dunkel. Ich gehe davon aus, dass sie berechnet werden, als ob sie selbst komplett im Schatten stehen. Hier zwei identische Würfel, wobei einer Schatten werfen soll und deshalb komplett zu dunkel ist:
(http://img101.imageshack.us/img101/5523/cubezudunkel.th.png) (http://img101.imageshack.us/i/cubezudunkel.png/)
3. Schatten werden nicht durch Nebel beeinträchtigt, d.h. ein Schatten ist auch dann deutlich zu sehen, wenn alle anderen Objekte im Nebel verschwunden sind. Dies betrifft nicht nur die "falschen Schatten" (gemeint ist die Verdunklung der Objekte, siehe Punkt 2), sondern auch die korrekt geworfenen Schatten auf anderen Objekten. Hier zwei identische Würfel, einmal mit und einmal ohne Schatten:
(http://img402.imageshack.us/img402/9140/schattenimnebel.th.png) (http://img402.imageshack.us/i/schattenimnebel.png/)
4. Die Schatten inhomogen skalierter Objekte werden an die völlig falsche Stelle projiziert und bewegen sich folglich auch bei gleichmäßiger Bewegung von Objekt oder Lichtquelle sprunghaft. Wer das sehen will sollte einfach den Donut in samples/shadows mit einem x_scaling 3,1,1 bearbeiten... Hier ein skalierter Würfel (3,1,1):
(http://img30.imageshack.us/img30/7458/schattenanfalscherstell.th.png) (http://img30.imageshack.us/i/schattenanfalscherstell.png/)
Zu den Problemen mit Schatten+Skalierung (also Punkte 1+4): neben der Parallele zu den Problemen mit Kollision+Skalierung (über die habe ich nur gelesen, es jedoch nicht getestet, wurden die mittlerweile behoben?), ist mir vor allem eines aufgefallen: ich muss die Objekte, welche Schatten werfen sollen noch einmal rotieren und an ihre Position bewegen, jedoch muss ich sie nicht skalieren! Egal ob ich an dieser Stelle ein x_scaling setze oder nicht und egal mit welchen Werten ich dies füttere - auf den Schatten hat dies überhaupt keinen Einfluss. Ich vermute daher, dass das skalieren für den Schatten versehentlich gar nicht durchgeführt wird und die beschriebenen Probleme möglicherweise daher rühren.
Außerdem verweise ich noch mal auf meinem Post vom 16.02. 6:17 Uhr in diesem Thread.
Es wäre schön wenn diese Bugs behoben werden könnten und/oder es zumindest eine kurze Stellungnahme à la "gelesen, schaue ich mir an / wird in nächster Zeit nicht behoben werden." gibt.
Grüße und vielen Dank.
my guesses...
1 - on code, can you cast the shadows after you re escale the objects? may be recreate the light source for such?
2 - try keep the 3d world you are shadowing as small as possible to the original scale, maybe ambient light can help? Beware that your sea polygon may be touching or overlapping the ship.
It sure helps if your sea has more polygons but beware when positioning them for shadows,
you should have them slightly under the ship, never touching it.
I hope it helps, you can always find turn around to known bugs if you can re-think your scene according to your final output. Final output is what matters.
Most 3d programs displaying open gl graphics have these problems too.
Can someone translate this in german in a proper way?
Hallo,
kannst Du bitte ganz kleine Projekte machen, die die Fehler eindeutlig beschreiben? Dann ist das leichter das zu testen.
Sorry.
Quote from: kanonet on 2011-Feb-27ich muss die Objekte, welche Schatten werfen sollen noch einmal rotieren und an ihre Position bewegen, jedoch muss ich sie nicht skalieren! Egal ob ich an dieser Stelle ein x_scaling setze oder nicht und egal mit welchen Werten ich dies füttere - auf den Schatten hat dies überhaupt keinen Einfluss.
Aus irgendeinem Grund kann ich dies gerade nicht mehr reproduzieren... Aber alle der beschriebenen Fehler können in diesem kurzen Projekt gesehen werden:
SETSCREEN 800,600,0
SETCURRENTDIR("..")
LOADSPRITE "icon.png", 0
LOCAL skybox=0, box1=1, box2=2, phi, lx, ly, lz, mx, my=600, mz=15, scale=3
// Objekte erzeugen
CreateCube (skybox, -100, RGB(255, 255, 255))
CreateCube (box1, 5, RGB(255,255,255))
CreateCube (box2, 5, RGB(255,255,255))
// 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
// zeigt uns wo der Schatten liegen und wie er aussehen sollte (siehe Hinweise bei der Funktionsdefinition)
ShadowLines(box1, lx,ly,lz)
// Lichtquelle
X_SPOT_LT 0, RGB(255,255,255), lx,ly,lz, -lx,-ly,-lz, 360
// Skybox
X_DRAWOBJ skybox, 0
// Box1 (mit Schatten)
X_MOVEMENT 0,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,7,0, 0.03
// Lichtquelle für Schatten setzen
X_SPOT_LT -3, RGB(255,255,255), lx,ly,lz, -lx,-ly,-lz, 360
// schattenwerfenden Würfel zeichnen
X_MOVEMENT 0,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1,0
// 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
// 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*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*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*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
Übrigens verhält sich X_LINE seltsam, es funktioniert nur mit X_CULLMODE 0 und färbt die ganze Szene entsprechend der eigenen Farbe (und die eigene Farbe ist auch nicht immer konstant...), siehe Code.
x_line win funzt hier falls es hilft
Hab auch noch was mit Schatten die aber eigentlich gar nicht da sind. Nur manchmal. Vielleicht mach ich kurzes Video.
Cheers
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.
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.
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:
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.
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
uh-oh!!
OK, no clipping if shadows are enabled then. :(
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.
Ich glaube, dass ich die Punkte alle lösen konnte (bis auf die Skalierung, aber dazu habe ich auch eine Idee).
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.
Klingt super. :good: Ich bin auf jeden fall der Erste der das testet. Ich warte dann mal aufs Update. =D
Cheers
Ich hab so viel geändert, dass ich das gar nicht als live-update rausgeben kann... Hmmm...
Mal sehen, wie ich das wieder mache.
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
Die wollte ich eigentlich Android vorbehalten. Hmm... Oder Trucidare muss sich schicken :whip:
Nein, der Arme macht eh so viel...
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.
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
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
Ok thx. Bin gerade am Testen mit der Beta 9.052.
Also der Schatten wird wie in dem Video, dass ich gemacht hab immer noch weggeclippt. Gibts da noch was was ich jetzt anders einstellen muß oder ist der Bug da vielleicht noch gar nicht behoben? Besonders interessant ist aber das man beim Start volle FPS hat und die dann plötzlich runter gehen auf manchmal 10 FPS oder noch weniger. Einfach z.B. mal das 3D Maze oder S-Zero Beispiel im Samples Ordner ausführen. Die FPS gehen jetzt sehr weit in den Keller. Aber dafür ist es ja auch noch eine Beta Version. =D Bei wem ist das noch so?
Cheers
Wenn ich das richtig gesehen habe, dann gab es in den neueren Betas nach 9.052 keine Änderungen an der 3D/Schattenengine? Wird daran im Moment gearbeitet oder haben andere Bereiche höhere Priorität? :whistle:
Grüße.
Oh. S-Zero und 3D Maze machen bei mir alles schwarz :S
Muss ich mal sehen. Was das nu wieder is... !?
10 FPS ist bisserl wenig. Sowas doofes.
Am Schatten habe ich was geändert. Ich meine, dass Objekte jetzt bei aktivem Schatten nicht mehr geclipt werden (sollten).
Bei meinem Test ging das.
Wenns eine neue Beta gibt dann sag bitte bescheid. Ich teste dann gleich mal. =D
Cheers
Ich habe jetzt V10 getestet, konnte aber keine Veränderungen zu meinem Test hier (http://www.glbasic.com/forum/index.php?topic=5419.msg48211#msg48211) feststellen, die Probleme bestehen immer noch in der dort beschriebenen Form. Ist damit zu rechnen, dass sich dies in der nächsten Zeit noch einmal angeschaut wird? Ich bin immer gerne bereit diverse Tests durchzuführen, falls es nötig ist. ;)
Grüße.
X_SCALING Schatten würde viel Rechenpower benötigen. Soll ich das wirklich einbauen?
Schatten im Nebel kann man wohl auch nicht so leicht lösen, da ich für den Schatten ein single-pass Verfahren verwende (brutalinski schnell, aber halt auch Einschränkungen)
X_LINE muss ich behben.
X_SCALING und X_SCALEMODEL unterscheiden sich in der Nutzung grundsätzlich und haben sicher beide ihre Berechtigung. Obwohl GLBasic mit möglichst wenigen Befehlen auskommen soll, würde ich dafür plädieren, beide zu behalten (solange es nicht zu viel Aufwand für dich wäre). Natürlich müssten dann auch beide Funktionieren. ;)
Wäre die Verlangsamung denn sehr signifikant? Und würde sie den Befehl generell betreffen, oder nur beim Zeichnen von Schatten auftreten? Letzteres wäre sicherlich akzeptabel, da man den Spieler ohnehin die Chance geben sollte die Schatten zu deaktiveren, wenn seine Rechenleistung nicht ausreichend ist.
Das mit dem Nebel ist natürlich auch keine gute Nachricht, auch hier wäre wieder die Frage: wie stark fiele die Verlangsamung aus und ließe sie sich auf die Nutzung von Schatten beschränken?
Der mich am meisten störende Bug in der Schattenengine ist aber ohnehin der Umstand, dass Schatten werfende Körper immer dunkel sind (da sie sich vermutlich selbst vollständig in Schatten hüllen). Würde dies behoben werden, wäre das für mich persönlich schon ein großer Schritt nach vorn.
Grüße.
Ich verstehe das nicht: Schattenwerfendes Objekt im Schatten - Kannst Du hier ein Beispiel machen?
Ich meine das, was ich u.a. hier beschrieben habe:
Siehe Punkt 2 (sogar mit Bild) (http://www.glbasic.com/forum/index.php?topic=5419.msg45771#msg45771)
Ah. kapiert. Hm... Das kommt bei Quadern mit direkter Lichteinstrahung vor. Kann ich sicher ändern!
[Edit]
OK, alle Probleme sind gelöst (Update auf 10.013 oder höher (rappelt gerade im Hintergrund) ).
Testprogramm:
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 -12,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1, 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(0,0,64), 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
Tritt natürlich nicht nur bei Quadern mit direkter Lichteinstrahlung auf. ;)
Aber für mich sieht es so aus, als hättest du dieses Problem gelöst, Gratulation und Danke! :nw:
Man muss nun wieder zwingend das zweite X_SPOT_LT -3 setzen, damit es funktioniert, das nur als Hinweis an andere, die es selbst ausprobieren wollen. Übrigens bedeutet das, dass das Entitysystem ausgebessert werden muss, dieses arbeitet nur mit einem X_SPOT_LT -3 (ich würde ja meine Verbesserung posten, habe aber schon deutlich mehr Veränderungen vorgenommen).
Die anderen Probleme die ich beschrieben habe bestehen natürlich weiterhin, ich verweise dazu auf diesem Post (http://www.glbasic.com/forum/index.php?topic=5419.msg48211#msg48211), Punkt zwei wurde gelöst, Rest ist noch aktuell.
EDIT:
Der Übergang von Licht zugewandter zu im Schatten liegender Seite eines Objekts ist etwas sehr kantig/schlagartig. Beobachte mal den Dounat im Samples/3D/schadows, dann solltest du sehen, was ich meine.
Dafür habe ich gerade festgestellt, das X_LINE auch repariert wurde und nun wieder funktioniert. :good:
Als nächstes wünsche ich mir eine Klärung von X_SCALEMODEL vs X_SCALING.
Noch eine Idee zum Nebel+Schatten: Nebel werden ja meist in größerer Entfernung gezeichnet, wäre es da nicht auch möglich ab einer gewissen Entfernung keine Schatten mehr zu zeichnen? Für meine Zwecke wäre das OK, da es dem Spieler sicher nicht auffallen würde, dafür wäre das Problem Schatten+Nebel gelöst und es würde Rechenzeit eingespart werden. Kann ich aber auch locker selbst so programmieren. :booze:
Hast Recht - nach dem Zeichnen der Schatten kann man mit X_SPOT_LT -3, RGB die Farbe zu wechseln. Sollte aber mit X_MAKE2D/SHOWSCREEN auch gehen -> muss ich nochmal abchecken.
Nebel kann ich nicht machen, da mein Schatten ein 1-pass Verfahren ist:
Ich zeichne die Szene beleuchtet, dann die Shadow-Volumes als 3D in den Stencil buffer. Dabei invertiere ich diesen mit jedem überzeichnen. Wenn jetzt der Stencil-Buffer =0 ist (also 0, 2, 4, 8 Schattenflächen darüber gezeichnet), dann ist hier kein Schatten. Sonst schon.
Und dann (Trick 17) zeichne ich ein einfarbiges Rechteck in 2D über den Bildschirm an den Stellen, wo Stencil=1 ist (also im Schatten). Klar, dass das Monstermäßig schneller ist als die komplette Szene 2x zu rendern. Ist nicht ganz sauber, sieht aber ganz gut aus. Problem: Dieser Schatten ist quasi nur eine Sonnenbrille mit Löchern reingeschnitten -> Keine Z Information.
Schatten skalierter Objekte geht doch!? Das Model ist X_SCALING 5,1,1, oder?
X_GETFACE liefert Koords des Objekts - hat nichts mit X_MOVEMENT zu tun! Du kannst aber X_GETMATRIX machen und die Koordinaten durch diese Matrix jagen um die Welt-Koords zu haben. (Auch hier ist scaling dann berücksichtigt).
X_SCALEMODEL skaliert das Model, als hättest Du es so gezeichnet. Damit geht auch Kollision korrekt. Die Schatten werden auch mit X_SCALING gut angezeigt.
Das zweite X_SPOT_LT -3 muss im Moment zwingend gesetzt werden, sonst funktioniert es nicht. Ist aber kein Problem und kann meinetwegen gerne so bleiben, man muss es nur wissen.
Dass das mit dem Nebel nicht behoben werden kann habe ich schon verstanden, daher hatte ich ja mein persönliches Work-around erwähnt, für den Fall, dass du es als Standard oder Option in GLB integrieren willst.
X_GETFACE funktioniert einwandfrei, ich hatte nicht gesehen, dass du meine Funktion Shadowlines() verändert hattest. :-[
Ich weiß wozu X_SCALEMODEL und X_SCALING da sind, nur funktionieren sie beide noch nicht fehlerfrei. Außerdem ist mir noch nicht klar, ob du vor hast uns beide Befehle definitiv zu erhalten, oder ob einer der beiden später aus dem Befehlssatz verschwinden soll.
Damit bleiben auf meiner Bugliste der Schattenengine nur noch:
1. Schatten+Nebel --> kann wohl nicht ohne weiteres behoben werden und ist mir nicht wichtig
2. Übergang von Licht zu Schattenseite eines Objekts ist zu schlagartig (siehe meinen letzten Post)
3. Skalierung geht immer noch nicht, weder mit X_SCALEMODEL, noch mit X_SCALING siehe dazu mein Beispiel (bitte unbedingt die Tasten + und - verwenden, sonst wird nichts skaliert ;)):
SETSCREEN 800,600,0
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))
// 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) // + gedrückt -> Quader strecken
scale=scale*1.1
X_SCALEMODEL box2, 1.1,1,1
ENDIF
IF KEY(53) // - gedrückt -> Quader stauchen
scale=scale*0.9
X_SCALEMODEL box2, 0.9,1,1
ENDIF
// 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
// Box1 (oben)
X_MOVEMENT 0,0,0
X_SCALING scale,1,1 // spiele mal etwas damit rum, das Verhalten der Schatten ist interessant ;)
X_DRAWOBJ box1,0
// Box2 (unten)
X_MOVEMENT 0,-9,0
X_SCALING 1,1,1
X_DRAWOBJ box2, 0
// Lichtquelle für Schatten setzen
X_SPOT_LT -3, RGB(255,255,255), lx,ly,lz, 0,0,0, 360
// Box1 (oben)
X_MOVEMENT 0,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1,0
// Box2 (unten)
X_MOVEMENT 0,-9,0
X_SCALING 1,1,1
X_DRAWOBJ box2, 0
// Schattenmodus beenden
X_SPOT_LT -3, RGB(0,0,32), 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
// 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*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*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*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
oh. Bug in X_SCALING mit Schatten. Muss ich mich mal reinlesen. Ich hab' schon eine Idee.
Ja, X_SCALING und X_SCALEOBJ bleiben beide bestehen. Die machen ja was grundliegend anderes.
Äh, Kitty, ab wann geht v10 denn offiziell online?
"when it's done" XD
Perfekt! Den Zeitpunkt markiere ich mir im Kalender! :booze:
Maybe this suggestion, which I would still like, would help...
http://www.glbasic.com/forum/index.php?topic=1165.msg31677#msg31677
Ich bringe mal meine Liste hier auf den neuesten Stand (V10.054):
Quote from: kanonet on 2011-Jun-09Damit bleiben auf meiner Bugliste der Schattenengine nur noch:
1. Schatten+Nebel --> kann wohl nicht ohne weiteres behoben werden und ist mir nicht wichtig
2. Übergang von Licht zu Schattenseite eines Objekts ist zu schlagartig (siehe meinen letzten Post) --> kein Bug, sondern so gewollt? Ein flüssigerer Übergang wäre aber viel ansehnlicher.
3. Skalierung geht immer noch nicht, weder mit X_SCALEMODEL, noch mit X_SCALING --> behoben für X_SCALING aber X_SCALEMODEL funktioniert immer noch nicht richtig (siehe Beispiel im letzten Post
Außerdem aufgefallen, (wenn auch nicht in 3D):
4. Drücken von ESC beendet Programm sofort, egal was gerade gemacht wird. Sollte es nicht Aufgabe des Programmierers sein eine entschprechende Abbruchbedingung+Beendungsroutine zu schreiben?
Ich weiß, man soll nicht übermütig werden, aber ich würde mir da ein 3D-Feature wünschen:
Ich hätte gern eine Analogie zum Befehl X_GETMATRIX, einen Befehl z.B. X_SETMATRIX(bzw. X_SETFACE), der es ermöglicht ein Modell komplett zu manipulieren. Ich hoffe das dies deutlich schnell wäre als das Modell mit X_OBJ neu zu erstellen. (Ist das dasselbe worauf bigsofty schon hingewiesen hat?)
Grüße.
Hi kanonet,
also zu deinem Punkt
Quote4. Drücken von ESC beendet Programm sofort, egal was gerade gemacht wird. Sollte es nicht Aufgabe des Programmierers sein eine entschprechende Abbruchbedingung+Beendungsroutine zu schreiben?
Nutze folgenden Code, damit dein Wunsch in Erfüllung geht :)
ALLOWESCAPE FALSE //in der Initialisierung
WHILE TRUE
checkEscape()
SHOWSCREEN
WEND
//checke, ob Escape gedrückt wurde. Wenn ja, dann beende oder mach vorher noch was
FUNCTION checkEscape:
IF KEY(1) THEN END
ENDFUNCTION
Hi backslider,
du hast den Punkt meines Einwands nicht ganz gefasst, mir geht es darum, dass die Schleife WHILE TRUE
SHOWSCREEN
WEND
endlos laufen sollte, auch wenn ESC gedrückt wird. Dies ist jedoch nicht der Fall, ESC unterbricht die Schleife einfach und beendet das Programm, obwohl keine Abbruchbedingung geschrieben wurde. Übrigens scheint der Übeltäter SHOWSCREEN zu sein, denn ohne diesen Befehl wird die Schleife nicht unterbrochen.
Das ist schon richtig was du sagst, allerdings kannst du genau dieses "Problem" mit
ALLOWESCAPE FALSE
ausschalten. :)
Oh da hast du Recht. Wurde das irgendwann geändert? Ich bin mir sicher, dass das noch nicht so geregelt war, als ich mit GLB begonnen habe (V7). Ok, damit kann 4. wieder aus meiner Liste gelöscht werden. Es sollte aber eventuell auch auf den Hilfeseiten der Schleifen erwähnt werden...
Hm, also ich glaube das war schon immer so. Ich kenne es auf jeden Fall nicht anders und in Version 7 war es zu 99,9% auch schon so. :)
Nach langer Zeit mal wieder eine aktualisierte Bugliste 3D:
- Übergang von Licht- zu Schattenseite eines Objekts ist zu schlagartig. Sollte besser per Pixel erfolgen und nicht per Vertex.
- X_SCALEMODEL funktioniert nicht. Die Größe des Schattens ändert sich zwar wie erwartet, jedoch bleibt das Objekt selbst unverändert.
- Beleuchtung einer Fläche ändert sich, wenn sich der Winkel zwischen Fläche und Kamera ändert. Es sollte jedoch ausschließlich der Winkel zwischen Lichtquelle und Fläche einfließen. Tritt nur auf, bei ausreichend hellem X_AMBIENT_LT!
- Wird eine Fläche, über der sich eine Lichtquelle befindet, kleiner skaliert (ca. ab Skalierungsfaktor <0.5), dann wird sie nicht beleuchtet (z.B. immer weiß gezeichnet auch wenn farbiges Licht verwendet wird). Der Bug #3 tritt jedoch trotzdem auf! Tritt nur auf, bei ausreichend hellem X_AMBIENT_LT!
- Bump-mapping funktioniert nicht auf Intel Grafikkarten.
- Schatten ignorieren Nebel. Kann wohl nicht ohne weiteres behoben werden und ist mir nicht wichtig. Ich empfehle Schatten ab einer gewissen Nebeldichte nicht mehr zu zeichnen (bring möglicherweise sogar Geschwindigkeitszuwachs?)
- Eine Lichtquelle mit Öffnungswinkel <360 wirft trotzdem Schatten in alle Richtungen (Öffnungswinkel wird bei X_SPOT_LT -3 ignoriert). Würde man Schatten von Objekten nicht zeichnen, die außerhalb des Öffnungswinkels liegen, könnte dies eventuell die Geschwindigkeit verbessern?
- X_DOT und X_LINE habe maximale Größen, die jedoch auf verschiedenen Grafikkarten unterschiedlich liegen (z.B. bei mir: Intel zeichnet X_DOTs nur mit Größen bis 10, Nvidia bis 65).
Punkte 6-8 sind mir nicht sonderlich wichtig, ich wollte sie nur mal erwähnt haben.
Alle Fehler sollten mit dem Code in diesem Thread ohne zu große Modifizierungen nachvollziehbar sein.
Außerdem wünsche ich mir weiterhin eine Möglichkeit Verices eines Objekts zu manipulieren und Per-Pixel-Lightning (besonders für große Objekt, bzw nahe Lichtquellen wichtig).
Gernot, sollte etwas unklar formuliert sein, oder kannst du etwas nicht reproduzieren: ich werde die nächsten Tage wieder ab und zu im Chat sein, dort können wir das am besten klären. Antwort hier ist natürlich genauso gut.
Grüße,
Kanonet