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

2019-08-03 11:08

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方法来绘制出。以下是绘制点串行的程序代码。本章前面学过,任何对

IDirect3DDevice7::DrawPrimitive的呼叫都必须落在呼叫IDirect3DDevice7::BeginScene和IDirect3DDevice7::EndScene中间。

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

if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_POINTLIST, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) {

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

您可以将材质和贴图应用在点串行上,但是屏幕上的一个小像素无法适当的表示出贴图或材质。同时请记住,不论这些点距离摄影机有多远,他们的直径都是1个像素。如果想要有更大的点,您需要用小的三角形来表示。当绘制完成后,您可以看到一个像图6-2的场景。

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

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

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

图6-2 绘出的点串行

线串行

您可以用第二种基本形状型态-线串行(line list),来定义一群直线段。您可以用这种型态来定义各种简单的单一线条对象。

要建立一个线串行,只要仿照以下程序片段填入一个顶点数组即可。别忘了线串行中定义的顶点数量必须是大于或等于2的偶数。这个范例就是定义这三种线条的程序:

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

D3DVECTOR v1(-10,10,0); D3DVECTOR v2(-8,-5,0); D3DVECTOR v3(-4,3,0); D3DVECTOR v4(1,-6,0); D3DVECTOR v5(2,-1,0); D3DVECTOR v6(12,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-3的场景。

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

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

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

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

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

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

图6-3 绘出的线串行

如同点串行一样,您可以将材质和贴图应用在线串行上。就好像点的大小只有一个像素一样,线条也是只有一个像素宽。如果您需要绘制较宽的线,或是您希望宽度随线条离摄影机的距离而改变时,您应该改用窄三角形的组合来表示线条。

线条块

您可以用第三种基本形状型态-线条块(line strip)来描述一连串相连的线段。您可以用线条块来建立开放的多边形-换句话说,也就是最后的顶点和第一个顶点间没有用线段来连接的多边形。

您可以像在点和线串行一样地填入某个顶点数组,以建立线条块。以下的程序范例说明了如何填入这个串行:

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

D3DVECTOR v1(-8,-8,0); D3DVECTOR v2(-3,-9,0); D3DVECTOR v3(-1,0,0); D3DVECTOR v4(9,-2,0); D3DVECTOR v5(7,-6,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);

一旦您定义了线条块,您可以用IDirect3DDevice7::DrawPrimitive方法来绘制它,就好像绘制点和线串行时一样。以下这些程序是要绘制线条块,图6-4则是程序产生的线条块结果。

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

if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_LINESTRIP, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) {

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

} . . .

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

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

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

图6-4 绘出的线条块

三角形串行

您可以用第四种基本形状型态-三角形串行(triangle list),来创造独立三角形的串行。别忘了三角形串行所定义的顶点数量必须是3的倍数。您可以利用这种串行来建立由不连接的小块构成的对象。以下是定义了二个三角形的串行的程序:

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

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


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

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

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

马上注册会员

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