ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4420321
Jetzt (Chat):
20 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Re: Texturgröße
Normal
AutorThema
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
TexturgrößeNach oben.
Hallo,

ich habe etwas Probleme mit der Projektion.
Also wenn ich die Kamera zentral aufstelle und in Richtung Mittelpunkt des Screens richte, wird ein Rechteck bei einem Abstand von 100 z-werten zur Kamera in Originalgröße dargestellt. Warum ist das genau bei 100 Einheiten so? Wie berechnet sich das? Das Rechteck ist 640 Pixel breit. Das Ganze muss ja was mit dem "Sichtwinkel" der Kamera zu tun haben? Wie groß ist der?

THX
TomCat
23.01.2009, 16:41:25 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: TexturgrößeNach oben.
Den Sichtwinkel der Kamera gibst du an, wenn du die Projektionsmatrix erzeugst. Er dürfte meist bei rund 90° liegen.

Was genau meinst du mit Z-Werten? Die Distanz, in Metern, oder Einheiten im Z-Buffer?

Ansonsten orientiert sich die perspektivische Projektion hier dran, aber um das in Bildschirmkoordinaten umzurechnen musst du auch wieder den Blickwinkel kennen.

Gruß, Ky
23.01.2009, 17:31:35 Uhr
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
Re: TexturgrößeNach oben.
Naja, um es mal zu vereinfachen. Wenn der Sichtwinkel der Kamera 90° beträgt und der Z- Abstand zum Polygon 50 Einheiten, dann muss doch ein Polygon, das 100 Einheiten breit ist, mit 100 Pixel Breite am Bildschirm angezeigt werden.
Leider wird es bei mir wesentlich breiter angezeigt. Wo ist da mein Denkfehler?

ciao,
TomCat
23.01.2009, 19:19:55 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: TexturgrößeNach oben.
Nein, erst wird in Kamerakoordinaten umgerechnet. Dann wird durch die W-Koordinate geteilt. Daraus ergibt sich dann die Bildschirmkoordinate, zwischen -1 und +1 – erst danach kommt die Rasterisierung, in der die Breite in Pixeln bestimmt wird!

Wieviele Pixel breit ein Objekt ist, kann man nur aus der Projektion nicht bestimmen, dafür braucht man den Viewport. Bei mir ist es dann auch noch so, dass das eingestellte Field of View auf der Y-Achse gilt, um also die Breite eines Objekts zu bestimmen muss man zusätzlich das Breitenverhältnis berücksichtigen.

1 Mal gendert, zuletzt am 23.01.2009, 20:45:44 Uhr von Krishty.
23.01.2009, 20:37:13 Uhr
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
Re: TexturgrößeNach oben.
Hi Krishty,
Ja ich hab grad noch rumprobiert. Also bei einer Polygonbreite von 100, einem Kamerawinkel von 90° und einem Abstand zur Kamera von 50 wird das Polygon in der Größe der kleineren Bildschirmkoordinate, bei mir 800 Pixel bei einer Auflösung von 1280*800 Pixel angezeigt. Warum richtet sich die Umrechnung in reale Pixel nach der kleiner Bildschirmkoordinate (meist y) ?



1 Mal gendert, zuletzt am 23.01.2009, 20:50:15 Uhr von TomCat.
23.01.2009, 20:49:57 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: TexturgrößeNach oben.
Ich kann nur vermuten …
Vielleicht wird dadurch die Portierung auf andere Bildformate vereinfacht. 16:9-Nutzer nehmen wahrscheinlich gerne zusätzliche Darstellung an den Rändern entgegen … würde man sich hingegen nach der Bildbreite richten, würde das Bild bei ihnen oben und unten abgeschnitten. Anstatt dass ein breiterer Bildschirm das Blickfeld erweitert, würde er es beschneiden (mit dem Extrem bei Multi-Mon-Systemen, deren Blickfeld dann in der Höhe halbiert wäre). Das Bild wird wohl einfach homogener unter verschiedenen Breitenverhältnissen …

… wenn jemand die genauen Gründe kennt soll er sie bitte mal schreiben, interessiert mich auch brennend.
23.01.2009, 21:01:59 Uhr
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: TexturgrößeNach oben.
Zitat von TomCat:
Warum richtet sich die Umrechnung in reale Pixel nach der kleiner Bildschirmkoordinate (meist y) ?


Das kannst Du Dir doch aussuchen. Mit welchem Seitenverhältnis hast Du die Projektionsmatrix denn aufgestellt?

