Directx hilfe c++

Hallo,
ich lerne gerade das Programmieren mit DirectX 9 in C++. Nun hab ich folgendes problem. Ich kopiere mal den Quellcode aus der internetseite
www.directxtutorial.com (meinen eigenen hab ich nicht mehr, weil ich mein pc vorhin platt machen musste) :


// include the basic windows header files and the Direct3D header file
#include
#include
#include
#include

// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

// include the Direct3D Library files
#pragma comment (lib, „d3d9.lib“)
#pragma comment (lib, „d3dx9.lib“)

// global declarations
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer
LPDIRECT3DINDEXBUFFER9 i_buffer = NULL; // the pointer to the index buffer

// function prototypes
void initD3D(HWND hWnd);
void render_frame(void);
void cleanD3D(void);
void init_graphics(void);

struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;

ZeroMemory(&wc, sizeof(WNDCLASSEX));

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"WindowClass";

RegisterClassEx(&wc);

hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our Direct3D Program",
WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);

initD3D(hWnd);

MSG msg;

while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

if(msg.message == WM_QUIT)
break;

render_frame();
}

cleanD3D();

return msg.wParam;
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}

return DefWindowProc (hWnd, message, wParam, lParam);
}

// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

init_graphics();

d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); // turn off the 3D lighting
d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // turn off culling
d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE); // turn on the z-buffer
}

// this is the function used to render a single frame
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene();

d3ddev->SetFVF(CUSTOMFVF);

// set the view transform
D3DXMATRIX matView; // the view transform matrix
D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 8.0f, 25.0f), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction
d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView

// set the projection transform
D3DXMATRIX matProjection; // the projection transform matrix
D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plane
d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection

// set the world transform
static float index = 0.0f; index+=0.03f; // an ever-increasing float value
D3DXMATRIX matRotateY; // a matrix to store the rotation for each triangle
D3DXMatrixRotationY(&matRotateY, index); // the rotation matrix
d3ddev->SetTransform(D3DTS_WORLD, &(matRotateY)); // set the world transform

// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev->SetIndices(i_buffer);

// draw the Hypercraft
d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 10, 0, 6);

d3ddev->EndScene();

d3ddev-&gt:stuck_out_tongue_winking_eye:resent(NULL, NULL, NULL, NULL);
}

// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
v_buffer->Release();
i_buffer->Release();
d3ddev->Release();
d3d->Release();
}

// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// create the vertices using the CUSTOMVERTEX
struct CUSTOMVERTEX vertices[] =
{
// fuselage
{ 3.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 0.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 0.0f, 0.0f, 10.0f, D3DCOLOR_XRGB(255, 0, 0), },
{ -3.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255), },

// left gun
{ 3.2f, -1.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 3.2f, -1.0f, 11.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 2.0f, 1.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0), },

// right gun
{ -3.2f, -1.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ -3.2f, -1.0f, 11.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -2.0f, 1.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0), },
};

// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(10*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);

VOID* pVoid; // a void pointer

// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();

// create the indices using an int array
short indices[] =
{
0, 1, 2, // fuselage
2, 1, 3,
3, 1, 0,
0, 2, 3,
4, 5, 6, // wings
7, 8, 9,
};

// create a index buffer interface called i_buffer
d3ddev->CreateIndexBuffer(18*sizeof(short),
0,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&i_buffer,
NULL);

// lock i_buffer and load the indices into it
i_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, indices, sizeof(indices));
i_buffer->Unlock();
}


Dieser Code Erstellt ein Simples Modell (Raumschiff), aus Dreiecken, dass sich dreht.

Wenn ich jetzt aber ein zweites Modell mit der gleichen struct (vertices) und dem array (indices) erstellen möchte, hab ich ein Problem:

Dieses zweite Modell dreht sich mit dem Raumschiff.
Ich verstehe ja auch einigermaßen warum das so ist, aber mir fällt rein garnichts ein wie ich sie unabhängig voneinander bewegen könnte.
(ich hab auch schon versucht, das objekt in eine neue strucktur, vertexbuffer + index (und sogar renderschleife) zu erstellen, aber dann dreht es sich immer noch mit)

Wisst ihr ne lösung?

Hi,
es ist zwar schon 3 Jahre her das ich mich mit DirectX beschäftigt habe, aber vielleicht klappts ja - wenn ich das richtig verstanden habe, hast du zwei Vertex und Indexbuffer die zu 2 Modellen gehören. Du möchtest nun aber das diese Modelle unterschiedlich rotieren, richtig?
Reicht es nicht aus, wenn du vor dem Rendern des jeweiligen Objekts einfach die Transformationsmatrix änderst?:

