Frage

Allright - scheint meine Frage, wie trüb wie mein Kopf war. Lets versuchen Sie es erneut.

Ich habe 3 Eigenschaften während Ansichtsfenster für ein D3D-Gerät zu konfigurieren: - Die Auflösung der Vorrichtung in (Vollbild) ausgeführt wird. - Das physikalische Seitenverhältnis des Monitors (als Fraktion und Schwimmer: 1, so dass für ex 4: 3 & 1.33.). -. Das Seitenverhältnis der Quelle Auflösung (Quelle Auflösung selbst Art von strittig ist und sagt uns, etwas mehr als das Seitenverhältnis des Rendering will und die Art der Auflösung, die ideal wäre zulaufen)

Dann führen wir in diesen:

// -- figure out aspect ratio adjusted VPs  -- 

m_nativeVP.Width = xRes;
m_nativeVP.Height = yRes;
m_nativeVP.X = 0;
m_nativeVP.Y = 0;
m_nativeVP.MaxZ = 1.f;
m_nativeVP.MinZ = 0.f;

FIX_ME // this does not cover all bases -- fix!
uint xResAdj, yResAdj;  
if (g_displayAspectRatio.Get() < g_renderAspectRatio.Get())
{
    xResAdj = xRes;
    yResAdj = (uint) ((float) xRes / g_renderAspectRatio.Get());
}
else if (g_displayAspectRatio.Get() > g_renderAspectRatio.Get())
{
    xResAdj = (uint) ((float) yRes * g_renderAspectRatio.Get());
    yResAdj = yRes;     
}
else // ==
{
    xResAdj = xRes;
    yResAdj = yRes;
}

m_fullVP.Width = xResAdj;
m_fullVP.Height = yResAdj;
m_fullVP.X = (xRes - xResAdj) >> 1; 
m_fullVP.Y = (yRes - yResAdj) >> 1; 
m_fullVP.MaxZ = 1.f;
m_fullVP.MinZ = 0.f;

Jetzt solange g_displayAspectRatio gleich das Verhältnis von xRes / Yres (= von Geräteauflösung angepasst), alles gut ist und dieser Code wird tun, was von ihm erwartet wird. Aber sobald diese zwei Werte werden nicht mehr im Zusammenhang (zum Beispiel läuft jemand eine 4: 3-Auflösung auf eine 16:10, Hardware-gestreckt) ein weiterer Schritt erforderlich ist, zu kompensieren, und ich habe Mühe bekam genau herauszufinden, wie .

(und P. S Ich benutze C-Stil auf Atomtypen wirft, damit leben :-))

War es hilfreich?

Lösung

Ich gehe davon aus, was Sie erreichen wollen einen „square“ Vorsprung, z.B. wenn Sie einen Kreis zeichnen wollen, dass es wie ein Kreis zu suchen, anstatt eine Ellipse.

Das einzige, was Sie mit Ihrem Projektion (Kamera) Seitenverhältnis spielen. Im Normalfall hält Monitore Pixel Platz und alles, was Sie tun müssen, ist Ihre Kamera Seitenverhältnis gleich Ihre Ansichtsfenster des Seitenverhältnis einstellen:

viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;

Im gestreckten Fall, dass Sie beschreiben (4: 3 Bild auf eine 16:10 zum Beispiel gedehnt), Pixel sind nicht mehr quadratisch, und Sie haben das in Ihrem Kamera Seitenverhältnis zu berücksichtigen:

stretch_factor_x = screen_size_x / viewport_res_x;
stretch_factor_y = screen_size_y / viewport_res_y;
pixel_aspect_ratio = stretch_factor_x / stretch_factor_y;
viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio * pixel_aspect_ratio;

Wo screen_size_x und screen_size_y sind Vielfache der tatsächlichen Größe des Monitors (z 16:10).

Sie sollten jedoch nur quadratische Pixel annehmen (es sei denn, Sie haben einen bestimmten Grund nicht an), da der Monitor an das System oder keine Informationen alle zu falschen physikalischen Größe Informationen übermitteln können. Auch Monitore nicht immer strecken, Mine zum Beispiel 1 hält. 1 Pixel-Seitenverhältnis und fügt schwarze Ränder für niedrigere Auflösungen

Bearbeiten

Wenn Sie Ihr Ansichtsfenster zu einem gewissen Seitenverhältnis anpassen mögen und passen es an einer beliebigen Auflösung dann könnte man so tun:

viewport_aspect_ratio = 16.0 / 10.0; // The aspect ratio you want your viewport to have
screen_aspect_ratio = screen_res_x / screen_res_y;

if (viewport_aspect_ratio > screen_aspect_ratio) {
    // Viewport is wider than screen, fit on X
    viewport_res_x = screen_res_x;
    viewport_res_y = viewport_res_x / viewport_aspect_ratio;
} else {
    // Screen is wider than viewport, fit on Y
    viewport_res_y = screen_res_y;
    viewport_res_x = viewport_res_y * viewport_aspect_ratio;
}

camera_aspect_ratio = viewport_res_x / viewport_res_y;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top