Theorie: Alles, was Du auf der Grafikkarte mit den Vertices anstellst, muss am Ende in einem genormten Zahlenbereich enden. Der wird Clip Space genannt, soweit ich weiß. Der ist für X von links nach rechts von -1 bis +1 definiert, für Y von oben nach unten von +1 bis -1 (Achtung: das ist kopfüber) und für Z von vorne nach hinten von 0 bis 1. Jetzt kannst Du, wenn Du außerdem die Auflösung bzw. Pixelgröße des Renderbereichs kennst, ausrechnen, welche Vertexposition im Clip Space auf welchem Bildschirmpixel enden wird.

Wenn man 2D-Rendering betreibt, will man normalerweise pixelgenau bestimmen, was passiert. Das ist einfacher, wenn man auf jede Perspektive verzichtet. Die Grafikkarte macht ja am Ende jedes VertexShaders den Perspective Divide, dividiert also AusgabePosition.xyz durch AusgabePosition.w. Wenn Du keine perspektivische Verzerrung haben willst, musst Du also dafür sorgen, dass in AusgabePosition.w eine 1 drinsteht. Und genau das tut die durchschnittliche orthogonale Projektionsmatrix. Eine perspektivische Projektionsmatrix schreibt dagegen einen Tiefenwert in die W-Komponente, wodurch die Division nachher dann erst den perspektivischen Eindruck erzeugt. Größere Tiefe -> größeres W -> Irgendwas durch dieses W wird kleiner -> Dinge, die hinten stehen, werden auf dem Bildschirm kleiner. Das ist der Trick hinter dem 3D. Wenn Du es darauf anlegst, kannst Du damit natürlich genauso Deine Dreiecke pixelgenau platzieren. Nur ist es damit halt etwas mühsamer.

[edit] Öhm... da ist doch keine Magie dahinter. Durch den genormten Clip Space kommt erstmal eine Art Quadrat zustande. Erst das Seitenverhältnis, das man bei der Erstellung der Projektionsmatrix einberechnet, sorgt dann dafür, dass das Blickfenster in die Szene nicht mehr quadratisch, sondern dem Bildschirm-Seitenverhältnis angepasst ist. Du, der Du den Öffnungswinkel und das Seitenverhältnis angibst, bestimmst, wie der Bildausschnitt gemeint ist. Da ihr anscheinend fertige Funktionen zur Projektionsmatrix-Erstellung benutzt, hängt es also von der Implementation dieser Funktion ab, welche Seite die bestimmende ist. Die D3DX-Funktion nimmt zum Beispiel die Höhe des Bildausschnitts als bestimmendes Maß an, erwartet von Dir also den Öffnungswinkel für das senkrechte Bildmaß. Das wagerechte Bildmaß errechnet die Funktion dann aus dem senkrechten und dem Seitenverhältnis, dass Du ihm mitgegeben hast. Das ist aber freie Wahl des Implementierenden, andere Leute könnten sich genauso nach dem wagerechten Öffnungswinkel richten und den senkrechten daraus ableiten.


Bye, Thomas

1 Mal gendert, zuletzt am 23.01.2009, 21:11:34 Uhr von Schrompf.
23.01.2009, 21:03:23 Uhr
Dreamworlds Development
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: TexturgrößeNach oben.
Zitat von Schrompf:
Das kannst Du Dir doch aussuchen. Mit welchem Seitenverhältnis hast Du die Projektionsmatrix denn aufgestellt?
Afaik wird das Bild verzerrt, wenn man das Seitenverhältnis umkehrt, es orientiert sich dann noch lange nicht an der horizontalen Achse. Das liegt eher an der Art und Weise, wie man die Projektionsmatrix aufbaut.

Darauf, dass es hier um 2D-Rendering geht, bin ich noch garnicht gekommen … wenn das der Fall ist, bloß weg von 3D-Matrizen!
23.01.2009, 21:07:41 Uhr
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
Re: TexturgrößeNach oben.
Hi,

NEIN, es geht um 3D-Rendering !

meine Projectionsmatrix sieht so aus:
PerspectiveFovLH((float)Math.PI / 2, 1.6f, 1.0f, 3000.0f)

D.h. ich habe die Aspectrate auch auf 16:9 = 1280*800 = 1.6 gestellt. Dadurch werden Polygone nicht verzerrt.

