6.绘制 3D基本形状(4)

2019-08-03 11:08

D3DVECTOR vNormal(0,0,-1);

lpVertices [0] ==D3DVERTEX(v1,vNormal,0,0); lpVertices [1] ==D3DVERTEX(v2,vNormal,0,0); lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0); lpVertices [5] ==D3DVERTEX(v6,vNormal,0,0);

像其它的基本形状一样,您可以用IDirect3DDevice7::DrawPrimitive方法来绘制三角形串行。以下的程序范例说明了如何绘制一个三角形串行。图6-5则是其结果。

if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .

//如果有错误时,在此处理。

if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) { } . . .

if (FAILED(lpDirect3DDevice7->EndScene())) { }

//如果有错误时,在此处理。

//如果有错误时,在此处理。

图6-5 绘出的三角形串行

三角形条

您可以用第五种基本形状型态-三角形条(triangle strip),来创造一连串的相连的三角形。当你使用相连接的三角形时,程序必须一次指定共享的顶点。举例来说,图6-6中的三角形条只需要定义6个顶点即可,但它是由四个三角形所组成的。

图6-6 三角形条

如图6-6所示,前三个三角形共享了v3,有二个三角形共享v4,依此类推等等。Direct3D的默认值会排除依逆时针顺序定义的三角形。因此Direct3D在绘制三角形条会不依顺序读入条块中偶数三角形的顶点。如果要绘制如图6-6的三角形条,Direct3D要依以下方式来读入顶点串行中的顶点:先是第一个三角形的v1、v2、v3;第二个三角形是v2、v4、v3;第三个三角形是v3、v4、v5;第四个三角形是v4、v6、v5,依此类推。这样做会使条块中面对摄影机的面会被看到,而背面则被排除。

三角形条块可以有效利用内存和处理时间,所以尽可能地多加以运用。以下的程序段会填入一个顶点数组,以产生如图6-6的三角形条,就像针对其它基本形状的作法一样:

const DWORD TOTAL_VERTICES=6;

D3DVERTEX lpVertices [TOTAL_VERTICES]; . .

D3DVECTOR v1(-10,-5,0); D3DVECTOR v2(-5,7,0); D3DVECTOR v3(0,-1,0); D3DVECTOR v4(6,4,0); D3DVECTOR v5(11,-7,0);

D3DVECTOR v6(9,9,0); D3DVECTOR vNormal(0,0,-1);

lpVertices [0] ==D3DVERTEX(v1,vNormal,0,0); lpVertices [1] ==D3DVERTEX(v2,vNormal,0,0); lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0); lpVertices [5] ==D3DVERTEX(v6,vNormal,0,0);

下一个程序片段说明了如何用IDirect3DDevice7::DrawPrimitive方法来绘制一个三角形条,就像对其他的基本形状一样。图6-7呈现了绘制出的条。

if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .

if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) { } . . . { }

//如果有错误时,在此处理。

//如果有错误时,在此处理。 //如果有错误时,在此处理。

if (FAILED(lpDirect3DDevice7->EndScene()))

图6-7 绘出的三角形条

三角形扇

第六种基本形状型态-三角形扇(triangle fan),有点像三角形条。差别在于这里的所有三角形会共享同一个顶点,如图6-8所示:

图6-8 三角形扇

以下是填入一个定义三角形扇的数组的程序范例:

const DWORD TOTAL_VERTICES =6; D3DVERTEX lpVertices [TOTAL_VERTICES]; . . .

D3DVECTOR v1(-3,0,0); D3DVECTOR v2(1,4,0); D3DVECTOR v3(1.5,3,0); D3DVECTOR v4(2,1,0); D3DVECTOR v5(2,-1,0); D3DVECTOR v6(1.5,-3,0); D3DVECTOR v7(1,-4,0); D3DVECTOR vNormal(0,0,-1);

lpVertices [0] ==D3DVERTEX(v1,vNormal,0,0);

lpVertices [1] ==D3DVERTEX(v2,vNormal,0,0); lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0); lpVertices [5] ==D3DVERTEX(v6,vNormal,0,0); lpVertices [6] ==D3DVERTEX(v7,vNormal,0,0);

以下的程序会用您曾经用过的IDirect3DDevice3::DrawPrimitive方法来绘制三角形扇,并指定D3DPT_TRIANGLEFAN作为第一个参数。图6-9显示了绘出的三角形扇。

if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .

if (FAILED(lpDirect3DDevice3->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) { } . . .

if (FAILED(lpDirect3DDevice7->EndScene())) { }

//如果有错误时,在此处理。

//如果有错误时,在此处理。

//如果有错误时,在此处理。


6.绘制 3D基本形状(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《经济法学》练习题库及答案详解

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: