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

1

22.05.2010, 22:23

Das erste Dreieck

Hallo,

ich versuche mich zur Zeit etwas in DirectX einzuarbeiten. Jetzt habe ich allerdings ein kleines Problem,
bei dem mir vielleicht jemand helfen könnte. ^^ Ich lese grade das Buch 3D-Spieleprogrammierung mit DirectX9 und c++.
Nebenher schreibe ich mir die in dem Buch beschriebene TribaseEngine in ähnlicher Form nochmal selber. (zum Verständniss für mich
-> so bleibt's mir länger im Gedächtniss ^^). Mein Problem ist nun, dass das Dreieck aus dem in der Überschrift genannten Kapitel,
bei mir nicht angezeigt wird. Will heißen, ich erstelle ein Fenster (funktioniert wohl ;)), initialisiere Direct3D (scheint auch kein Fehler drinne zu sein ;)) setze die Renderstats usw.. Mit hilfe des Logs hab ich so ziemlich alles bzgl. irgendwelcher Initialisierungsfehler oä. überprüft. das Fenster wird sogar ge-Clear()-t :D, nur sehe ich einfach kein Dreieck. Somit denke ich kanns nur an den Positionen, Rotationen usw oder der MatrixProjection oä. liegen ^^. Ich komme nur irgendwie nicht weiter. Daher...

Hier der Code:
(Ich denke die Initialisierung von D3D und dem Fenster sind eher von sekundärer bedeutung daher lasse ich das einfach mal weg)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Datei: mein.cpp

#include <windows.h>
#include <string>

#include "TDX_E/TDX_Direct3D9.h"
#include "TDX_E/TDX_Log.h"
#include "TDX_E/TDX_Color.h"
#include "TDX_E/TDX_Vector3.h"


HWND hwnd;
TDX_Direct3D9* g_TDX;

struct SVertex
{
TDX_Vector3 vPosition;
DWORD dwColor;
static const DWORDdwFVF;
};

const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

void Render(float time)
{

TDX_Matrix mRotation(TDX_RotationYMatrix(DEG_TO_RAD( time*90 )));
TDX_Matrix mTranslation(TDX_TranslationMatrix(TDX_Vector3(0.0f,0.0f,2.0f)));
TDX_Matrix mWorld(mRotation*mTranslation);
g_TDX->GetDevice()->SetTransform(D3DTS_WORLD,(D3DMATRIX*)(&mWorld));

SVertex Vertex[3];
Vertex[0].vPosition = TDX_Vector3(0.0f, 1.0f, 0.0f);
Vertex[1].vPosition = TDX_Vector3(1.0f, -1.0f, 0.0f);
Vertex[2].vPosition = TDX_Vector3(-1.0f, -1.0f, 0.0f);
Vertex[0].dwColor = TDX_Color(1.0f,0.0f,0.0f);
Vertex[1].dwColor = TDX_Color(0.0f,1.0f,0.0f);
Vertex[2].dwColor = TDX_Color(0.0f,0.0f,1.0f);   

// Draw
g_TDX->GetDevice()->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,TDX_Color(0.15f,0.15f,0.15f),1.0f,0);
g_TDX->GetDevice()->BeginScene();

if(FAILED(g_TDX->GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,Vertex,sizeof(SVertex))))
{
    WriteToLog("[DrawPrimitiveUP]: failed!","color:red");
}

g_TDX->GetDevice()->EndScene();
g_TDX->GetDevice()->Present(NULL,NULL,NULL,NULL);
}

void Move(float time)
{
}

int WINAPI WinMain (HINSTANCE hThisInstance,
                HINSTANCE hPrevInstance,
                LPSTR lpszArgument,
                int nFunsterStil)

