⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prender.cpp

📁 这是我做的一个VC++小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			else
			{
				FLOATCOLORRGBA rgba = pObj->m_eList[i].m_clr;
				byR = (BYTE)(rgba.red * 255.0f);
				byG = (BYTE)(rgba.green * 255.0f);
				byB = (BYTE)(rgba.blue * 255.0f); 
			}

			//设置笔
			CPen pen(PS_SOLID,  1,  RGB(byR, byG, byB));
			CPen* oldPen = pDC->SelectObject(&pen);
			
			//绘制直线
			pDC->MoveTo(pPtOnScrn[n1]);
			pDC->LineTo(pPtOnScrn[n2]);

			//选择原来的设备属性
			pDC->SelectObject(oldPen);
			pen.DeleteObject();
			
		}//end if
		
		/*
		else
		{
			//比如, 绘制虚线, 
		} //end else */

	}//end for
}

//绘制渐变色线框模型, 采用Gouraud线性插值
//pDC---------设备描述表;
//pObj---------三维物体对象
//pPtOnScrn---最终透视到屏幕上的点
void CPRender::GouraudWirize(CDC* pDC,  CObject3d* pObj,  POINT* pPtOnScrn)
{
	//物体边数
	int nNumEdge = pObj->GetEdgeListSize();
	
	//绘制工具:直线基元
	CPLine pl;
	//绘制单色模型
	for(int i = 0; i < nNumEdge; i++)
	{
		//绘制边----单色线框模型
		if(pObj->m_eList[i].m_bVisibility)
		{
			//获取边的顶点索引
			int n1 = pObj->m_eList[i].m_nStart;
			int n2 = pObj->m_eList[i].m_nEnd;
	
			//获取两顶点的浮点颜色
			FLOATCOLORRGBA rgba1 = pObj->m_vList[n1].m_clr;
			FLOATCOLORRGBA rgba2 = pObj->m_vList[n2].m_clr;
			
			FLOATCOLORRGB rgb1 = {rgba1.red,  rgba1.green,  rgba1.blue};
			FLOATCOLORRGB rgb2 = {rgba2.red,  rgba2.green,  rgba2.blue};

			//绘制
			pl.Draw(pDC,  pPtOnScrn[n1],  pPtOnScrn[n2],  rgb1,  rgb2);
		}//end if
		
		/*
		else
		{
			//比如, 绘制虚线, 
		} //end else */

	}//end for
}

