|
|
我看不到要绘制出来的矩形,不知道照相机的镜头设置是否正确,请高手帮我看看.
本人刚学习,请不要见笑.第一次发贴不知道是否描述清楚了.
以下是全部代码:
#include <windows.h>
#include<d3d9.h>
#include <d3dx9.h>
#include <time.h>
#include <d3dx9mesh.h>
#include <stdio.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib,"winmm.lib")
IDirect3D9* g_D3D = NULL;
IDirect3DDevice9* g_D3DDevice = NULL;
D3DXMATRIX g_projection;
D3DXMATRIX g_ViewMatrix;
D3DXMATRIX g_WorldMatix;
HWND g_hwnd=NULL;
#define SAFTRELEASE(hr) if(hr){hr->Release();hr=NULL;}
#define D3DFVF_D3DVertex (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct Vertex
{
FLOAT x, y, z;
DWORD color;
};
#define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "D3DX"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
#define FULLSCREEN 0
bool InitializeObjects();
bool InitializeD3D();
///--------------------------------------------------------------------------------
// 这段代码,无法显示我画的矩形框,不知道为什么
// 摄像机参数设置不对?
//
//
//
//----------------------------------------------------------------------------------
void RenderScene()
{
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
g_D3DDevice->SetTransform(D3DTS_WORLD,&mat);
g_D3DDevice->BeginScene();
static Vertex ver[4];
ver[0].x = -50;
ver[0].y = 0;
ver[0].z = 50;
ver[0].color = 0xffff0000;
ver[1].x = 50;
ver[1].y = 0;
ver[1].z = 50;
ver[1].color = 0xffff0000;
ver[2].x = -50;
ver[2].y = 0;
ver[2].z = -50;
ver[2].color = 0xffff0000;
ver[3].x = 50;
ver[3].y = 0;
ver[3].z = -50;
ver[3].color = 0xffff0000;
g_D3DDevice->SetFVF(D3DFVF_D3DVertex);
g_D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,ver,sizeof(Vertex));
g_D3DDevice->EndScene();
g_D3DDevice-> resent(NULL, NULL, NULL, NULL);
}
void ShutDown()
{
SAFTRELEASE(g_D3DDevice);
SAFTRELEASE(g_D3D);
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
case WM_CLOSE:
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
WINDOW_CLASS, NULL };
RegisterClassEx(&wc);
// Create the application's window
HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
100, 100, WINDOW_WIDTH, WINDOW_HEIGHT,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Record for global.
g_hwnd = hWnd;
// Initialize Direct3D
if(InitializeD3D())
{
// Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
RenderScene();
}
}
// Release any and all resources.
ShutDown();
// Unregister our window.
UnregisterClass(WINDOW_CLASS, wc.hInstance);
return 0;
}
bool InitializeD3D()
{
D3DDISPLAYMODE displayMode;
D3DPRESENT_PARAMETERS Params;
ZeroMemory(&Params, sizeof(Params));
// Create the D3D object.
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_D3D == NULL) return false;
// Get the desktop display mode.
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
return false;
if(FULLSCREEN)
{
Params.Windowed = FALSE;
Params.BackBufferWidth = WINDOW_WIDTH;
Params.BackBufferHeight = WINDOW_HEIGHT;
}
else
Params.Windowed = TRUE;
Params.SwapEffect = D3DSWAPEFFECT_DISCARD;
Params.BackBufferFormat = displayMode.Format;
Params.BackBufferCount = 1;
Params.EnableAutoDepthStencil = TRUE;
Params.AutoDepthStencilFormat = D3DFMT_D16;
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
&Params, &g_D3DDevice))) return false;
// Initialize any objects we will be displaying.
if(!InitializeObjects()) return false;
return true;
}
bool InitializeObjects()
{
// Set default rendering states.
g_D3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //关闭灯光
g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //关闭拣选
g_D3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //关闭Z缓冲
/////------------------------------------------------------------
//设置视图矩阵
D3DXMatrixPerspectiveFovLH(&g_projection, D3DX_PI/4,
WINDOW_WIDTH/WINDOW_HEIGHT, 0.1f, 1000.0f);
g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_projection);
//---------------------------------------------------------------
//-----------------------------------------------------------
//定义照相机的,采用左手坐标系
D3DXVECTOR3 cameraPos(0.0f, 5.0f,0.0f); //照相机的位置
D3DXVECTOR3 lookAtPos(0.0f, 0.0f, 0.0f); //看的方向
D3DXVECTOR3 upDir(0.0f, 1.0f, 0.0f); //向上的方向
D3DXMatrixIdentity(&g_ViewMatrix);
// Build view matrix.
D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos,
&lookAtPos, &upDir);
//-----------------------------------------------------------------
//手动计算视图矩阵?????
//为什么手动算的和采用D3DXMatrixLookAtLH 获得的矩阵不同呢,难道我算错了???疑问
//以下为手动过程,使用D3DXMatrixLookAtLH和手动算只取一个,因为要对比所以贴出来
//--------------------------------------------------------------------------
D3DXVECTOR3 pos(0.0f,5.0f,0.0f); //摄像机的位置
D3DXMatrixIdentity(&g_ViewMatrix);
g_ViewMatrix._11 = 1.0f; g_ViewMatrix._12 = 0.0f; g_ViewMatrix._13 = 0.0f;
g_ViewMatrix._21 = 0.0f; g_ViewMatrix._22 = 1.0f; g_ViewMatrix._23 = 0.0f;
g_ViewMatrix._31 = 0.0f; g_ViewMatrix._32 = 0.0f; g_ViewMatrix._33 = 0.0f;
D3DXVECTOR3 Right(1.0f,0.0f,0.0f);
D3DXVECTOR3 Up(0.0f,1.0f,0.0f);
D3DXVECTOR3 look(0.0f,0.0f,0.0f);
g_ViewMatrix._41 = - D3DXVec3Dot(&pos,&Right);
g_ViewMatrix._42 = - D3DXVec3Dot(&pos,&Up);
g_ViewMatrix._43 = - D3DXVec3Dot(&pos,&look);
///----------------------------------------------------------------------------
g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix);
return true;
}
|
|