Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

10.04.2008, 18:25

Hm, da hab ich wohl vergessen unten das DrawPrimitiveUP mit zu ändern, nachdem ich da was umgebaut habe.

Allerdings seh ich immernoch nichts außer nen schwarzen Schirm, auch mit den Änderungen der Koordinaten der Dreieckvertexe.

12

10.04.2008, 18:33

Wenn du den Code kopiert - und die Transformationen rausgelassen hast, dann sollte es so aussehen:


(Link)

13

10.04.2008, 18:44

Gibts doch nicht... bei mir ist schwarz... was hast Du denn da nun in dem Code genau weggelassen?

Edit: Ach, Du hast auch die Projektionsmatrix weggelassen...
Okay, dann gehts. Das ist aber bissl viel weggelassen :)
Dann werd ich mich mal mit den Transfmatritzen usw. beschaeftigen.

14

10.04.2008, 18:57

Zitat von »"RettetdemDativ"«

Dann werd ich mich mal mit den Transfmatritzen usw. beschaeftigen.

Sehr löblich! :)
Schon sehr gewagt, was du da gemacht hast und kann so nicht funktionieren.

15

12.04.2008, 18:17

Okay, Martrizen stehen :)

Ich sehe das Dreieck, kanns rotieren, schieben usw.

Ein Problem habe ich noch, nämlich die Sache mit dem Bildverhältnis. Bei der Tribase Engine kann man ja nen Float-Wert a là Breite/Höhe des Schirms mitgeben.
Nun habe ich ja Formel benutzt, welche unter "Projection Transform (Direct3D 9)" im MSDN zu finden ist.

Dort wird aber das Verhältnis des Schirms nicht mit eingerechnet. Aber es werden 2 Formeln angeben um w und h zu berechnen. Nur egal welche Formel, eins bleibt immer aussen vor, das Verhältnis oder der Winkel.

Nun bin ich da weiter über "SetViewPort" und die D3DVIREPORT9 Struktur gestolpert und dachte die hilft mir dabei:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
D3DVIEWPORT9 lala;
lala.X=0;
lala.Y=0;
lala.Width=1680;
lala.Height=1050;
lala.MinZ =0.0f;
lala.MaxZ = 1.0f;
test->SetViewport(&lala);


Leider ist dem nicht so, da sie absolut nichts am Aussehen ändert, das bei der Auflösung mein Dreieck in die Breite gezogen wird.
Wie bringt man das nun zusammen?

16

12.04.2008, 19:17

Ein Viewport definiert in erster Linie den Bereich, auf den gerendert wird. Standardmäßig der ganze Bildschirm bzw. der Fensterbereich. Möchtest du das ändern (z.B. multiple Viewports, Z-Ordering), oder suchst du eher eine Kamera?

17

12.04.2008, 19:39

Ich will meinen sichtbaren Bereich ändern. Also das Seitenverhaeltnis, das in die Projektionsmatrix einfliesst. Bei meinen 1680*1050 kommt ne 1.6 raus als Verhältnis, die irgendwo da mit rein muß, so das ein Quadrat ein Quadrat bleibt und nicht wie bei mir ein Rechteck wird :)

18

12.04.2008, 19:54

Projektionsmatrix erstelle ich für gewöhnlich so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
D3DXMATRIX mProjection;

float fFOV    = D3DX_PI * 0.25f;
float fAspect     = Width/Height;   
float fNearPlane  = 1.0f;
float fFarPlane   = 1000.0f;

D3DXMatrixPerspectiveFovLH( &mProjection, fFOV, fAspect, fNearPlane, fFarPlane );
pDevice->SetTransform(D3DTS_PROJECTION, &mProjection);

Da stimmt das Bildseitenverhältnis immer. ;)

19

12.04.2008, 20:01

Über die Funktionen die einem da helfen bin ich auch schon gestolpert. Aber was passiert mit FOV in X-Richtung? Das fliesst da ja gar nicht ein.
Und was ist da der Unterschied zwischen left und right handed?

Irgendwo in

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
D3DXMATRIX myProjektionsmatrix()
{
    D3DXMATRIX temp;
    ZeroMemory(&temp, sizeof(temp));
    const float near_plane=0.1f;    // Distance to near clipping // plane

    const float far_plane=100.0f;   // Distance to far clipping // plane

    const float fov_horiz=90.0f;    // Horizontal field of view // angle, in radians

    const float fov_vert=90.0f;     // Vertical field of view // angle, in radians

    
    float Q = far_plane/(far_plane - near_plane);
    
    temp(0, 0) = static_cast<float>(1/tan(fov_horiz/2));  // w

    temp(1, 1) = static_cast<float>(1/tan(fov_vert/2));   // h

    temp(2, 2) = Q;
    temp(3, 2) = -Q*near_plane;
    temp(2, 3) = 1;
    
    return temp;
}


muß sich doch das Seitenverhältnis einbauen lassen... Weil dann hätte man exakt das Gegenstück zu der Funktion aus der Tribase-Engine. (Wenn man die Parameter noch übergeben könnte, hier rausgelassen)

20

12.04.2008, 20:22

Zitat von »"RettetdemDativ"«

Aber was passiert mit FOV in X-Richtung?

In meinem obigen Beispiel kümmert sich DirectX um die Kleinarbeit.
Zur Tribase kann ich nicht viel sagen. Viele Engines sind halt vor Jahren entstanden und haben Funktionen implementiert, die DirectX mittlerweile auch zur Verfügung stellt. Also warum sich das Leben schwer machen oder das Rad neu erfinden (es sei denn, man holt dadurch Performance raus.) ?

Zitat von »"RettetdemDativ"«

Und was ist da der Unterschied zwischen left und right handed?

Wikipedia, unten auf der Seite... (bin zu faul zum Schreiben und Formulieren)

Werbeanzeige