//绘制实体刻面模型
//pDC---------设备描述表;
//pObj---------三维物体对象
//pPtOnScrn---最终透视到屏幕上的点
void CPRender::Flat(CDC* pDC,  CObject3d* pObj,  POINT* pPtOnScrn)
{
	//物体小面个数
	int nNumFacet = pObj->GetFacetListSize();
	
	//面绘制工具: 三角形基元
	CPTriangle pt;

	//由顶点决定小面的颜色, 还是由外部决定小面的颜色
	BOOL bAutoColor = pObj->GetAutoColorProperty();

	//绘制, 面循环
	for(int i = 0; i < nNumFacet; i++)
	{
		//如果可见
		if(pObj->m_sList[i].m_bVisibility)
		{
			//获取小面的顶点数
			int nNumVertex = pObj->m_sList[i].m_avIndex.GetSize();
			if(nNumVertex == 3)
			{
				//获取顶点索引号
				int n1 = pObj->m_sList[i].m_avIndex[0];
				int n2 = pObj->m_sList[i].m_avIndex[1];
				int n3 = pObj->m_sList[i].m_avIndex[2];

				//小面颜色
				BYTE byR,  byG,  byB;
		
				//获取顶点颜色
				if(bAutoColor)
				{
					//一般地, 采用第一个顶点的颜色来表示小面的颜色
					//这对模型的顶点安排要求比较高
					//因而, 我们采用三个顶点颜色的平均值来表示小面的颜色
					//在光照条件下, 这样处理也是可以接受的
					FLOATCOLORRGBA rgba1 = pObj->m_vList[n1].m_clr;
					FLOATCOLORRGBA rgba2 = pObj->m_vList[n2].m_clr;
					FLOATCOLORRGBA rgba3 = pObj->m_vList[n3].m_clr;

					//顶点颜色归一化应该在外部进行(85 * 3 = 255)
					byR = (BYTE)((rgba1.red + rgba2.red + rgba3.red) * 85.0f);
					byG = (BYTE)((rgba1.green + rgba2.green + rgba3.green) * 85.0f);
					byB = (BYTE)((rgba1.blue + rgba2.blue +  rgba3.blue) * 85.0f);
				}
				//获取小面颜色
				else
				{
					FLOATCOLORRGBA rgba = pObj->m_sList[i].m_clr;
					byR = (BYTE)(rgba.red * 255.0f);
					byG = (BYTE)(rgba.green * 255.0f);
					byB = (BYTE)(rgba.blue * 255.0f); 
				}

				CPen   pen(PS_SOLID,  1,  RGB(byR,  byG,  byB));
				CBrush brush(RGB(byR,  byG,  byB));
				//绘制
				pt.Fill(pDC,  pPtOnScrn[n1],  pPtOnScrn[n2],  pPtOnScrn[n3],  pen,  brush);
				pen.DeleteObject();
				brush.DeleteObject();
			}//end if (nNumVertex == 3)
			else if(nNumVertex == 4)
			{
				//获取顶点索引号
				int n1 = pObj->m_sList[i].m_avIndex[0];
				int n2 = pObj->m_sList[i].m_avIndex[1];
				int n3 = pObj->m_sList[i].m_avIndex[2];
				int n4 = pObj->m_sList[i].m_avIndex[3];

				//小面颜色
				BYTE byR,  byG,  byB;
		
				//获取顶点颜色
				if(bAutoColor)
				{
					//一般地, 采用第一个顶点的颜色来表示小面的颜色
					//这对模型的顶点安排要求比较高
					//因而, 我们采用三个顶点颜色的平均值来表示小面的颜色
					//在光照条件下, 这样处理也是可以接受的
					FLOATCOLORRGBA rgba1 = pObj->m_vList[n1].m_clr;
					FLOATCOLORRGBA rgba2 = pObj->m_vList[n2].m_clr;
					FLOATCOLORRGBA rgba3 = pObj->m_vList[n3].m_clr;
					FLOATCOLORRGBA rgba4 = pObj->m_vList[n4].m_clr;

					//顶点颜色归一化应该在外部进行(63.75 * 4 = 255)
					byR = (BYTE)((rgba1.red + rgba2.red + rgba3.red + rgba4.red) * 63.75f);
					byG = (BYTE)((rgba1.green + rgba2.green + rgba3.green + rgba4.green) * 63.75f);
					byB = (BYTE)((rgba1.blue + rgba2.blue + rgba3.blue + rgba4.blue) * 63.75f);
				}
				//获取小面颜色
				else
				{
					FLOATCOLORRGBA rgba = pObj->m_sList[i].m_clr;
					byR = (BYTE)(rgba.red * 255.0f);
					byG = (BYTE)(rgba.green * 255.0f);
					byB = (BYTE)(rgba.blue * 255.0f); 
				}

				CPen   pen(PS_SOLID,  1,  RGB(byR,  byG,  byB));
				CBrush brush(RGB(byR,  byG,  byB));
				
				//细化四边形, 并完成绘制
				pt.Fill(pDC,  pPtOnScrn[n1],  pPtOnScrn[n2],  pPtOnScrn[n3],  pen,  brush);
				pt.Fill(pDC,  pPtOnScrn[n1],  pPtOnScrn[n3],  pPtOnScrn[n4],  pen,  brush);
				pen.DeleteObject();
				brush.DeleteObject();

			}//end if (nNumVertex == 4)
			
			/*
			//边数大于4
			else
			{
				//请采用CDC 的 Polygon()函数进行绘制.
			}*/
		}//end if(pObj->m_sList[i].m_bVisibility)
	}//end for

}