...
//DAS ERSTE MODEL RENDERN
// set the world transform
static float index = 0.0f; index+=0.03f; // an ever-increasing float value
D3DXMATRIX matRotateY; // a matrix to store the rotation for each triangle
D3DXMatrixRotationY(&matRotateY, index); // the rotation matrix
d3ddev-\>SetTransform(D3DTS\_WORLD, &(matRotateY)); // set the world transform

// select the vertex buffer to display
d3ddev-\>SetStreamSource(0, v\_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev-\>SetIndices(i\_buffer);

// draw the Hypercraft
d3ddev-\>DrawIndexedPrimitive(D3DPT\_TRIANGLELIST, 0, 0, 10, 0, 6);

//DAS ZWEITE MODEL RENDERN
// set the world transform
static float index2 = 0.0f; index2+=0.06f; // an ever-increasing 
D3DXMatrixRotationY(&matRotateY, index2); // the rotation matrix
d3ddev-\>SetTransform(D3DTS\_WORLD, &(matRotateY)); // set the world transform

//BUFFER UND INDIZES FÜR DAS ZWEITE MODELL!!
// select the vertex buffer to display 
d3ddev-\>SetStreamSource(0, v\_buffer2, 0, sizeof(CUSTOMVERTEX));
d3ddev-\>SetIndices(i\_buffer2);

// draw the second model
d3ddev-\>DrawIndexedPrimitive(D3DPT\_TRIANGLELIST, 0, 0, 10, 0, 6); //Diese parameter müssen noch dan die Daten des zweiten Modells angepasst werden!
.....

Wenns klappt dann dreht sich das zweite Modell doppelt so schnell.

Viele Grüße

Manny

Danke, das hat funktioniert!
aber ich habe noch eine frage (von vielen anderen =) ):

Ich habe nun ein programm geschrieben, (auf dem gleichen quellcode basierend wie vorher) mit dem ich die Kamera via Maus steuern kann.

(vor einem ist noch ein Viereck mit einer Textur drauf)

Ich hab das wie folgt gemacht:

In der messageschleife hab ich mit WM_MOUSEMOVE abgefragt ob die Maus bewegt wurde. Dann hab ich gekuckt in welch richtung die Maus bewegt wurde, und so dementsprechend X / Y - Variablen De- oder Incementiert (oder wie mann das nennt?). Diese Variablen hab ich dann in die Kameramatrix eingefügt:


D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, posz),
&D3DXVECTOR3 (-posx, -posy, 0.0f),
&D3DXVECTOR3 (0.0f, 2.0f, 0.0f));

posz ist jetzt unwichtig, und das „-“ vor den Variablen auch. Der rest erklärt sich hoffentlich von selbst…
Nun stehe ich aber vor einem Problem:
Wenn ich die Kamera jetzt bewege, sieht es zunächst einmal so aus, als würde alles funktionieren. Aber ich kann mich nicht um die eigene Achse drehen. Die Kamera dreht sich NIE mehr als 180 grad.

Und außerdem (dazu ist posz) hab ich dass so gemacht, dass ich mit der Kamera geradeaus un rückwärts gehen kann. Aber am Mittelpunkt der Welt richtet sich die Kamera genau nach hinten aus (genau in die richtung also in die ich mit der Maus nicht hinkomme)!

ps: Kann es sein dass sich die Kammera immer zur Mitte ausrichtet???

Hi,


D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, posz),
&D3DXVECTOR3 (-posx, -posy, 0.0f),
&D3DXVECTOR3 (0.0f, 2.0f, 0.0f));

posz ist jetzt unwichtig, und das „-“ vor den Variablen auch.
Der rest erklärt sich hoffentlich von selbst…
Nun stehe ich aber vor einem Problem:
Wenn ich die Kamera jetzt bewege, sieht es zunächst einmal so
aus, als würde alles funktionieren. Aber ich kann mich nicht
um die eigene Achse drehen. Die Kamera dreht sich NIE mehr als
180 grad.

Du hast da ein Gedankenfehler drin - du veränderst durch bewegen der Maus die x und y Koordinate des Punktes auf den die Kamera schaut - d.h. du schaust immer auf eine Ebene die durch z = 0 geht.
Jetzt sei mal deine Kamera-z-Position ungleich null - dann stehst du vor der Ebene und schaust dir Punkte darauf an - die Ebene ist aber immer vor dir - d.h. du wirst dich nicht um mehr als 180 Grad drehen, denn dann würdest du die Ebene nicht mehr angucken.

