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

08.01.2008, 11:21

wo ist das dreieck?

hi @ all,

bin jetzt da, wo man die erste 3d anwendung schreibt. jetzt habe ich das so wie im buch beschrieben gemacht, und ich seh nur, das ich den z-buffer gelöscht habe, aber das dreieck sehe ich nicht woran kann das liegen?

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <Windows.h>
#include <TriBase.h>
#include "..\..\..\Allgemeines\InitWindow.h"
#include "..\..\..\Allgemeines\Direct3DEnum.h"
#include "..\..\..\Allgemeines\InitDirect3D.h"


struct SVertex
{
    tbVector3 vPosition;
    DWORD     dwColor;
};


SDirect3DParameters g_Direct3DParameters;   
float               g_fTime = 0.0f;         
SVertex             g_aTriangleVertex[3];

tbResult Render(float fNumSecsPassed)
{
    HRESULT hResult;
    
    tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation((tbVector3(0.0f, 0.0f, 2.0f))));

    tbMatrix mWorld = mRotation * mTranslation;
    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*) (&mWorld));

    if(FAILED(hResult = g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 63), 1.0f, 0)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    g_pD3DDevice->BeginScene();

    if(FAILED(g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, g_aTriangleVertex, sizeof(SVertex))))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    }

    g_pD3DDevice->EndScene();

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

    return TB_OK;
}

tbResult Move(float fNumSecsPassed)
{

    g_fTime += fNumSecsPassed;

    return TB_OK;
}

tbResult InitScene()
{
    HRESULT hResult;


    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR)
    }

    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    float fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)
                    / (float)(g_Direct3DParameters.VideoMode.Height);

    tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), fAspect, 0.1f, 100.0f);

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    g_aTriangleVertex[0].vPosition  = tbVector3( 0.0f,  1.0f, 0.0f);
    g_aTriangleVertex[1].vPosition  = tbVector3( 1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[2].vPosition  = tbVector3(-1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor    = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[1].dwColor    = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[2].dwColor    = tbColor(0.0f, 0.0f, 1.0f);

    return TB_OK;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd)
{
    tbInit();

    SDirect3DParameters Direct3DParameters;
    tbResult Result = GetDirect3DParameters(&Direct3DParameters);

    if(Result == TB_ERROR)
    {
        MessageBox(NULL, "Fehler beim abzählen!", "Fehler", MB_OK|MB_ICONEXCLAMATION);
        tbExit();
        return 1;
    }
    else if(Result == TB_CANCELED)
    {

        tbExit();
        return 0;
    }

    if(InitWindow(Direct3DParameters.VideoMode.Width,
        Direct3DParameters.VideoMode.Height,
        "Direct 3D-Abzählung", 
        LoadIcon(NULL, IDI_APPLICATION)))
    {
        MessageBox(NULL, "Fehler beim erstellen des Fensters!", "Fehler", MB_OK|MB_ICONEXCLAMATION);
        tbExit();
        return -1;
    }

    if(InitDirect3D(&Direct3DParameters, g_hWindow))
    {
        MessageBox(NULL, "Direct3D konnte nicht initialisiert werden!", "Fehler", MB_OK|MB_ICONEXCLAMATION);
        ExitWindow();
        tbExit();
        return 1;
    }

    InitScene();
    tbDoMessageLoop(Render, Move);

    ExitDirect3D();
    ExitWindow();

    tbExit();

    return 0;
}

2

13.01.2008, 14:16

kann mir keiner helfen?

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

13.01.2008, 14:22

Dein Vertex-Format hat gar kein FVF-Bezeichner

4

13.01.2008, 16:28

Zitat von »"Databyte"«

Dein Vertex-Format hat gar kein FVF-Bezeichner

Und anscheinend hat DirectX auch keinen Vertexbuffer, den du vor dem Rendern mit SetStreamSource (analog zu SetFVF oä.) angeben solltest.

Edit: Oops, den brauchts bei DrawPrimitiveUP
ja garnicht. War ich zu schnell. Konnte den Post nicht mehr löschen.

5

13.01.2008, 17:04

Nachdem ich vorher Blödsinn verzapft habe, hier die Lösung deines Problems:

C-/C++-Quelltext

1
2
3
tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), fAspect, 0.1f, 100.0f);

g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));


Kommentier das mal aus, und das:

C-/C++-Quelltext

1
2
tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation((tbVector3(0.0f, 0.0f, 2.0f))));


Und verwende stattdessen die Identitätsmatrix für mWorld, dann gehts.

6

13.01.2008, 21:13

danke jetzt sehe ich zumindest das dreieck :D . ich habe dann nach ein bisschen rumspielen mit dem code festgestellt, das ich folgenden code nicht brauche, da sich das dreieck nicht bewegt:

C-/C++-Quelltext

1
2
tbMatrix mRotation = (tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));
    tbMatrix mTranslation = (tbMatrixTranslation((tbVector3(10.0f, 0.0f, 200.0f))));
. wie bekomme ich es jetzt hin, das sich das dreieck dreht?

7

14.01.2008, 08:39

Tja, irgendwie transformiert dein aktueller Code das Dreieck ins Nirwana.
Ne "richtige" Kamera wäre nicht schlecht. Du hast bislang nur eine Projektionsmatrix, aber keine Sichtmatrix.

C-/C++-Quelltext

1
2
3
// Unabhängig davon, eine Möglichkeit, das Dreieck rotieren zu lassen (hier Z-Achse)

D3DXMatrixRotationYawPitchRoll(&mWorld, 0.0f, 0.0f, g_fTime * 0.25f);
g_pD3DDevice->SetTransform(D3DTS_WORLD, &mWorld);

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

8

14.01.2008, 09:34

Er hat deswegen keine Sichtmatrix, weil er nicht unbedingt eine braucht und weil im Beispiel auch keine verwendet wurde. Es wird hier durch eine Transformation der Weltmatrix gearbeitet ;)

Warum er kein Dreieck sieht?

C-/C++-Quelltext

1
tbMatrixTranslation((tbVector3(10.0f, 0.0f, 200.0f)))

C-/C++-Quelltext

1
tbMatrixProjection(TB_DEG_TO_RAD(90.0f), fAspect, 0.1f, 100.0f)


sein Dreieck wird 200 LE in Richtung der Z- Achse bewegt -> er sieht aber durch das Clipping tatsächlich nur 100 LE -> Versuchs mal mit 10LE, das reicht völlig ;) Und mach die 10 LE auf der X Achse weg sonst könnte es sein dass das Dreieck außerhalb der rechten Bildschirmseite liegt.
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

9

14.01.2008, 10:05

Das Problem liegt hier:

C-/C++-Quelltext

1
2
float fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)     
/ (float)(g_Direct3DParameters.VideoMode.Height);


g_Direct3DParameters wird nirgends initialisiert.
Hab für fAspect mal 1.25f hardcodiert, dann klappt's auch mit dem bisherigen Code...


(Link)

10

14.01.2008, 18:22

@TrikkieMikkie

g_Direct3DParameters wird ganz oben mit SDirect3DParameters initialisiert. aber wenn ich fAspect einem Wert manuell zuweise, wíe du es gesagt hast, geht es.

Werbeanzeige