Sprite als HUD -> Problem mit "CameraRange"

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

shootermaker

Betreff: Sprite als HUD -> Problem mit "CameraRange"

BeitragMo, Sep 07, 2009 10:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Hab mir das Tutorial "3D ² 2D" durchgelesen.
Das Tutorial is ne super Sache, blos wird da ja der Sprite nach der Horizontalen Bildschirmauflösung nach hinten gesetzt.
Wäre kein Problem doch ich möchte in meinem Programm auch noch die Funktion "CameraFogMode" nutzen. Doch die darf nicht größer als "CameraRange CAMERA,0.1,20" sein.
Da aber der Sprite nach meine Bildschirmauflösung nach hinten gesetzt wird (1680) sieht man ihn nicht.

Ich wäre nun auf die Idee gekommen den Sprite kleiner zu scalieren und dafür näher an die camera zu setzten, doch dann "flackert" er beim bewegen. weiß einer wie ich das Problem lösen kann?

D2006

Administrator

BeitragMo, Sep 07, 2009 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin mir gerade nicht sicher, aber probier mal mit EntityOrder dafür zu sorgen, dass die entsprechenden Sprites erst zum Schluss (und damit hoffentlich nach dem Nebel) gerendert werden.
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

Nicdel

BeitragMo, Sep 07, 2009 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Scheint nicht zu gehen, jedenfalls nicht mit diesem Beispiel:

Code: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()
camera = CreateCamera()
CameraFogMode camera,1
CameraFogRange camera,1,20
CameraRange camera,1,1000
light = CreateLight()
RotateEntity light, 90, 0, 0

cube = CreateSprite()
EntityColor cube, 255, 0, 0
EntityOrder cube, -1000000
PositionEntity cube, - .7, 0, 640


While Not KeyDown(1)
   RenderWorld
   Flip
Wend
End
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Schnittlauch

Unkraut

BeitragMo, Sep 07, 2009 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Was man Vielleicht auch machen könnte:
Einfach zwei mal Render World.
Einmal für das Level, dann setzt man die Einstellungen zurück und rendert das HUD Very Happy

Aber keine Ahnung ob das wirklich so klappt.
Ich wars nicht.

NightPhoenix

BeitragMo, Sep 07, 2009 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
EntityFX Sprite,8
sollte funktionieren, zumindest funktioniert das bei meinem Skyboxes immer.
Der Befehl deaktiviert den Nebeleffekt auf Objekten.

D2006

Administrator

BeitragMo, Sep 07, 2009 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Supi, NightPhoenix. Ich hab diesen "Tipp" gleich mal der BB Hilfe angefügt (CameraFogMode), damit dies zukünftig gleich ersichtlich ist.
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

NightPhoenix

BeitragMo, Sep 07, 2009 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
No Problem Smile
 

shootermaker

BeitragMo, Sep 07, 2009 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und danke für die vielen Antworten! Smile
Das Problem besteht leider weiterhin, da ich "entityfx" schon ausprobiert hatte und mein Sprite sowieso schon auf "entityorder Sprite,-1" steht.Wink
Das problem liegt an dem Befehl: "CameraRange CAMERA,0.1,20" der mir ab distanz 20 alle objekte löscht,leider auch mein hud. wenn ich den befehl weg lasse würde es gehen aber ich brauch ihn, da es sonnst geschwindichkeits-probleme geben wird. ich könnte natürlich auch selber mit hilfe "entitydistance" das problem lösen aber gibt es da nix eleganteres?

was natürlich super wäre ist, wenn man den sprite kleiner scalieren könnte und näher an die Camera setzt. Blos warum fängt er dann beim bewegen an zu zittern? liegt es an der Genauigkeit von Blitz?

NightPhoenix

BeitragMo, Sep 07, 2009 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Entweder du setzt Cameradistance höher oder du holst die Sprites näher an die Camera heran.

Ich habe meine HUD-Sprites immer auf 0,0,2. Skaliere sie runter (ScaleSprite), dann kannst du sie auch viel näher heran holen. Wink

