游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1937|回复: 5

请教:绘制图形时远端消失的原因?

[复制链接]

5

主题

19

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2006-12-28 00:41:00 | 显示全部楼层 |阅读模式
我在空间中画了100*10*10个立方体,坐标构造如下(使用索引方式):

CUSTOMVERTEX vertices[8*num1*num2*num3];
        for (int i=0; i<num1; i++)
                for (int j=0; j<num2; j++)
                        for (int k=0; k<num3; k++)
                        {
                                CUSTOMVERTEX verticesT[] = //FVF顶点数据
                                {
                                        { 0.0f+i*2, 1.0f+j*2, 0.0f+k*2, D3DCOLOR_XRGB(0,255,0) }, //点A,绿色
                                        { 1.0f+i*2, 1.0f+j*2, 0.0f+k*2, D3DCOLOR_XRGB(255,0,0) }, //点B,红色
                                        { 1.0f+i*2, 1.0f+j*2, 1.0f+k*2, D3DCOLOR_XRGB(0,255,255) }, //点C,浅蓝
                                        { 0.0f+i*2, 1.0f+j*2, 1.0f+k*2, D3DCOLOR_XRGB(255,0,255) }, //点D,粉红
                                        { 0.0f+i*2, 0.0f+j*2, 0.0f+k*2, D3DCOLOR_XRGB(0,255,0) }, //点A,绿色
                                        { 1.0f+i*2, 0.0f+j*2, 0.0f+k*2, D3DCOLOR_XRGB(255,0,0) }, //点B,红色
                                        { 1.0f+i*2, 0.0f+j*2, 1.0f+k*2, D3DCOLOR_XRGB(0,255,255) }, //点C,浅蓝
                                        { 0.0f+i*2, 0.0f+j*2, 1.0f+k*2, D3DCOLOR_XRGB(255,0,255) } //点D,粉红
                                };
                                memcpy(vertices+(i*num2*num3+j*num3+k)*8, verticesT, sizeof(verticesT));
                        };
        WORD indices[36*num1*num2*num3];
        for (int i=0; i<num1*num2*num3; i++)
        {
                int j = i*8;
                WORD indicesT[] = { 0+j, 3+j, 1+j, 1+j, 3+j, 2+j,
                        1+j, 2+j, 5+j, 5+j, 2+j, 6+j,
                        0+j, 1+j, 4+j, 4+j, 1+j, 5+j,
                        3+j, 0+j, 4+j, 3+j, 4+j, 7+j,
                        2+j, 3+j, 6+j, 6+j, 3+j, 7+j,
                        4+j, 5+j, 7+j, 5+j, 6+j, 7+j
                }; //索引序列
                memcpy(indices+i*36, indicesT, sizeof(indicesT));
        }
        //创建顶点缓存区,并获取接口IDirect3DVertexBuffer9的指针
        m_pDevice->CreateVertexBuffer(
                sizeof(vertices), //缓存区尺寸
                0, D3DFVF_CUSTOMVERTEX,
                D3DPOOL_DEFAULT, &m_pVB, NULL );
        //把顶点数据填入顶点缓存区
        void* pVertices;
        m_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );
        memcpy( pVertices, vertices, sizeof(vertices) );
        m_pVB->Unlock();
        //创建索引缓存区,并获取接口LPDIRECT3DINDEXBUFFER9的指针
        m_pDevice->CreateIndexBuffer(
                sizeof(indices), //缓存区尺寸
                0, D3DFMT_INDEX16, //使用16 bit的索引值
                D3DPOOL_DEFAULT, &m_pIB, NULL );
        //把索引值填入索引缓存区
        void *pIndices;
        m_pIB->Lock( 0, sizeof(indices), (void**)&pIndices, 0 );
        memcpy( pIndices, indices, sizeof(indices) );
        m_pIB->Unlock();

然后设置Y轴旋转,和其他的变换,代码如下:

float angle = m_nRotateY * D3DX_PI / 180; //把旋转角换算成弧度
        D3DXMATRIX matWorld;
        //计算世界变换矩阵
        :3DXMatrixRotationY( &matWorld, angle );
        //把世界变换矩阵设置到渲染环境
        m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );
        D3DXVECTOR3 eye( 50.0f, 50.0f, 50.0f ); //观察点
        D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //视线目标点
        D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //上方向
        D3DXMATRIX matView;
        //计算视角变换矩阵
        ::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );
        //把视角变换矩阵设置到渲染环境
        m_pDevice->SetTransform( D3DTS_VIEW, &matView );
        D3DXMATRIXA16 matProj;
        //计算透视投影变换矩阵
        ::D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
        //把投影变换矩阵设置到渲染环境
        m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );

当前的问题,在旋转到某一角度的时候,远端的立方体会消失(如图),请问可能的原因,谢谢
sf_2006122804112.jpg

5

主题

19

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2006-12-28 00:49:00 | 显示全部楼层

D3D对象的构建代码

        //创建Direct3D对象,并获取接口IDirect3D9的指针,
        //我们将通过该指针操作Direct3D对象。
        m_pD3D = :irect3DCreate9(D3D_SDK_VERSION);
        D3DPRESENT_PARAMETERS d3dpp;
        ::ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = TRUE; //创建窗口模式的Direct3D程序
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //生成16 bit的Z缓存
        //调用方法IDirect3D9::CreateDevice创建设备对象,并获取
        //接口IDirect3DDevice9的指针,我们将通过该指针操作设备对象
        m_pD3D->CreateDevice(
                D3DADAPTER_DEFAULT, //使用缺省的显卡
                D3DDEVTYPE_HAL, //指定设备类型为HAL
                m_hWnd, //Direct3D窗口的句柄
                D3DCREATE_SOFTWARE_VERTEXPROCESSING,//软件顶点处理
                &d3dpp, &m_pDevice);
        //因为使用顶点颜色渲染,所以要禁用光照处理
        m_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
        //关闭“挑选”功能,允许渲染背面
        //        m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
        //启用Z缓存,允许消隐处理
        m_pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2006-12-28 09:00:00 | 显示全部楼层

Re:请教:绘制图形时远端消失的原因?

不就是远裁减面裁掉了吗?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-12-28 12:48:00 | 显示全部楼层

Re:请教:绘制图形时远端消失的原因?

//计算透视投影变换矩阵
:3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100000.0f );

5

主题

19

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2006-12-28 17:09:00 | 显示全部楼层

Re:请教:绘制图形时远端消失的原因?

非常感谢,我才接触D3D几天,数学知识又不是很牢靠,所以很多最最基本的问题都不知道,希望大家见谅,能够帮助我。
谢谢!

4

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2007-1-4 16:38:00 | 显示全部楼层

Re:请教:绘制图形时远端消失的原因?

..............4楼真直接。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 04:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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