首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

各位大侠。 小弟我想在xz平面画一个三角形。该怎么设置摄像机。和顶点坐标啊试了好多次都不出来。

2012-02-10 
各位大侠。。 我想在xz平面画一个三角形。。该如何设置摄像机。。和顶点坐标啊。。试了好多次都不出来。。。。。这是xy

各位大侠。。 我想在xz平面画一个三角形。。该如何设置摄像机。。和顶点坐标啊。。试了好多次都不出来。。。。。
这是xy平面的三角形 我改成xz的平面的三角形 就看不到了。。。。

C/C++ code
#include <d3d9.h>//-----------------------------------------// Desc: 全局变量//-----------------------------------------LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;    //顶点缓冲区对象//-----------------------------------------// Desc: 顶点结构//-----------------------------------------struct CUSTOMVERTEX{    FLOAT x, y, z, rhw;    DWORD color;};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)  //顶点格式//-----------------------------------------// Desc: 初始化Direct3D//-----------------------------------------HRESULT InitD3D( HWND hWnd ){    //创建Direct3D对象, 该对象用于创建Direct3D设备对象    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )        return E_FAIL;    //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象    D3DPRESENT_PARAMETERS d3dpp;    ZeroMemory( &d3dpp, sizeof(d3dpp) );    d3dpp.Windowed = TRUE;    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    //创建Direct3D设备对象    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                                      &d3dpp, &g_pd3dDevice ) ) )    {        return E_FAIL;    }    return S_OK;}//-----------------------------------------// Desc: 创建并填充顶点缓冲区//-----------------------------------------HRESULT InitVB(){    //顶点数据    CUSTOMVERTEX vertices[] =    {    { 100.0f, 400.0f, 0.5f, 1.0f, 0xffff0000, },        { 300.0f,  50.0f, 0.5f, 1.0f, 0xff00ff00, },         { 500.0f, 400.0f, 0.5f, 1.0f, 0xff0000ff, },    };    //创建顶点缓冲区    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),                                                  0, D3DFVF_CUSTOMVERTEX,                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )    {        return E_FAIL;    }    //填充顶点缓冲区    VOID* pVertices;    if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )        return E_FAIL;    memcpy( pVertices, vertices, sizeof(vertices) );    g_pVB->Unlock();    return S_OK;}//-----------------------------------------// Desc: 释放创建的对象//-----------------------------------------VOID Cleanup(){    //释放顶点缓冲区对象    if( g_pVB != NULL )                g_pVB->Release();    //释放Direct3D设备对象    if( g_pd3dDevice != NULL )         g_pd3dDevice->Release();    //释放Direct3D对象    if( g_pD3D != NULL )               g_pD3D->Release();}//-----------------------------------------// Desc: 渲染图形 //-----------------------------------------VOID Render(){    //清空后台缓冲区    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );    //开始在后台缓冲区绘制图形    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )    {        //在后台缓冲区绘制图形        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );        //结束在后台缓冲区绘制图形        g_pd3dDevice->EndScene();    }    //将在后台缓冲区绘制的图形提交到前台缓冲区显示    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------// Desc: 消息处理//-----------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){    switch( msg )    {    case WM_DESTROY:        Cleanup();        PostQuitMessage( 0 );        return 0;    }    return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------// Desc: 入口函数//-----------------------------------------INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){    //注册窗口类    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,                      "ClassName", NULL };    RegisterClassEx( &wc );    //创建窗口    HWND hWnd = CreateWindow( "ClassName", "顶点缓冲区",                              WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,                              GetDesktopWindow(), NULL, wc.hInstance, NULL );    //初始化Direct3D    if( SUCCEEDED( InitD3D( hWnd ) ) )    {        //创建并填充顶点缓冲区        if( SUCCEEDED( InitVB() ) )        {            //显示窗口            ShowWindow( hWnd, SW_SHOWDEFAULT );            UpdateWindow( hWnd );            //进入消息循环            MSG msg;            ZeroMemory( &msg, sizeof(msg) );            while( msg.message!=WM_QUIT )            {                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )                {                    TranslateMessage(&msg);                    DispatchMessage(&msg);                }                else                {                    Render();  //渲染图形                }            }        }    }    UnregisterClass("ClassName", wc.hInstance);    return 0;} 



[解决办法]
你没有设置模型视图和投影矩阵,
默认是正交投影,z值在0 - 1之间。
[解决办法]
没有设置投影矩阵。
[解决办法]
首先你用的顶点格式是RHW的,也就是顶点坐标是屏幕空间的,这些顶点根本不进行VP变换,无论你怎么改都是一样
其次你的WVP矩阵都没有设置,默认情况应该是 Camera 在(0,0,0)朝向(0,0,1),这样的位置和方向即时你的顶点不是RHW的也看不见,因为面的 Normal 和 Camera 的朝向是垂直的,也就是面在摄像机前是一个片
[解决办法]
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) //顶点格式
去掉RHW 

这个改成
struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
};

在设置坐标的时候不用设RHW了!!
然后写投影矩阵的就好了!

热点排行