Und außerdem (dazu ist posz) hab ich dass so gemacht, dass ich
mit der Kamera geradeaus un rückwärts gehen kann. Aber am
Mittelpunkt der Welt richtet sich die Kamera genau nach hinten
aus (genau in die richtung also in die ich mit der Maus nicht
hinkomme)!

Genau, dann haste nämlich den Nullpunkt überschritten und schaust dir nun die Rückseite der Ebene an - damit siehst du natürlich genau das, was du vorher nicht sehen konntest.

ps: Kann es sein dass sich die Kammera immer zur Mitte
ausrichtet???

Die Kamera ist bei dir einfach nur zur Ebene ausgerichtet - das dies die Mitte ist, liegt daran, dass die Ebene durch z = 0 geht.

Ich habe dieses Problem damals anders gelöst, indem ich zwei Parameter eingeführt habe - g_fCameraRot und g_fCameraUpDown. Ersteres gibt die Rotation um die eigene Achse der Kamera an (das was bei dir nur bis 180° ging) und letzteres ob die Kamera nach oben oder unten schaut.

 if(Maus nach links bewegt) g\_fCameraRot -= je nach dem wie stark du ändern willst - denke aber daran, dass die Sachen im Bogenmaß sind, d.h. ein Wert von ungefähr 6 entspricht schon einer Drehung um 360°;
 if(Maus nach rechts bewegt) g\_fCameraRot += s.o.;
 if(gMaus nach oben bewegt) g\_fCameraUpDown -= s.o.;
 if(Maus nach unten bewegt) g\_fCameraUpDown += s.o.;

vCameraDir = D3DXVECTOR3(sinf(g\_fCameraRot) \* cosf(g\_fCameraUpDown),
 sinf(g\_fCameraUpDown),
 cosf(g\_fCameraRot) \* cosf(g\_fCameraUpDown));
D3DXVECTOR3 g\_vCameraPos(0.0f, 0.0f, posz);
D3DXVECTOR3 dummy = g\_vCameraPos + vCameraDir;
D3DXMatrixLookAtLH(&matView,
 &g\_vCameraPos,
 &dummy,
 &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));

Musste das jetzt etwas auf deine Sachen anpassen - kann dir daher nicht garantieren das es funktioniert.

Viele Grüße

Manny

Die Erklärung warum es nicht funktioniert ist verständlich, aber die lösung funktioniert nicht. (Mal abgesehen davon dass ich Probleme habe sie zu verstehen…)

Ich habs schohn hingekriegt dass der Compiler keine Fehlermeldungen ausspuckt, aber es passiert im Programm garnichts.

Hi,
sry kann sein, da ich es nicht ausprobieren konnte.
Zeig mal wie du den Code eingebaut hast, vielleicht fällt mir ja noch was ein.

Hi, ich hatte den Code wieder rückgängig gemacht.
Beim erneuten einfügen hat er die vierecke nicht mehr gezeichnet…


// include the basic windows header files and the Direct3D header file
#include
#include
#include
#include

// define the screen resolution
#define SCREEN_WIDTH 1440
#define SCREEN_HEIGHT 900

// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer
LPDIRECT3DTEXTURE9 texture_1; // our first texture
float posx = 0.0f;
float posy = 0.0f;
float posz = 20.0f;
float g_fCameraRot;
float g_fCameraUpDown;
static POINT prevmpos;
static POINT currmpos;

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
void init_graphics(void); // 3D declarations

struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR; float tu, tv;};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
GetCursorPos( &prevmpos );

HWND hWnd;
WNDCLASSEX wc;

ZeroMemory(&wc, sizeof(WNDCLASSEX));

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"WindowClass";

ShowCursor(NULL);

RegisterClassEx(&wc);

hWnd = CreateWindowEx(NULL,
L"WindowClass",
L"DirectX-Shooter_Sample",
WS_EX_TOPMOST | WS_POPUP,
0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWnd, nCmdShow);

// set up and initialize Direct3D
initD3D(hWnd);

// enter the main loop:

MSG msg;

while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

if(msg.message == WM_QUIT)
break;

render_frame();
}

// clean up DirectX and COM
cleanD3D();

return msg.wParam;
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;

case WM_KEYDOWN:
{
switch(wParam)
{
case VK_ESCAPE:
{
PostQuitMessage(0);
return 0;
}
case VK_UP:
{
posz–;
return 0;
}
case VK_DOWN:
{
posz++;
return 0;
}
}
}
case WM_MOUSEMOVE:
{
GetCursorPos( &currmpos );

//Y-Bewegung
if (prevmpos.y != currmpos.y)
{
if (prevmpos.y currmpos.y)
{
posy–;
}
GetCursorPos( &prevmpos );
if (currmpos.y 500)
{
SetCursorPos(200, 200);
}
}

//X-Bewegung
if (prevmpos.x != currmpos.x)
{
if (prevmpos.x currmpos.x)
{
g_fCameraRot++;
}
GetCursorPos( &prevmpos );
if (currmpos.x 500)
{
SetCursorPos(200, 200);
}
//if (posx CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

init_graphics(); // call the function to initialize the triangle

d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); // turn off the 3D lighting
d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // both sides of the triangles
d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE); // turn on the z-buffer
}

// this is the function used to render a single frame
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene();

// select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);

D3DXMATRIX matView;

//------------------------------------------------------------------------------------------------------------
D3DXVECTOR3 vCameraDir;

vCameraDir = D3DXVECTOR3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
sinf(g_fCameraUpDown),
cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
D3DXVECTOR3 g_vCameraPos(0.0f, 0.0f, posz);
D3DXVECTOR3 dummy = g_vCameraPos + vCameraDir;
D3DXMatrixLookAtLH(&matView,
&g_vCameraPos,
&dummy,
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
//------------------------------------------------------------------------------------------------------------

D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction

d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView

D3DXMATRIX matProjection; // the projection transform matrix

D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
1000.0f); // the far view-plane

d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection

// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

// set the texture
d3ddev->SetTexture(0, texture_1);

// copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 6);

d3ddev->EndScene();

d3ddev-&gt:stuck_out_tongue_winking_eye:resent(NULL, NULL, NULL, NULL);
}

// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
v_buffer->Release(); // close and release the vertex buffer
d3ddev->Release(); // close and release the 3D device
d3d->Release(); // close and release Direct3D
texture_1->Release(); // close and release the texture
}

// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// load the texture we will use
D3DXCreateTextureFromFile(d3ddev,
L"fusboden.bmp",
&texture_1);

// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
{ 0.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0},
{ 5.0f, 5.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1},
{ 0.0f, 5.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1},
{ 0.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0},
{ 5.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0},
{ 5.0f, 5.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1},

{ 0.0f, 0.0f, -40.0f, D3DCOLOR_XRGB(0, 255, 255), 0, 0},
{ 5.0f, 5.0f, -40.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1},
{ 0.0f, 5.0f, -40.0f, D3DCOLOR_XRGB(255, 0, 255), 0, 1},
{ 0.0f, 0.0f, -40.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0},
{ 5.0f, 0.0f, -40.0f, D3DCOLOR_XRGB(0, 255, 255), 1, 0},
{ 5.0f, 5.0f, -40.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1},

{ -5000.0f, 0.0f, 500.0f, D3DCOLOR_XRGB(255, 255, 255)},
{ 500.0f, 0.0f, 500.0f, D3DCOLOR_XRGB(255, 255, 255)},
{ -500.0f, 0.0f, -500.0f, D3DCOLOR_XRGB(255, 255, 255)},
{ 500.0f, 0.0f, 500.0f, D3DCOLOR_XRGB(255, 255, 255)},
{ 500.0f, 0.0f, -500.0f, D3DCOLOR_XRGB(255, 255, 255)},
{ -500.0f, 0.0f, -500.0f, D3DCOLOR_XRGB(255, 255, 255)},
};

// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(18*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);

VOID* pVoid; // a void pointer

// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
}

Hi, ich hatte den Code wieder rückgängig gemacht.
Beim erneuten einfügen hat er die vierecke nicht mehr
gezeichnet…

Was meinst du damit - die Modelle waren mit dem Code den ich dir gegeben habe nicht mehr sichtbar?

if (prevmpos.x SetTransform(D3DTS_VIEW, &matView); // set the
view transform to matView

Meintest du dieses mit „rückgängig gemacht“? Wenn das dein Versuch war den Code zu testen, dann ist klar, dass sich nichts getan hat, denn du überschreibst ja matView wieder mit Werten, die von der Mausposition unabhängig sind.

Ich habe übrigens auch nirgendwo im Code gefunden wo du g_fCameraUpDown und g_fCameraRot mit 0 initialisiert hast…

Viele Grüße

Manny

@manny: Tja, da hast du allerdings recht…
Aber ich mache gerade pause, weil ich, wie du vielleicht mitgekriegt hast mich nicht zwischen DirectX + OpenGL
entscheiden kamnn.

Vielleicht kanst du mir einen Rat geben???