¡¡¡¡ÒýÑÔ
¡¡¡¡ÔÚÉÏһƪÎÄÕÂÖÐÒѾʵÏÖÁ˶ÔÊý×ָ߳ÌÄ£ÐÍ£¨DEM£©µÄÎļþ´´½¨ÓëÊý¾Ý¶ÁÈ¡¡£±¾ÎĽ«¸ù¾ÝÒѾ¶ÁÈ¡µÄDEMÊý¾ÝÍê³É½¨Ä£¼°¶Ô³¡¾°µÄ»æÖÆäÖȾ¡£Ö÷ÒªµÄÉè¼Æ²½ÖèΪ£ºÊ×ÏÈͨ¹ý¼ÆËã»ñÈ¡·¨ÏßÏòÁ¿£¬È»ºó¶ÔµØ¾°µÄ²ÄÖʽøÐж¨Òå²¢³õʼ»¯µØ¾°ÁÐ±í£¬×îºó¶ÔµØ¾°µÄ²»Í¬½¨Ä£·½Ê½½øÐнéÉÜ¡£
¡¡¡¡·¨ÏßÏòÁ¿µÄ¼ÆËã
¡¡¡¡±¾ÏµÍ³µÄʵÏÖÄ¿±êÊÇͨ¹ý¼ÆËã»úÕæÊµµÄÔÙÏÖÖ¸¶¨ÕæÊµ³¡¾°µÄÊÓ¾õЧ¹û¡£ÕâÏÔȻҪ¿¼Âǵ½¹âÕÕµÄÓ°Ï죬¶øÒ»°ãµÄ³¡¾°Í¨³£¶¼ÊÇ´æÔÚ²»Í¬³Ì¶ÈµÄÆð·ü£¬Í¨¹ý³éÈ¡³öÀ´µÄDEMÍø¸ñÊý¾Ý±íÏÖΪ´óÁ¿²»Í¬³¯ÏòµÄÐ¡Íø¸ñÆ½Ãæ¡£ÓÉÓÚÕâÐ©Íø¸ñÆ½ÃæµÄ³¯Ïò²»Í¬£¬µ±Í¬Ò»¹âÔ´·¢³öµÄ¹âÏßÕÕµ½³¡¾°ÉÏʱ£¬·´Éä³öÀ´µÄ¹âÏß½«·´Éäµ½ËÄÃæ°Ë·½¡£·ÂÕæµÄÒ»¸öÖØÒªË¼Ïë¾ÍÊÇÔÚËã·¨ÖÐÓ¦ÓÃÕæÊµÊÀ½çÖп͹۴æÔÚµÄÎïÀí¶¨ÂÉ¡¢ÏÖÏóÒÔ¼°¹æÂɵȡ£Ö»ÓÐÕâÑù£¬²ÅÄÜÖÆ×÷³öÓë±ÆÕæµÄЧ¹û¡£ÎªÁËÃèÊö¹âÏߵķ´Éä·½Ïò£¬±ØÐëÊ×ÏÈÈ·¶¨¸÷Íø¸ñÆ½ÃæµÄ·¨Ïß·½Ïò£¬ÔÚ³ÌÐòʵÏÖÖÐͨ¹ý·¨ÏßÏòÁ¿À´±íʾ£º
int x[2], y[2], z[2];
m_pNormals = new float [3 * m_nSumPointOfDem];
float normal[3], rate;
for (int i = 0; i < m_nDemY - 1; i ) {
¡¡for (int j = 0; j < m_nDemX - 1; j ) {
¡¡¡¡x[0] = m_pDemX[(i 1) * m_nDemX j] - m_pDemX[i * m_nDemX j];
¡¡¡¡x[1] = m_pDemX[i * m_nDemX (j 1)] - m_pDemX[i * m_nDemX j];
¡¡¡¡y[0] = m_pDemY[(i 1) * m_nDemX j] - m_pDemY[i * m_nDemX j];
¡¡¡¡y[1] = m_pDemY[i * m_nDemX (j 1)] - m_pDemY[i * m_nDemX j];
¡¡¡¡z[0] = m_pDemH[(i 1) * m_nDemX j] - m_pDemH[i * m_nDemX j];
¡¡¡¡z[1] = m_pDemH[i * m_nDemX (j 1)] - m_pDemH[i * m_nDemX j];
¡¡¡¡normal[0] = (float)(y[1] * z[0] - z[1] * y[0]);
¡¡¡¡normal[1] = (float)(z[1] * x[0] - x[1] * z[0]);
¡¡¡¡normal[2] = (float)(x[1] * y[0] - y[1] * x[0]);
¡¡¡¡rate = (float)sqrt(normal[0] * normal[0] normal[1] * normal[1] normal[2] * normal[2]);
¡¡¡¡normal[0] /= rate;
¡¡¡¡normal[1] /= rate;
¡¡¡¡normal[2] /= rate;
¡¡¡¡m_pNormals[(i * m_nDemX j) * 3 0] = normal[0];
¡¡¡¡m_pNormals[(i * m_nDemX j) * 3 1] = normal[1];
¡¡¡¡m_pNormals[(i * m_nDemX j) * 3 2] = normal[2];
¡¡}¡¡
}
¡¡¡¡Õâ¶Î´úÂëÔÚGetVertexNormal()º¯ÊýÖÐʵÏÖ£¬ÔÚ¶ÁÈ¡ÍêDEMÊý¾Ýºó¼´±»Ö´ÐС£¾ßÌåµÄ¼ÆËã¹ý³Ì´¿ÊôÒ»°ãµÄÊýѧ¼ÆË㣬ÔÚÉÏһƪÎÄÕÂÖÐÒѾ½«Íø¸ñ¸÷½ÚµãµÄÈýÎ¬×ø±ê´æ·ÅÔÚm_pDemX¡¢m_pDemYºÍm_pDemHÖ¸ÏòµÄ»º³åÇøÖС£ÕâÀïÒÀ´Î¶Ô×é³ÉÍø¸ñÆ½ÃæµÄÈ«²¿Íø¸ñµ¥Ôª½øÐÐö¾Ù£¬²¢¼ÆËãÓɸñÍøµã£¨i,j£©Ëù×é³ÉµÄ¾ØÐθñÍøÉϵÄÏòÁ¿(X0,Y0,Z0)¡¢ÏòÁ¿(X1,Y1,Z1)£¬ÒÔ±ãÀûÓöþÕßÀ´ÇóÈ¡¶¥µã£¨i,j£©µÄ·¨ÏòÁ¿¡£Ö®ºó£¬Í¨¹ýÇóÁ½¸öÏòÁ¿µÄ²æ»ý(X1,Y1,Z1)X(X0,Y0,Z0)È·¶¨³ö¶¥µã£¨i,j£©µÄ·¨ÏòÁ¿£¬²¢½«Æäx¡¢y¡¢z·ÖÁ¿±£´æµ½normal[0]¡¢normal[1]ºÍnormal[2]ÖУ¬¸Ã¼ÆËã½á¹û²¢²»ÄÜÖ±½ÓÔÚOpenGLÖÐʹÓã¬ÐèÒª×ö½øÒ»²½µÄ´¦Àí£¬½«·¨ÏòÁ¿µ¥Î»±ê×¼»¯£¬È»ºó°´ÕÕx¡¢y¡¢z·ÖÁ¿µÄ´ÎÐò½«¼ÆËã½á¹ûÒÀ´Î±£´æµ½m_pNormalsËùÖ¸ÏòµÄ»º³åÇøÖб¸Óá£
¡¡¡¡¶¨Òå²ÄÖÊ
¡¡¡¡¶¨ÒåÁË·¨ÏßÏòÁ¿½ö½öÄܹ»¿ØÖƹâÏߵķ´Éä·½Ïò£¬¶øÕæÊµ³¡¾°³ýÁË´æÔÚµØÐÎµÄÆð·üÍ⣬²ÄÖʵIJ»Í¬Ò²¶ÔÊÓ¾õÓкܴóµÄÓ°Ïì¡£ÀýÈ磬¹â»¬µÄµØ±íÒª±È´Ö²ÚµÄµØ±í¾µÃæ·´Éä¹â¸üÇ¿£¬¶øÂþ·´Éä¹â¸üÈõ¡£Í¬Ò»Êø°×¹âÕÕÉäµ½²»Í¬ÑÕÉ«µÄµØ±íÒ²½«ÏÔÏÖ³ö²»Í¬µÄÑÕÉ«¡£Òò´Ë£¬³ýÁ˶¨Òå·¨ÏßÏòÁ¿Í⣬»¹ÐèÒª¶ÔµØ¾°µÄ²ÄÖʽøÐж¨Ò壬ͨ³£ÐèÒª¶¨ÒåµÄÖ÷ÒªÓвÄÖʵĻ·¾³·´Éä¹â¡¢Âþ·´Éä¹â¡¢¾µÃæ·´Éä¹âºÍ·´Éä¹âÁÁ¶ÈµÈ²ÎÊý£º
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); // ¶¨Òå²ÄÖʵĻ·¾³·´Éä¹â
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // ¶¨Òå²ÄÖʵÄÂþ·´Éä¹â
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); // ¶¨Òå·´Éä¹âÁÁ¶È
¡¡¡¡ÆäÖУ¬mat_ambient¡¢mat_diffuse¡¢mat_specularºÍmat_shininessÖж¨ÒåÁ˾ßÌåµÄ²ÎÊýȡֵ£º
// ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
mat_shininess[0] = 50.0f;
// ¶¨Òå²ÄÖʵĻ·¾³·´Éä¹â
mat_ambient[0] = 0.3f;mat_ambient[1] = 0.3f;mat_ambient[2] = 0.3f; mat_ambient[3] = 1.0f; // ¶¨Òå²ÄÖʵÄÂþ·´Éä¹â
mat_diffuse[0] = 0.9f;mat_diffuse[1] = 0.9f;mat_diffuse[2] = 0.7f;mat_diffuse[3] = 1.0f;
// ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
mat_specular[0]=1.0f;mat_specular[1] = 1.0f;mat_specular[2] = 1.0f;mat_specular[3] = 1.0f;
¼´Ê¹³õʼ¶¨ÒåÁ˲ÄÖÊ£¬ÔÚÖ®ºóµÄÖ´Ðйý³ÌÖÐÒ²ËæÊ±¿ÉÒÔ¸ü¸Ä²ÄÖÊÉ趨£º
if (dlg.m_bDiffuseColor){ // ¶¨Òå²ÄÖʵÄÂþ·´Éä¹â
¡¡RGBToGLfloatv(dlg.m_crDiffuseColor,r,g,b);
¡¡mat_diffuse[0] = r; mat_diffuse[1] = g; mat_diffuse[2] = b; mat_diffuse[3] = 1.0f;
}
if (dlg.m_bAmbientColor) { // ¶¨Òå²ÄÖʵĻ·¾³·´Éä¹â
¡¡RGBToGLfloatv(dlg.m_crAmbientColor,r,g,b);
¡¡mat_ambient[0] = r;mat_ambient[1] = g;mat_ambient[2] = b;mat_ambient[3] = 1.0f;
}
if (dlg.m_bSpecularColor) { // ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
¡¡RGBToGLfloatv(dlg.m_crSpecularColor,r,g,b);
¡¡mat_specular[0] = r;mat_specular[1] = g;mat_specular[2] = b;mat_specular[3] = 1.0f;
}
mat_shininess[0] = (GLfloat)dlg.m_nShininess; // ¹âÁÁ¶È
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); // ¶¨Òå²ÄÖʵĻ·¾³·´Éä¹â
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // ¶¨Òå²ÄÖʵÄÂþ·´Éä¹â
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); // ¶¨Òå²ÄÖʾµÃæ·´Éä¹â
¡¡¡¡ÕâÀïÊÇͨ¹ý¶Ô»°¿òµÄ½»»¥ÓÉÓû§¶¯Ì¬Ö¸¶¨ËùÐèµÄÑÕɫȡֵ²¢ÒÔ´ËÀ´½øÐвÄÖÊÉ趨¡£ÓÉÓÚͨ³£¶àÒÔCOLORREFÐͱäÁ¿À´Ö¸¶¨ÑÕÉ«£¬Òò´ËÔÚÉèÖòÄÖÊ֮ǰҪÏÈͨ¹ýRGBToGLfloatv£¨£©º¯Êý´ÓÖзÖÀë³öR¡¢G¡¢BÑÕÉ«·ÖÁ¿£º
ÎÄÕÂÕûÀí£ºÎ÷²¿ÊýÂë--רҵÌṩÓòÃû×¢²á¡¢ÐéÄâÖ÷»ú·þÎñ
http://www.west263.com
ÒÔÉÏÐÅÏ¢ÓëÎÄÕÂÕýÎÄÊDz»¿É·Ö¸îµÄÒ»²¿·Ö,Èç¹ûÄúÒª×ªÔØ±¾ÎÄÕÂ,Çë±£ÁôÒÔÉÏÐÅÏ¢£¬Ð»Ð»!



