游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1767|回复: 2

关于摄象机镜头的设置问题

[复制链接]

5

主题

8

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2009-8-12 00:30:00 | 显示全部楼层 |阅读模式
我看不到要绘制出来的矩形,不知道照相机的镜头设置是否正确,请高手帮我看看.
本人刚学习,请不要见笑.第一次发贴不知道是否描述清楚了.
以下是全部代码:
#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-&gtresent(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;
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2009-8-12 10:54:00 | 显示全部楼层

Re:关于摄象机镜头的设置问题

如果没猜错,你的camera放在盒子里面了吧= =;
你试试把camera position改成100试试,说不定就能看到了。

另外你手动算camera inverse的过程很是诡异,恕我愚钝,看不懂。

5

主题

8

帖子

30

积分

注册会员

Rank: 2

积分
30
 楼主| 发表于 2009-8-12 23:46:00 | 显示全部楼层

Re:关于摄象机镜头的设置问题

谢谢,这个问题我已经解决了,是我自己搞错了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-15 00:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表