题目写的太简短不能起到概括文章的作用。
网上充斥着大量的不负责任的复制粘贴,还有著名的翁云兵的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
解释:type:D3DPT_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了。。