{
TDX_Direct3D9 TDX(&hwnd,&hThisInstance,ENG);
g_TDX = &TDX;

if(g_TDX->Init() == TDX_OK)
{
                 
                 
    /* Init Scene */
    HRESULT hResult;
    
    if(FAILED(hResult = g_TDX->GetDevice()->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        WriteToLog("[InitScene]: failed!","color:red; font-family:'Arial Black'");
    }
    
    g_TDX->GetDevice()->SetRenderState(D3DRS_LIGHTING,false);
    g_TDX->GetDevice()->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
    g_TDX->GetDevice()->SetRenderState(D3DRS_DITHERENABLE,true);
    
    TDX_Matrix TDXM = TDX_ProjectionMatrix( DEG_TO_RAD(45.0f),
                                            g_TDX->GetWidth()/g_TDX->GetHeight(),
                                            0.1f, 
                                            100.0f);
                                            
    g_TDX->GetDevice()->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*) (&TDXM));
                                
    WriteToLog(TDX_GetString(TDXM));
    /* ========== */  

    g_TDX->DoMessageLoop(Move,Render);
}

g_TDX->Exit();

return 0;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Datei: TDX_Direct3D9.cpp

/* Init / Exit */
TDX_Result TDX_Direct3D9::Init()
{
TDX_Result TRes = GetDirect3DParameters(&Para);

InitWindow(Para.VideoMode.Width,Para.VideoMode.Height);
D3DInit(&Para);

return TRes;
}

TDX_Result TDX_Direct3D9::Exit()
{
D3DExit();
ExitWindow();
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Datei: TDX_Matrix.h

//////////////////////
// TDX_Matrix-Class //
//////////////////////
class TDX_Matrix
{
public:
/* ====( Matrix-Vars )==== */
union
{
    struct
    {
        float M11,M12,M13,M14,
              M21,M22,M23,M24,
              M31,M32,M33,M34,
              M41,M42,M43,M44;
    };
    
    float m[4][4];
};

/* ====( Konstruktors )==== */
TDX_Matrix();
TDX_Matrix( const TDX_Matrix& m );
TDX_Matrix( float M11, float M12, float M13, float M14,
            float M21, float M22, float M23, float M24,
            float M31, float M32, float M33, float M34,
            float M41, float M42, float M43, float M44 );
            
/* ====( Assignment-Operators )==== */
TDX_Matrix operator=(const TDX_Matrix& v);
TDX_Matrix operator*=(const TDX_Matrix& v);
TDX_Matrix operator/=(const TDX_Matrix& v);
TDX_Matrix operator+=(const TDX_Matrix& v);
TDX_Matrix operator-=(const TDX_Matrix& v);

/* ====( Comparison-Operators )==== */
bool operator==(const TDX_Matrix& v);
bool operator!=(const TDX_Matrix& v);

/* ====( Access-Operators )==== */
float& operator() (const int& Row, const int& Column);
float  operator() (const int& Row, const int& Column) const;
};


// ...

// kA warum ich hierfür ne eigene Funktion geschrieben hab ^^
/*  Projektions Translation */
inline TDX_Matrix TDX_ProjectionMatrix(float RAD, float Relation, float NC, float FC)
{
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, RAD, Relation, NC, FC );
       
TDX_Matrix ProjectionMatrix( matProj(1,1),matProj(1,2),matProj(1,3),matProj(1,4),
                        matProj(2,1),matProj(2,2),matProj(2,3),matProj(2,4),
                        matProj(3,1),matProj(3,2),matProj(3,3),matProj(3,4),
                        matProj(4,1),matProj(4,2),matProj(4,3),matProj(4,4));
return ProjectionMatrix;
}

// ...


Wenn mir da jemand weiterhelfen könnte wäre ich sehr Dankbar :thumbsup:
;>" Auf jedem Schiff das dampft und segelt ist einer der die Putzfrau vögelt. Und ist das Schiff auch noch so klein, einer muss die Putzfrau sein.

Frauen sind wie Computer. Man denkt: "Hättest du noch ein bisschen abgewartet, hättest du vermutlich was besseres gekriegt"

2

22.05.2010, 22:38

Dir fehlt ein g_TDX->GetDevice()->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE) dann müsstes es gehen ^^

3

22.05.2010, 22:46

Da muss ich dich leider enttäuschen ^^ Schau mal in der WinMain ^^
;>" Auf jedem Schiff das dampft und segelt ist einer der die Putzfrau vögelt. Und ist das Schiff auch noch so klein, einer muss die Putzfrau sein.

Frauen sind wie Computer. Man denkt: "Hättest du noch ein bisschen abgewartet, hättest du vermutlich was besseres gekriegt"

4

22.05.2010, 22:52

Oh sorry, hab ich übersehen ^^

5

