//--------------------------------------------------------- bool CView_Map_3DPanel::On_Draw(void) { if( !m_DEM.is_Valid() ) { return( false ); } //----------------------------------------------------- #pragma omp parallel for for(int y=1; y<m_DEM.Get_NY(); y++) { for(int x=1; x<m_DEM.Get_NX(); x++) { TSG_Triangle_Node p[3]; if( Get_Node(x - 1, y - 1, p[0]) && Get_Node(x , y , p[1]) ) { if( Get_Node(x, y - 1, p[2]) ) { Draw_Triangle(p, true); } if( Get_Node(x - 1, y, p[2]) ) { Draw_Triangle(p, true); } } } } //----------------------------------------------------- return( true ); }
//------------------------------------------------------------------------------ // Draws a generic overlay //------------------------------------------------------------------------------ void DrawOverlay( OverlayBase_t *pOverlay ) { switch( pOverlay->m_Type) { case OVERLAY_LINE: { // Draw the line OverlayLine_t *pLine = static_cast<OverlayLine_t*>(pOverlay); Draw_Line( pLine->origin, pLine->dest, pLine->r, pLine->g, pLine->b, pLine->noDepthTest); } break; case OVERLAY_BOX: { // Draw the box OverlayBox_t *pCurrBox = static_cast<OverlayBox_t*>(pOverlay); if (pCurrBox->a > 0.0) { Draw_AlphaBox( pCurrBox->origin, pCurrBox->mins, pCurrBox->maxs, pCurrBox->angles, pCurrBox->r, pCurrBox->g, pCurrBox->b, pCurrBox->a); } Draw_WireframeBox( pCurrBox->origin, pCurrBox->mins, pCurrBox->maxs, pCurrBox->angles, pCurrBox->r, pCurrBox->g, pCurrBox->b); } break; case OVERLAY_SWEPT_BOX: { OverlaySweptBox_t *pBox = static_cast<OverlaySweptBox_t*>(pOverlay); Draw_WireframeSweptBox( pBox ); } break; case OVERLAY_TRIANGLE: { OverlayTriangle_t *pTriangle = static_cast<OverlayTriangle_t*>(pOverlay); Draw_Triangle( pTriangle->p1, pTriangle->p2, pTriangle->p3, pTriangle->r, pTriangle->g, pTriangle->b, pTriangle->a, pTriangle->noDepthTest ); } break; default: Assert(0); } }
//--------------------------------------------------------- void CSG_3DView_Canvas::Draw_Triangle(TSG_Triangle_Node p[3], double Light_Dec, double Light_Azi) { double A = p[0].z * (p[1].x - p[2].x) + p[1].z * (p[2].x - p[0].x) + p[2].z * (p[0].x - p[1].x); double B = p[0].y * (p[1].z - p[2].z) + p[1].y * (p[2].z - p[0].z) + p[2].y * (p[0].z - p[1].z); double C = p[0].x * (p[1].y - p[2].y) + p[1].x * (p[2].y - p[0].y) + p[2].x * (p[0].y - p[1].y); double s, a; if( C != 0.0 ) { A = - A / C; B = - B / C; s = M_PI_090 - atan(sqrt(A*A + B*B)); a = A != 0.0 ? M_PI_180 + atan2(B, A) : B > 0.0 ? M_PI_270 : (B < 0.0 ? M_PI_090 : -1.0); } else { s = 0.0; a = 0.0; } Draw_Triangle(p, (acos(sin(s) * sin(Light_Dec) + cos(s) * cos(Light_Dec) * cos(a - Light_Azi))) / M_PI_090); }
void redraw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存 glLoadIdentity(); //初始化矩阵为单位矩阵 gluLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], 0, 1, 0); // 场景(0,0,0)的视点中心 (0,5,50),Y轴向上 if (bWire) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //设置多边形绘制模式:正反面,线型 } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //设置多边形绘制模式:正反面,填充 } glEnable(GL_DEPTH_TEST);//开启深度测试 glEnable(GL_LIGHTING); //开启光照模式 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_pos[] = { 5,5,5,1 }; glLightfv(GL_LIGHT0, GL_POSITION, light_pos);//光源位置 glLightfv(GL_LIGHT0, GL_AMBIENT, white);//定义白色 glEnable(GL_LIGHT0);//开启第0号光源 glRotatef(fRotate, 0, 1.0f, 0); //旋转 glRotatef(-90, 1, 0, 0); glScalef(0.2, 0.2, 0.2);//缩放 Draw_Triangle();//绘制场景 if (bAnim) fRotate += 0.5f;//旋转因子改变 glutSwapBuffers(); //交换缓冲区 }