Sprite als Hud verschwindet manchmal beim Bewegen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

funkmaster5000

Betreff: Sprite als Hud verschwindet manchmal beim Bewegen

BeitragMi, Sep 11, 2013 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Titel sagt alles:

Wenn ich ein Sprite lade, als Parent die Cam angebe sieht das ganze erst einmal vernünftig aus. Wenn ich jetzt aber die Cam über MoveEntity bewege, dann verschwindet ca. alle 20 Schritte und danach alle 3-4 Schritte das Sprite komplett, taucht aber ab und zu wieder auf. Das ist aber nicht nur bei Sprites so, sondern auch bei diesem Beispiel:

Code: [AUSKLAPPEN]

Graphics3D 640, 480, 16, 2
SetBuffer BackBuffer()
camera = CreateCamera()

PositionEntity camera, 0, 0, - 5

brush = CreateBrush(0, 255, 0)
brush2 = CreateBrush(255,0,0)
mesh = CreateMesh()
surface = CreateSurface(mesh, brush)

v0 = AddVertex(surface, 0, 0, 0)
v1 = AddVertex(surface, 0, - 1, 0)
v2 = AddVertex(surface, - 2, - 1, 0)
AddTriangle(surface, v0, v1, v2)
UpdateNormals mesh

surface2 = CreateSurface(mesh, brush)
v0 = AddVertex(surface2, -2, 0, 0)
v1 = AddVertex(surface2, 0, -0, 0)
v2 = AddVertex(surface2, -2, -1, 0)
AddTriangle(surface2, v0, v1, v2)
UpdateNormals mesh


AmbientLight 255,255,255


RotateEntity mesh,90,0,0
MoveEntity mesh,0,-2,1


While Not KeyHit(1)
   If KeyHit(200) Then
   MoveEntity camera,0,0,1
   End If
   
   If KeyHit(208) Then
   MoveEntity camera,0,0,-1
   End If

   UpdateWorld
   RenderWorld
   Flip
Wend
End


Bewege ich mich ca. 20 Schritte nach hinten, dann verschwindet das Objekt. Hier könnte ich mir vorstellen, dass es am Betrachtungswinkel liegt, immerhin ist es ja flach. Aber die Sprites verhalten sich genau so!

Code: [AUSKLAPPEN]
Graphics3D 640, 480, 16, 2
SetBuffer BackBuffer()
camera = CreateCamera()

PositionEntity camera, 0, 0, - 5


brush = CreateBrush(0, 255, 0)
brush2 = CreateBrush(255,0,0)
mesh = CreateMesh()
surface = CreateSurface(mesh, brush)

v0 = AddVertex(surface, 0, 0, 0)
v1 = AddVertex(surface, 0, - 1, 0)
v2 = AddVertex(surface, - 2, - 1, 0)
AddTriangle(surface, v0, v1, v2)
UpdateNormals mesh

surface2 = CreateSurface(mesh, brush)
v0 = AddVertex(surface2, -2, 0, 0)
v1 = AddVertex(surface2, 0, -0, 0)
v2 = AddVertex(surface2, -2, -1, 0)
AddTriangle(surface2, v0, v1, v2)
UpdateNormals mesh


AmbientLight 255,255,255


RotateEntity mesh,90,0,0
MoveEntity mesh,0,-2,1

gun = LoadSprite("gun.bmp",4,camera)
MoveEntity gun,0,0,1
SpriteViewMode gun,1 ; hat keinen Einfluss auf den Effekt

While Not KeyHit(1)
   If KeyHit(200) Then
   MoveEntity camera,0,0,1
   End If
   
   If KeyHit(208) Then
   MoveEntity camera,0,0,-1
   End If

   UpdateWorld
   RenderWorld
   Flip
Wend
End


Hat jemand eine Idee?

UNZ

BeitragMi, Sep 11, 2013 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuch mal bei CameraRange den 'near' wert auf z.B. 0.1 zu setzen.
Das muss besser als perfekt!
 

funkmaster5000

BeitragMi, Sep 11, 2013 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Logisch Rolling Eyes ! Das hat was gebracht! Vielen Dank! Wie hoch defniert man so im Allgemeinen die maximale Reichweite?
 

PhillipK

BeitragMi, Sep 11, 2013 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt darauf an was du vorhast Razz
Die "reichweite" diehnt zum u.a. zum interpolieren auf dem Depthbuffer (sofern des das unter blitzbasic gibt)

Das bedeutet: Je näher near und farplane beineinander liegen, desto genauer können die werte im depthbuffer werden.
Oder um es anders auszudrücken: Wenn du verdammt viele bilder nur wenige mikro-einheiten voneinander entfernt auf der Z achse hast, als beispiel, kann es eienn effekt geben der "Z fighting" genannt wird.