Um was es mir letztendlich geht:
Ich will die X1,Y1, X2, Y2 Pixel-Koordinaten eines rechteckigen Polygons bestimmen, das in den 3D-Raum transformiert wurde.
Gibts da ne einfach Möglichkeit?

2 Mal gendert, zuletzt am 23.01.2009, 21:15:46 Uhr von TomCat.
23.01.2009, 21:11:28 Uhr
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: TexturgrößeNach oben.
Scheint ja wirklich ein brennendes Problem zu sein...

Zitat von TomCat:
Hi,

meine Projectionsmatrix sieht so aus:
PerspectiveFovLH((float)Math.PI / 2, 1.6f, 1.0f, 3000.0f)

D.h. ich habe die Aspectrate auch auf 16:9 = 1280*800 = 1.6 gestellt. Dadurch werden Polygone nicht verzerrt.

Um was es mir letztendlich geht:
Ich will die X1,Y1, X2, Y2 Pixel-Koordinaten eines rechteckigen Polygons bestimmen, das in den 3D-Raum transformiert.
Gibts da ne einfach Möglichkeit?

Japp. Schritt eins: Schau in die Doku zu D3DXPerspectiveFovLH(). Da steht drin, wie der aus Deinen Angaben die Projektionsmatrix berechnet. Schritt zwei: nimm die Eingabe-Vektoren und jag sie durch die so erstellte Projektionsmatrix. Du bekommst 4D-Vektoren raus. Bei jedem dieser Post Projection Positions rechnest Du nun Vektor.xyz / Vektor.w. Du bekommst für Positionen, die innerhalb des von Dir angegebenen Koordinatenraums liegen, Ergebnisvektoren raus, die im Bereich X: -1 ... +1, Y: +1 ... -1 und Z: 0 ... 1 liegen. Die kannst Du dann über den schlichten Dreisatz in Pixelkoordinaten umrechnen.

Empfehlung trotzdem: für 2D-Rendering keine perspektivische Projektionsmatrix benutzen, sondern bestenfalls eine orthogonale. D3DXMatrixOrthoLH() z.B.
23.01.2009, 21:16:00 Uhr
Dreamworlds Development
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
Re: TexturgrößeNach oben.
Hi,

nein, es geht um reines 3D-Rendering!
Also mein Problem war, oder ist, die letztendliche Umrechnung in reine Pixelkoordinaten. Direct X macht dies ja wohl, wies scheint, von der Bildschrimauflösung (und Aspectrate) abhängig.
Um was es geht:
Polygone verschiedener Größe in unterschiedlichsten Abhängigkeiten mit der Maus oder Touch physikalisch korrekt über den Bildschirm bewegen. Dabei kommt es vor, das Polygone sowohl transliert, rotiert und skaliert werden. Das ganze Matrixprogramm sozusagen...



23.01.2009, 22:01:06 Uhr
TomCat Offline
Schütze Arsch


Registriert seit:
02.03.2002

Bayern
Re: TexturgrößeNach oben.
Hi,

letzendlich ist es doch so, dass die Vertex-Daten durch die World-Transformationsmatrix gejagt werden und am Bildschirm erscheinen. Das Problem ist, dass ich die Funktion Matrix.Multiply(...) benutze und nicht weiß wie die Worldmatirx nach dieser Multipliziererei aussieht. Weiß jemand, wie man diese sichtbar machen kann?

Ciao,
TomCat

1 Mal gendert, zuletzt am 24.01.2009, 15:01:47 Uhr von TomCat.
24.01.2009, 15:01:00 Uhr
frittentuete Offline
ZFX'ler


Registriert seit:
08.03.2005

Hamburg
Re: TexturgrößeNach oben.
hi,

ich würde dann lieber meine maus/touch Koordinaten in Weltkoordinaten umrechnen (z musst du selber bestimmen) und anhand dieser die Polygone ändern. Umrechnen kannst du mit der inversen View-Projection-Matrix.

Oder habe ich jetzt dein Problem nicht verstanden?

frittentuete

ps: wo berechnest du denn die WorldMatrix? Wenn dies nicht gerade im Shader passiert, dann dürfte es doch kein Problem sein, sich diese anzeigen zu lassen, oder?
24.01.2009, 18:11:21 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: TexturgrößeNach oben.
Ich glaub ich hab dein Problem auch nicht richtig verstanden, aber ich wette du kannst es entweder mit D3DXVec3Unproject oder D3DXVec3Project lösen

Ciao
25.01.2009, 14:16:34 Uhr
Bomber-Revolution
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel