📄 prender.cpp
字号:
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 + -