//绘制实体Gouraud光滑明暗模型
//pDC---------设备描述表;
//pObj---------三维物体对象
//pPtOnScrn---最终透视到屏幕上的点
void CPRender::Gouraud(CDC* pDC,  CObject3d* pObj,  POINT* pPtOnScrn)
{
	//物体小面个数
	int nNumFacet = pObj->GetFacetListSize();
	
	//面绘制工具: 三角形基元
	CPTriangle pt;

	//绘制, 面循环
	for(int i = 0; i < nNumFacet; i++)
	{
		//如果可见
		if(pObj->m_sList[i].m_bVisibility)
		{
			//获取小面的顶点数
			int nNumVertex = pObj->m_sList[i].m_avIndex.GetSize();
			if(nNumVertex == 3)
			{
				//获取顶点索引号
				int n1 = pObj->m_sList[i].m_avIndex[0];
				int n2 = pObj->m_sList[i].m_avIndex[1];
				int n3 = pObj->m_sList[i].m_avIndex[2];

				//获取顶点颜色
				FLOATCOLORRGBA rgba1 = pObj->m_vList[n1].m_clr;
				FLOATCOLORRGBA rgba2 = pObj->m_vList[n2].m_clr;
				FLOATCOLORRGBA rgba3 = pObj->m_vList[n3].m_clr;

				//去掉alpha透明性
				FLOATCOLORRGB rgb1 = {rgba1.red,  rgba1.green,  rgba1.blue};
				FLOATCOLORRGB rgb2 = {rgba2.red,  rgba2.green,  rgba2.blue};
				FLOATCOLORRGB rgb3 = {rgba3.red,  rgba3.green,  rgba3.blue};

				//绘制
				pt.Gouraud(pDC,  pPtOnScrn[n1],  pPtOnScrn[n2],  pPtOnScrn[n3],  rgb1,  rgb2,  rgb3);

			}//end if (nNumVertex == 3)
			else if(nNumVertex == 4)
			{
				//获取顶点索引号
				int n1 = pObj->m_sList[i].m_avIndex[0];
				int n2 = pObj->m_sList[i].m_avIndex[1];
				int n3 = pObj->m_sList[i].m_avIndex[2];
				int n4 = pObj->m_sList[i].m_avIndex[3];

				//获取顶点颜色
				//获取顶点颜色
				FLOATCOLORRGBA rgba1 = pObj->m_vList[n1].m_clr;
				FLOATCOLORRGBA rgba2 = pObj->m_vList[n2].m_clr;
				FLOATCOLORRGBA rgba3 = pObj->m_vList[n3].m_clr;
				FLOATCOLORRGBA rgba4 = pObj->m_vList[n4].m_clr;

				//去掉alpha透明性
				FLOATCOLORRGB rgb1 = {rgba1.red,  rgba1.green,  rgba1.blue};
				FLOATCOLORRGB rgb2 = {rgba2.red,  rgba2.green,  rgba2.blue};
				FLOATCOLORRGB rgb3 = {rgba3.red,  rgba3.green,  rgba3.blue};
				FLOATCOLORRGB rgb4 = {rgba4.red,  rgba4.green,  rgba4.blue};
				
				//细化四边形, 并完成绘制
				pt.Gouraud(pDC,  pPtOnScrn[n1],  pPtOnScrn[n2],  pPtOnScrn[n3],  rgb1,  rgb2,  rgb3);
				pt.Gouraud(pDC,  pPtOnScrn[n1],  pPtOnScrn[n3],  pPtOnScrn[n4],  rgb1,  rgb3,  rgb4);

			}//end if (nNumVertex == 4)

			/*
			//边数大于4
			else
			{
				//请将多边形细化为三角形, 请自行处理
			}*/
		}//	end	if(pObj->m_sList[i].m_bVisibility)
		
	}//end for
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -