游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3042|回复: 3

问一个DX9的顶点坐标和摄像机坐标的问题。。

[复制链接]

9

主题

26

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2012-7-19 22:50:00 | 显示全部楼层 |阅读模式
本人DX9的初学者,之前都是照着书抄的代码,然后为了试着深入学习,所以写了一个简单的框架,想自己不看书写代码看看效果,框架没有问题。最近写了一个简单的贴图程序,顶点坐标和摄像机坐标都是先照着书上的写的,程序能得到我想要的效果,但之后我稍微改了一下顶点坐标和摄像机坐标后就发现什么也没有了。

下面是主要的问题代码,请大大们帮忙看看问题出在哪儿:
int WINAPI WinMain(HINSTANCE hInstance,
                                   HINSTANCE prevInstance,
                                   PSTR cmdLine,
                                   int showCmd)
{
        CMainD3D d3d(hInstance, showCmd, WIDTH, HEIGHT);

        //////////////////////////////SETUP////////////////////////////////
       
        d3d.CreateVertexBuffer(6*VERTEXSIZE, VERTEXFVF);
        SVertex* v;
        d3d.LockVertexBuffer((void**)&v);
        // 书上的顶点坐标 fvf = xyz | normal | tex1
        v[0] = SVertex(-5.0f, 5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
        v[1] = SVertex(5.0f, 5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
        v[2] = SVertex(5.0f, -5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

        v[3] = v[2];
        v[4] = SVertex(-5.0f, -5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[5] = v[0];
        d3d.UnlockVertexBuffer();

        using namespace nsColorSet;
        d3d.SetDirectLight(ColorWhite*0.5f, ColorWhite, ColorWhite*0.3f, D3DXVECTOR3(0.0f, 0.0f, 1.0f));
        d3d.GetDevice()->LightEnable(0, true);

        // 书上的摄像机坐标 从(0,0,-6)看向(0,0,0)
        d3d.SetCamera(D3DXVECTOR3(0.0f, 0.0f, -6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DX_PI*0.5f, float(WIDTH/HEIGHT));
        d3d.SetTexture("CD.jpg");
        d3d.GetDevice()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        d3d.SetMaterial(ColorWhite, ColorWhite, ColorWhite, ColorBlack, 2.0f);
       
        /////////////////////////////STARTUP//////////////////////////////

        float fStart = (float)::GetTickCount();
        return d3d.StartProc(&fStart);
}

运行结果正常:一个带纹理的正方形在屏幕中央

之后稍微改了下顶点坐标,灯光方向和摄像机坐标后的代码:
int WINAPI WinMain(HINSTANCE hInstance,
                                   HINSTANCE prevInstance,
                                   PSTR cmdLine,
                                   int showCmd)
{
        CMainD3D d3d(hInstance, showCmd, WIDTH, HEIGHT);

        //////////////////////////////SETUP////////////////////////////////
       
        d3d.CreateVertexBuffer(6*VERTEXSIZE, VERTEXFVF);
        SVertex* v;
        d3d.LockVertexBuffer((void**)&v);
        // 之前正方形垂直于z=3,现在垂直于z=-3,法向量反向
        v[0] = SVertex(-5.0f, 5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
        v[1] = SVertex(5.0f, 5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
        v[2] = SVertex(5.0f, -5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);

        v[3] = v[2];
        v[4] = SVertex(-5.0f, -5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f);
        v[5] = v[0];
        d3d.UnlockVertexBuffer();

        using namespace nsColorSet;
        // 灯光反向
        d3d.SetDirectLight(ColorWhite*0.5f, ColorWhite, ColorWhite*0.3f, D3DXVECTOR3(0.0f, 0.0f, -1.0f));
        d3d.GetDevice()->LightEnable(0, true);

        // 摄像机从(0,0,6)看向(0,0,0)
        d3d.SetCamera(D3DXVECTOR3(0.0f, 0.0f, 6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DX_PI*0.5f, float(WIDTH/HEIGHT));
        d3d.SetTexture("CD.jpg");
        d3d.GetDevice()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        d3d.SetMaterial(ColorWhite, ColorWhite, ColorWhite, ColorBlack, 2.0f);
       
        /////////////////////////////STARTUP//////////////////////////////

        float fStart = (float)::GetTickCount();
        return d3d.StartProc(&fStart);
}

运行效果:屏幕上什么也没有。

这没有道理啊,如果是把整个系统都画在纸上完全符合逻辑。请问这问题到底出在哪里,小弟不胜感谢。。

PS:附上工程文件,平台是vs.net 2003,设置了dx包含文件目录为系统目录,并且工程默认链接d3d9.lib d3dx9.lib winmm.lib

11

主题

95

帖子

658

积分

高级会员

Rank: 4

积分
658
发表于 2012-7-20 15:07:00 | 显示全部楼层

Re:问一个DX9的顶点坐标和摄像机坐标的问题。。

// 摄像机从(0,0,6)看向(0,0,0)
d3d.SetCamera(D3DXVECTOR3(0.0f, 0.0f, 6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DX_PI*0.5f, float(WIDTH/HEIGHT));


这一句有问题吧? 面法线和视线方向相同,自然看不见了!应该要想上面一样弄成-6.0f处。  涉及背面消除!   一般顶点排列顺序是以相机为参照的。你要把你自己放在相机上排列顶点!而且面法线不是由顶点法线决定的,它是由你的定点的环绕顺序决定的!DX默认是顺时针环绕,用左右大拇指的方向即是面法线。顶点法线只是为了光照处理而已! 不过,你这里也可以设置顶点顺序为逆时针或设置背面不消隐即可!

9

主题

26

帖子

62

积分

注册会员

Rank: 2

积分
62
 楼主| 发表于 2012-7-21 22:40:00 | 显示全部楼层

Re:问一个DX9的顶点坐标和摄像机坐标的问题。。

嗯,太棒了,感谢2楼的朋友,又长知识了。。

9

主题

26

帖子

62

积分

注册会员

Rank: 2

积分
62
 楼主| 发表于 2012-7-21 23:05:00 | 显示全部楼层

Re:问一个DX9的顶点坐标和摄像机坐标的问题。。

我想再问一下,怎么设置顶点顺序为逆时针和背面不消隐?是不是在SetRenderState里面设置?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-27 23:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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