MfG.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Sep 07, 2009 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, zum Beispiel um den Faktor 10 zu sich ran holen und um den selben Faktor verkleinern ergibt keinen Darstellungsunterschied. Kannst mit dem selben Faktorprinzip auch generell dein Sprite auf Distanz 10 bringen und die entsprechende Auflösung da gegen rechnen, statt die Entfernung Abhängig zur Auflösung zu machen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

NightPhoenix

BeitragMo, Sep 07, 2009 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Zittern hab ich überlesen.
Das zittern kenne ich auch. Ich vermute, dass das davon kommt, dass dein Sprite nicht genau auf einem Pixel liegt, sondern zwischen zwei. Deshalb wird die Spritekante mal auf Pixel X und mal auf Pixel x+1 gezeichnet.
Dieses Zittern verschwindet bei mir ab einer Auflösung von 1024x768. Falls dann immernoch vereinzelt auftritt positioniere die Sprites in zehntel oder hunderstel Schritten in eine von den 4 möglichen Richtungen bis es verschwunden ist.
 

shootermaker

BeitragFr, Sep 11, 2009 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ein paar Tests mit den Sprites gemacht. Das mit den Koordinaten hat tatsächlich geholfen... aber nur für ne kurze Zeit. Wenn man nämlich "X = X + 0.001" schreibt, kann es mal sein dass das Sprite nicht 100% auf der Position liegt, auf die es sollte. Die einzige Lösung ist die Z-position um 0.001 zu erhöhe und die Auflösung durch 1000 zu rechnen. Die X und Y Positionen müssen natürlich auch umgerechnet werden. Damit gibt es keine Koordinaten-Probleme, das Sprite flimmert nicht und es funktioniert bei jeder Auflösung gleich.

Problem gelöst.
Smile

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Sep 11, 2009 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du eventuell ein Beispielcode der genau das Problem zeigt? Das wäre zumindest für mich sinnvoll zu testen, da das Problem auch bei meiner Draw3D auftretten könnte. Dann hätte ich zumindest eine Gelegenheit einen Lösungsweg oder ein Workaround dazu zu finden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

shootermaker

BeitragFr, Sep 11, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ha, zu früh gefreut!
Aber hier erstmal der Code: [AUSKLAPPEN]


TIMER = CreateTimer(60)
;Graphics3D 1680,1050,0,1
Graphics3D 800,600,0,1
SetBuffer BackBuffer()
TFormFilter 0
Global GW# = GraphicsWidth()
Global GH# = GraphicsHeight()
Global WIDTH# = GW#/1000

C = CreateCube()
PositionEntity C,0,0,3

Global CAMERA = CreateCamera()
CameraRange CAMERA,0.1,20
CameraFogMode CAMERA,1
CameraFogRange CAMERA,0.1,20

Global MOD_WEAPON_DAGGER = CreateMesh()
Global TEX_WEAPON_DAGGER = CreateTexture(128,128)
SetBuffer TextureBuffer(TEX_WEAPON_DAGGER)
Rect 40,40,10,10,1
Line 10,10,40,10
Line 40,40,70,70
SetBuffer BackBuffer()
Global TW = TextureWidth(TEX_WEAPON_DAGGER)
Global TH = TextureHeight(TEX_WEAPON_DAGGER)
SURFACE = CreateSurface(MOD_WEAPON_DAGGER)
VERTEX1 = AddVertex(SURFACE,-0.128,+0.128,+WIDTH,0,0)
VERTEX2 = AddVertex(SURFACE,+0.128,+0.128,+WIDTH,1,0)
VERTEX3 = AddVertex(SURFACE,-0.128,-0.128,+WIDTH,0,1)
VERTEX4 = AddVertex(SURFACE,+0.128,-0.128,+WIDTH,1,1)
AddTriangle(SURFACE,VERTEX1,VERTEX2,VERTEX3)
AddTriangle(SURFACE,VERTEX3,VERTEX2,VERTEX4)
EntityTexture MOD_WEAPON_DAGGER,TEX_WEAPON_DAGGER
;ScaleEntity MOD_WEAPON_DAGGER,3,3,1


Global PLAYER_Z_SLIDE#
Global DEST_PLAYER_Z#

Global TESTX# = 0
Global TESTY# = 0

Global TESTX2# = 611
Global TESTY2# = 0



Global TESTZ# = 0




While Not KeyHit(1)
   If KeyDown(200) Or KeyDown(17) And KeyDown(208) = 0 And KeyDown(31) = 0 Then DEST_PLAYER_Z=+0.1
   If KeyDown(208) Or KeyDown(31) And KeyDown(200) = 0 And KeyDown(17) = 0 Then DEST_PLAYER_Z=-0.1
   If KeyDown(203) Or KeyDown(30) Then TurnEntity CAMERA,0.0,+1.5,0.0
   If KeyDown(205) Or KeyDown(32) Then TurnEntity CAMERA,0.0,-1.5,0.0
   PLAYER_Z_SLIDE = PLAYER_Z_SLIDE+((DEST_PLAYER_Z-PLAYER_Z_SLIDE))
   MoveEntity CAMERA,0,0,PLAYER_Z_SLIDE
   DEST_PLAYER_Z=0
   CameraClsColor camera,222,222,2
   If MouseDown(1) Then
   PositionEntity MOD_WEAPON_DAGGER,(TESTX2-1)/1000,(TESTY2+1)/1000,TESTZ
   Else
   PositionEntity MOD_WEAPON_DAGGER,(TESTX-1)/1000,(TESTY+1)/1000,TESTZ
   End If
   EntityParent MOD_WEAPON_DAGGER,CAMERA
   EntityOrder MOD_WEAPON_DAGGER,-1
   EntityFX MOD_WEAPON_DAGGER,1+8
   
   WaitTimer(TIMER)
   UpdateWorld
   RenderWorld
   Text 10,10,EntityX#(MOD_WEAPON_DAGGER)
   Flip
Wend
End





Leider gibt es noch ein Problem.
Wenn ihr den Code ausführt seht ihr, das der Sprite pixelgenau im Bildschirmmittelpunkt erstellt wird.
Drückt mal die Linke Maustaste, dann wird der Sprite auf X = 611 versetzt.
Dann ist der Sprite wieder unscharf.

Setzt ihr die Variable "TESTX2# = 611" auf "TESTX2# = 612" ist er wieder scharf. bei 613 wieder unscharf, bei 614 wieder scharf... weiß einer wie ich das Problem noch in den Griff kriege?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Sep 11, 2009 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgendes:

- Im Normalfall werden nur Konstanten mit GROßBUCHSTABEN geschrieben.

- Es ergibt keinen Sinn alle Variablen einfach mal so als Global zu deklarieren. Da kannst du auch auf Funktionen verzichten und auf Gosub umsteigen.

- Pixel und Texel sind zwei unterschiedliche Dinge. Das UV-Auslesen erfolgt so, dass ein Pixel aus einer Textur von Außen betrachtet zwischen den ersten und den zweiten liegt. Das heisst, wenn man das bei auslesen der UV-Koordinaten nicht gemacht hat, hat man die Möglichkeit es durch eine Verschiebung des Entities zu tun. Das hiesse um 0.5 (Pixel) nach links und 0.5 (Pixel) nach oben. Demnach hätte deine Formel PositionEntity MOD_WEAPON_DAGGER,(TESTX2-0.5)/1000,(TESTY2+0.5)/1000,TESTZ heissen müssen.

- Ich würde dir aber einen geringfügig anderen Weg vorschlagen:

Code: [AUSKLAPPEN]
Const ZPOSITION#=10.0

Local Timer = CreateTimer(60)
;Graphics3D 1680,1050,0,1
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
TFormFilter 0
Local GW# = GraphicsWidth()
Local GH# = GraphicsHeight()
Local Width# = GW#/ZPOSITION

Local C = CreateCube()
PositionEntity C,0,0,3

Local Camera = CreateCamera()
CameraRange Camera,0.1,20
CameraFogMode Camera,1
CameraFogRange Camera,0.1,20

Local Mod_Weapon_Dagger = CreateMesh(Camera)
Local Tex_Weapon_Dagger = CreateTexture(128,128)
SetBuffer TextureBuffer(Tex_Weapon_Dagger)
Rect 40,40,10,10,1
Line 10,10,40,10
Line 40,40,70,70
SetBuffer BackBuffer()
Local TW = TextureWidth(Tex_Weapon_Dagger)
Local TH = TextureHeight(Tex_Weapon_Dagger)

Local Surface = CreateSurface(Mod_Weapon_Dagger)
Local Vertex1 = AddVertex(Surface,-128/Width,+128/Width,ZPOSITION,0,0)
Local Vertex2 = AddVertex(Surface,+128/Width,+128/Width,ZPOSITION,1,0)
Local Vertex3 = AddVertex(Surface,-128/Width,-128/Width,ZPOSITION,0,1)
Local Vertex4 = AddVertex(Surface,+128/Width,-128/Width,ZPOSITION,1,1)

AddTriangle(Surface,Vertex1,Vertex2,Vertex3)
AddTriangle(Surface,Vertex3,Vertex2,Vertex4)
EntityTexture Mod_Weapon_Dagger,Tex_Weapon_Dagger


Local Player_Z_Slide#
Local Dest_Player_Z#




While Not KeyHit(1)
   If KeyDown(200) Or KeyDown(17) And KeyDown(208) = 0 And KeyDown(31) = 0 Then Dest_Player_Z=+0.1
   If KeyDown(208) Or KeyDown(31) And KeyDown(200) = 0 And KeyDown(17) = 0 Then Dest_Player_Z=-0.1
   If KeyDown(203) Or KeyDown(30) Then TurnEntity Camera,0.0,+1.5,0.0
   If KeyDown(205) Or KeyDown(32) Then TurnEntity Camera,0.0,-1.5,0.0
   
   Player_Z_Slide = Player_Z_Slide+((Dest_Player_Z-Player_Z_Slide))
   MoveEntity Camera,0,0,Player_Z_Slide
   Dest_Player_Z=0
   CameraClsColor Camera,222,222,2
   
   PositionEntity Mod_Weapon_Dagger,(MouseX()-GW/2-0.5)/Width*2,(GH/2+0.5-MouseY())/Width*2,0
   
   EntityParent Mod_Weapon_Dagger,Camera
   EntityOrder Mod_Weapon_Dagger,-1
   EntityFX Mod_Weapon_Dagger,1+8
   
   WaitTimer(Timer)
   UpdateWorld
   RenderWorld
   Text 10,10,EntityX#(Mod_Weapon_Dagger)
   Flip
Wend
End


- Eine ganz andere Möglichkeit ist, du nutzt die Draw3D (siehe Signatur) welche das alles und vieles mehr automatisch macht. Wenn die Ausgabe da unscharf wird, dann gehe in die Draw3D.bb und stelle DRAWOFFSET auf ''0''.

Edit1: Ich sehe gerade:

Code: [AUSKLAPPEN]
   CameraClsColor Camera,222,222,2
   EntityParent Mod_Weapon_Dagger,Camera
   EntityOrder Mod_Weapon_Dagger,-1
   EntityFX Mod_Weapon_Dagger,1+8

gehören nicht unbedingt in die Hauptschleife.
 

shootermaker

BeitragSa, Sep 12, 2009 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Hectic. Smile
Klappt super.
Zu sagen ist allerdings noch das man unbedingt als Parent die Camera angeben muss und nicht z.B. den Pivot, an dem die Camera hängt.
Sonst gibt es wieder "Zitter-Probleme". Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group