关于C++和DX9的总结(2):索引三角形的正确编码;灯光和材质;鼠标拾取正确写法;“link错误2005:YY already defined in XX.obj” 的解决方法

题目写的太简短不能起到概括文章的作用。

网上充斥着大量的不负责任的复制粘贴,还有著名的翁云兵的3D程序入门小的错误,导致了很多人在DX开发中不得不花更多的时间。

1。索引三角形:

函数: DrawIndexedPrimitive(D3DPRIMITIVETYPE type,,INT initvertexID,UINTMinIndex,,UINT NumVertices, UINTStartIndex, UINTPrimitiveCount)

use: DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 24*index, 0, 0, 0, 12);//这里画的是12个三角形构成的长方体,为了画出光照效果,把每个点裂成3个向量点:3*8=24

解释:typeD3DPT_TRIANGLELIST 

           initvertexID:顶点在定点缓存中存放的起始位置。而索引缓存中存着的是相对这个位置的偏移。

例如:索引是:

(补充:切记dx中的正交判断和线性代数中的是相反的,是左手判定。。求两个向量叉积的方向也是左手判定,为了保证一致性!)

//front side

indices[0]  =2; indices[1]  = 1; indices[2]  = 0;
indices[3]  = 0; indices[4]  = 3; indices[5]  = 2;


// back side
indices[6]  = 4; indices[7]  = 5; indices[8]  = 6;
indices[9]  = 4; indices[10] = 6; indices[11] = 7;


// left side
indices[12] = 8; indices[13] = 9; indices[14] = 10;
indices[15] = 10; indices[16] = 11; indices[17] = 8;


// right side
indices[18] = 14; indices[19] = 13; indices[20] = 12;
indices[21] = 14; indices[22] = 12; indices[23] = 15;


// top
indices[24] = 18; indices[25] = 16; indices[26] = 17;
indices[27] = 18; indices[28] = 19; indices[29] = 16;


// bottom
indices[30] = 20; indices[31] = 22; indices[32] = 21;
indices[33] = 20; indices[34] = 23; indices[35] = 22;


解释:例子中indices[0]  =2中的2就是说这个索引指向顶点缓存 initvertexID+2的那个顶点。

 MinIndex:相对于 initvertexID继续偏移:上例:indices[0]  =2;中的2就是说这个索引指向定点缓存 initvertexID+MinIndex+2的那个顶点。之所以要这么设计是为了对一个顶点缓存做更高效的利用。有效地减少顶点缓存的大小。设想把空间中所有的顶点都放到顶点缓存中,可以用一个DrawIndexedPrimitive语句。在两个循环中画出很多位置不同的等间隔的或者等二阶间隔的物体:因为有两个可以控制位置的量,所以可以控制到2阶。

NumVertices这个量并没有发现有什么用,设成多少都无所谓。应该是系统用来优化的选项。

StartIndex:在index缓存中第一个三角形的第一个顶点的下标。

PrimitiveCount:图元(这里是三角形)的个数

 

2。灯光和材质:如果要想在光照下显示颜色,必须加入材质,材质是在渲染时设置的:Device->SetMaterial(&material);

3。鼠标的拾取在翁云兵的3D程序入门中有着错误的实现:需要修改其中的一段代码如下:

CalcPickingRay(int x, int y)
{
float px = 0.0f;
float py = 0.0f;
//需要获取当前窗口大小
D3DVIEWPORT9 vp;//新加
m_lpDevice->GetViewport(&vp);
GetClientRect(m_hWnd,&rect);//新加
vp.Height=rect.bottom;//新加
vp.Width=rect.right;//新加


D3DXMATRIX proj;
m_lpDevice->GetTransform(D3DTS_PROJECTION, &proj);


px = ((( 2.0f*x) / vp.Width)  - 1.0f) / proj(0, 0);
py = (((-2.0f*y) / vp.Height) + 1.0f) / proj(1, 1);


Ray ray;
ray._origin    = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
ray._direction = D3DXVECTOR3(px, py, 1.0f);


return ray;
}

至于为什么。需要很好的理解变化的原理,而这部分相信没几个人回去认真看。我简单地说一下,所谓的viewspot就像显示器的分辨率。分辨率的大小就是取景器的大小(如 1024*768....)。所以要设置成改变后窗口的大小。是用户区,这样鼠标拾取就很精确了。网上很多人遇到这个问题,但没有人说出解决方法。

4。“link错误2005:YY already defined in XX.obj” 的解决方法:

这个问题大家经常遇到。我写下来提醒自己不要忘记:不要在头文件中定义函数,定义变量,这都是违法的。只能声明,这么基础的问题不要再犯2了。。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值