Sprite als HUD -> Problem mit "CameraRange"
Übersicht

shootermakerBetreff: Sprite als HUD -> Problem mit "CameraRange" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bin mir gerade nicht sicher, aber probier mal mit EntityOrder![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
SchnittlauchUnkraut |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Aber keine Ahnung ob das wirklich so klappt. |
||
Ich wars nicht. |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] EntityFX Sprite,8 sollte funktionieren, zumindest funktioniert das bei meinem Skyboxes immer.
Der Befehl deaktiviert den Nebeleffekt auf Objekten. |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Supi, NightPhoenix. Ich hab diesen "Tipp" gleich mal der BB Hilfe angefügt (CameraFogMode![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
No Problem ![]() |
||
shootermaker |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo und danke für die vielen Antworten! ![]() Das Problem besteht leider weiterhin, da ich "entityfx" schon ausprobiert hatte und mein Sprite sowieso schon auf "entityorder Sprite,-1" steht. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() MfG. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Hectic. ![]() 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". ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group