Hier werden 2 pixel die für die kamera auf dem selben punkt liegen manches mal in anderer reihenfolge dargestellt, was in nervigen flickern ausartet.

Du kannst zb anfangen mit 0.001 nearplane und 100.0 farplane zu arbeiten. Willst du ein 3d spiel mit extrem hoher tiefensicht, brauchst du eine dementsprechend angepasste farplane. Die near und farplane sind auch in einheiten, wie die koordinaten.
Dh mit 0.0001 bis 100.0 kannst du so ziemlich 100 einheiten (koordinatenschritte) "Tief" schauen.

Wird das ganze nur ein 2d spiel, so kannst du getrost bei 10 tiefe oder sowas bleiben. Deine einheiten sortierst du dann mit 0.1er schritten auf der Z achse, um eine realistische ordnung zu kriegen.

...
Wichtig ist eigentlich nur, das du den zusammenhang von far und nearplane verstehst Smile Der rest kommt darauf an, was du vorhast.. ^^
 

funkmaster5000

BeitragMi, Sep 11, 2013 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die detaillierte Antwort! Es geht um ein Genre, mit dem mit Sicherheit (fast) alle anfangen: Ein FPS! Allerdings basiert er auf Sprites, da meine 3D-Modelling Skills bescheiden sind Wink
 

Kruemelator

BeitragMi, Sep 11, 2013 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Verschwinden des Mesh liegt in diesem Fall aber am Sampling. Die Dreiecke des Mesh sind einfach zwischen den Pixeln. Hier mal ein Beispielbild.
Bei den beiden Dreiecken ganz oben rechts, ist das untere das was deine Situation beschreibt. Es liegt genau zwischen den Samplepunkten(Abtastpunkten) der Pixel.

Edit: Die beiden kleinen Dreiecke die oben in der Mitte sind beschreiben es noch viel besser.

DAK

BeitragDo, Sep 12, 2013 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal zu dem, was PhillipK geschrieben hat:

Du kannst prinzipiell jede Skalierungsgröße in deinem Spiel verwenden, also ob du einen Meter Echtwelt als 0.001 Einheiten oder als 10000 Einheiten definierst, ist prinzipiell egal, solange du alles andere (Kamerasichtweite, Bewegungsgeschwindigkeit, usw.) anpasst.

Es gibt nur ein Problem: B3D verwendet für Positionen und so 32-Bit-Floats. Die werden bei sehr großen und sehr kleinen Werten recht ungenau. Es empfiehlt sich also, dass die Größen irgendwo im Mittelbereich liegen, um die Floats besser auszunutzen.
Gewinner der 6. und der 68. BlitzCodeCompo

Jan_

Ehemaliger Admin

BeitragDo, Sep 12, 2013 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Range sollte schon passen und nciht zu groß gewählt sein, sonst verschwinden sachen, die nur 0.5 einheiten übereinander sind.
between angels and insects
 

funkmaster5000

BeitragDi, Sep 17, 2013 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das verstehe ich nicht so recht. Kann ich keine Punkte einfach so definieren und sie dann verbinden?

Kruemelator hat Folgendes geschrieben:
Das Verschwinden des Mesh liegt in diesem Fall aber am Sampling. Die Dreiecke des Mesh sind einfach zwischen den Pixeln. Hier mal ein Beispielbild.
Bei den beiden Dreiecken ganz oben rechts, ist das untere das was deine Situation beschreibt. Es liegt genau zwischen den Samplepunkten(Abtastpunkten) der Pixel.

Edit: Die beiden kleinen Dreiecke die oben in der Mitte sind beschreiben es noch viel besser.
 

Kruemelator

BeitragMi, Sep 18, 2013 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Mesh ist WENIGER als einen Pixel hoch deswegen wird es nicht erfasst beim Samplen ("Abtasten"). Da Blitz3D eine alte version von Directx ist kann du da nicht viel machen. Bei den neuen Directx gibt es dann so Sachen wie Supersampling (in doppel/dreifach.. so großer Auflösung rendern und dann immer mehrere Pixel zusammenfassen) oder Multisampling (anstatt nur einmal in der Mitte des Pixels Abzutasten, mehrmals, zum Beispiel 4mal an unterschiedlichen Punkten im Pixel).
Solche Probleme tretten auch noch in den modernsten Spielen auf.

DAK

BeitragMi, Sep 18, 2013 7:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Spricht irgendwas dagegen, das HUD entweder in 2D oder mit einer zweiten Kamera zu machen?

Für das mit der zweiten Kamera stellst du CameraClsMode für die zweite Kamera auf "nicht löschen", renderst zuerst die Spielkamera und renderst dann die GUI-Kamera (die sich irgendwo befindet, wo nichts außer dem GUI ist) darüber.
Gewinner der 6. und der 68. BlitzCodeCompo
 

funkmaster5000

BeitragSo, Okt 06, 2013 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist eine gute Idee! Danke!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group