22.05.2010, 23:45

Gehts denn nun? Falls nicht könnte es daran liegen das ich keine View Matrix sehe :)

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

6

22.05.2010, 23:55

Nein es geht noch nicht! :( Ich hatte meine ich auch mal mit na ViewMatrix rumprobiert nachdem ich sowas in ieinem Forum gesehn hatte ^^, aber ich hab leider keine Ahnung was da rein müsste. (Identity matrix (damit hats nicht funktioniert)? oder soll ichs immerim kreis drehn? xD) ?( Ich kenn mich da noch nicht so aus. ... noch ^^

PS: Wenn ich das richtig sehe sollte das aber auch ohne gehen ^^

Vielleicht findet ja noch irgendjemand den Fehler *hoff + daumen drück*
;>" Auf jedem Schiff das dampft und segelt ist einer der die Putzfrau vögelt. Und ist das Schiff auch noch so klein, einer muss die Putzfrau sein.

Frauen sind wie Computer. Man denkt: "Hättest du noch ein bisschen abgewartet, hättest du vermutlich was besseres gekriegt"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »PeterPanzki07« (23.05.2010, 00:05)


7

23.05.2010, 01:04

Also, erstmal nehm die Rotations Matrizen raus, sowas wäre schonmal eine potenzielle Fehlerquelle. Was die ViewMatrix angeht, kannst du ja einfach die D3DX Funktion benutzen:

C-/C++-Quelltext

1
D3DXMatrixLookAtLH(&ViewMatrix, &D3DXVECTOR3(1,0,10), &D3DXVECTOR3(0,0,0), &D3DXVECTOR(0,0,1));


Das sollte bei dir so funzen.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

8

23.05.2010, 08:49

Okay! Danke ^^
Ich hatte aber zusätzlich noch nen kleinen fehler in der ProjektionsMatrix ^^ habs jz mal ohne diese dumme eigene Funktion gemacht und statt es in meine Matrix-Klasse zu packen direkt D3DXMATRIX benutzt. Jz gehts ^^, auch wenn das Dreieck noch etwas verzerrt is. Egal es geht ! :D :thumbsup:
;>" Auf jedem Schiff das dampft und segelt ist einer der die Putzfrau vögelt. Und ist das Schiff auch noch so klein, einer muss die Putzfrau sein.

Frauen sind wie Computer. Man denkt: "Hättest du noch ein bisschen abgewartet, hättest du vermutlich was besseres gekriegt"

9

23.05.2010, 10:00

Die verzerrung liegt an dem Origin Vector, den du in der D3DXMatrixLookAtLH Funktion übergibst. D3DXVECTOR3(1,0,10). In dem fall bist du 10 Einheiten nach oben veschoben, und 1 Einheit nach links. Das resultiert darin das du ein wenig schief guckst. Mach aus der 1 einfach ne 0 ;)

Ich würde dir empfehlen einen einfaches Sample zu nehmen, indem einfach nur ein Dreieck oder Würfel gerendert wird. Gleichzeitig versuchst du immer mehr Funktionen on deinem Framework machen zu lassen, immer Stück für Stück. Dann siehst du schneller wo der Fehler liegt.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

10

23.05.2010, 11:20

Jip ... soweit bin ich dann auch gekommen. ^^
Aber jetzt mal ne allgemeine Frage.
Die Projektionsmatrix gleicht ja jetzt an die Seitenverhältnisse des Fensters an.
Dadruch werden meine Objekte aber ja grundsätzlich breiter als sie hoch sind ^^
Das heißt wenn ich ein Quadrat von OL(-1,1) -> UR(1,-1) erstelle ist dieses ja auch breiter.
Logischer weise bringts es ja auch nichts das Quadrat dann einfach schmaler ( z.B. OL(-0.75,1) UR(0.75,-1) )
zu machen, weil wenn ich es drehe wird es ja wieder breiter.

Also: Was tun? ^^
;>" Auf jedem Schiff das dampft und segelt ist einer der die Putzfrau vögelt. Und ist das Schiff auch noch so klein, einer muss die Putzfrau sein.

Frauen sind wie Computer. Man denkt: "Hättest du noch ein bisschen abgewartet, hättest du vermutlich was besseres gekriegt"

Werbeanzeige