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

📄 mysdopenglview.cpp

📁 机器人运动学动力学及控制的一个小程序,供有兴趣的人参考
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        control.DesignDdx=theta;
        control.Designdx=theta;
        control.Designx=Designtheta;
        control.Kv=kv;
        control.Kp=kp;

  //     force=control.ControlTorqueCL(dtheta,theta);
 //         force=xx.CaculateForce(dtheta,dtheta);

//	   CString	m_strMatrix3 = beata.ToString(" ");
//	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
/////////////////////////////////////////////////////////
	 Angle1=0.0;
	 Angle2=0.0;
	 Angle3=0.0;
	 Angle4=0.0;
     deltaAngle1=inputAngle1/100;
     deltaAngle2=inputAngle2/100;
     deltaAngle3=inputAngle3/100;
     deltaAngle4=inputAngle4/100;

	w=lpCreateStruct->cx;
	h=lpCreateStruct->cy;
	m_pDC=new CClientDC(this);
	SetTimer(1,20,NULL);
    initializeOpenGL(m_pDC);

    GetDocument()->lpTransport=&Transport;
	return 0;
}

void CMySDOpenGLView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	::wglMakeCurrent(0,0);
    ::wglDeleteContext(m_hRC);
	if(m_hPalette)
		DeleteObject(m_hPalette);
	if(m_pDC)
	{
		delete m_pDC;
	}
	if(model1) free(model1);
	if(model2) free(model2);
	if(model3) free(model3);

//	if(cylinder_obj) delete cylinder_obj;
	KillTimer(1);
}

void CMySDOpenGLView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	glViewport(0,0,cx,cy);
/*if(drawmodel==SELECT)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
	glFrustum(-7,7,-5,5,10,300);
	glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    winWidth=cx;
    winHeight=cy;

}
*/
}
void CMySDOpenGLView::OnTimer(UINT nIDEvent) 
{     //       F=false;
	// TODO: Add your message handler code here and/or call default

	if(fabs(Angle1)<fabs(inputAngle1))
{ Angle1+=deltaAngle1/1;}
if(fabs(Angle2)<fabs(inputAngle2))
{  Angle2+=deltaAngle2/1;}
if(fabs(Angle3)<fabs(inputAngle3))
{	 Angle3+=deltaAngle3/1;}
if(fabs(Angle4)<fabs(inputAngle4))
{		 Angle4+=deltaAngle4/1;}

	Invalidate(FALSE);
	CView::OnTimer(nIDEvent);
}

void CMySDOpenGLView::SetLogicalPalette(void)
{   
	struct
	{  
		WORD Version;
		WORD NumberOfEntries;
		PALETTEENTRY aEntries[256];
	}logicalPalette={0x300,256};
	   BYTE reds[]={0,36,72,109,145,182,218,255};
       BYTE greens[]={0,36,72,109,145,182,218,255};
	   BYTE blues[]={0,85,170,255};
	for(int colorNum=0;colorNum<256;++colorNum)
	{  logicalPalette.aEntries[colorNum].peRed=reds[colorNum&0x07];
       logicalPalette.aEntries[colorNum].peGreen=greens[(colorNum>>0x03)&0x07];
	   logicalPalette.aEntries[colorNum].peBlue=blues[(colorNum>>0x06)&0x03];
	   logicalPalette.aEntries[colorNum].peFlags=0;
	}
   m_hPalette=CreatePalette((LOGPALETTE*)&logicalPalette);
}

BOOL CMySDOpenGLView::initializeOpenGL(CDC* pDC)
{
    m_pDC=pDC;
    SetupPixelFormat();
    m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());
    ::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);
	init(w,h);
    glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	cylinder_obj=gluNewQuadric(); 
	cylinder_obj1=gluNewQuadric(); 
	m_objloaded=false;
/*	model1=(ModelContext *)calloc(1,sizeof(ModelContext));
	if(model1==NULL)
	{
		MessageBox("Not enough memory count be allocated for model data","错误",MB_OK);
		exit(-1);
	}
	model1->triangleFlag=0;
	m_objRead->readObjData("0.obj",model1);

	model2=(ModelContext *)calloc(1,sizeof(ModelContext));
	if(model2==NULL)
	{
		MessageBox("Not enough memory count be allocated for model data","错误",MB_OK);
		exit(-1);
	}
	model2->triangleFlag=0;
	m_objRead->readObjData("1.obj",model2);

	model3=(ModelContext *)calloc(1,sizeof(ModelContext));
	if(model3==NULL)
	{
		MessageBox("Not enough memory count be allocated for model data","错误",MB_OK);
		exit(-1);
	}
	model3->triangleFlag=0;
	m_objRead->readObjData("2.obj",model3);
	
	m_objloaded=TRUE;
*/ 
	glDisable(GL_CULL_FACE);
	glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
	glEnable(GL_NORMALIZE);
//    Initialize();//m2
	return TRUE;
}

BOOL CMySDOpenGLView::SetupPixelFormat(void)
{
PIXELFORMATDESCRIPTOR pfd={sizeof(PIXELFORMATDESCRIPTOR),
 1,
 PFD_DRAW_TO_WINDOW|
 PFD_SUPPORT_OPENGL|
 PFD_DOUBLEBUFFER,
 PFD_TYPE_RGBA,
 24,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,
 PFD_MAIN_PLANE,
 0,0,0,0
};
int iPixelFormat;
if((iPixelFormat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
{MessageBox("ChoosePixelFormat Fail",NULL,MB_OK);
return 0;
}
if(SetPixelFormat(m_pDC->GetSafeHdc(),iPixelFormat,&pfd)==FALSE)
{MessageBox("SetPixelFormat Fail",NULL,MB_OK);
return 0;
}

if(pfd.dwFlags&PFD_NEED_PALETTE)
     SetLogicalPalette();
return TRUE;
}

BOOL CMySDOpenGLView::RenderScence()
{
	//   Render();//m2
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glPushMatrix();

	glLoadIdentity();
	glInitNames();
	glPushName(0);

	if(sin(Y_Angle*3.14/180)>=0)
	{	gluLookAt(sin(Y_Angle*3.14/180)*sin((X_Angle)*3.14/180)*2,cos(Y_Angle*3.14/180)*2,sin(Y_Angle*3.14/180)*cos((X_Angle)*3.14/180)*2,0,0,0,0.0,1.0,0.0);
//	    DrawPoint( object_x, object_y, -object_z*0.1, 1.0*0.1);

	}
else
{
	gluLookAt(sin(Y_Angle*3.14/180)*sin((X_Angle)*3.14/180)*2,cos(Y_Angle*3.14/180)*2,sin(Y_Angle*3.14/180)*cos((X_Angle)*3.14/180)*2,0,0,0,0.0,-1.0,0.0);
 //     DrawPoint( object_x, object_y, object_z*0.1, 1.0*0.1);

}

if(sin(Y_Angle*3.14/180)>=0)
{    
//	near_x=-near_x;
//	near_y=-near_y;	
	near_z=-near_z;
// 	far_x=-far_x;
//	far_y=-far_y;   
	far_z=-far_z;
}

//DrawPoint( object_x, object_y, object_z*0.1, 1.0);
//drawLine(near_x,near_y,near_z*0.1,far_x,far_y,far_z*0.1);

    glScalef(0.1,0.1,0.1);
	/*
    glScalef(0.02,0.02,0.02);
//	gluLookAt(0,0,-1.0,0,0,0,0.0,1.0,0.0);
	glColorMaterial(GL_FRONT,GL_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);
	DawObj(model1);

    Animation(Angle1, Angle2);

	glDisable(GL_COLOR_MATERIAL);
*/
	
//	glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//	GLfloat light_diffuse[]={1.0,0.0,0.0,0.1};
//    glMaterialfv(GL_FRONT,GL_DIFFUSE,light_diffuse);	
//   glEnable(GL_BLEND);
//	auxSolidBox(5,5,0.1);
//DrawPoint( object_x, object_y, object_z, 1.0);
	
	glPushMatrix();
	glRotatef(90,1.0,0.0,0.0);
	glTranslatef(0.0,0.0,2.0);

if(drawmodel==SELECT)
{
    glLoadName(MODEL_2);
	if(model_pick==MODEL_2)
	{
        model2_scaling+=0.1f;
		if(model2_scaling>2.0f)model2_scaling=2.0;
	}
	else
	{
		model2_scaling-=0.1f;
        if(model2_scaling<1.0f)model2_scaling=1.0;
	}
    glScalef(model2_scaling,model2_scaling,model2_scaling);
}
	glColorMaterial(GL_FRONT,GL_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);
	glColor4f(1.0f,1.0f,1.0f,0.0f);
	auxSolidBox(5,5,0.1);
	glDisable(GL_COLOR_MATERIAL);

	glPopMatrix();
//   glDisable(GL_BLEND);	


	glColorMaterial(GL_FRONT,GL_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);
   DrawAxisArrow();
	glDisable(GL_COLOR_MATERIAL);


	glPushMatrix();
	if(drawmodel==SELECT)
	{
    glLoadName(MODEL_1);
	if(model_pick==MODEL_1)
	{
        model1_scaling+=0.1f;
		if(model1_scaling>2.0f)model1_scaling=2.0;
	}
	else
	{
		model1_scaling-=0.1f;
        if(model1_scaling<1.0f)model1_scaling=1.0;
	}
    glScalef(model1_scaling,model1_scaling,model1_scaling);
	}
DrawFKinematics();

	Animation1(Angle1, Angle2,Angle3,Angle4);

	glPopMatrix();
/*
//零位形
	DrawBase();


    glTranslatef(1.5,1.0,0.0);
    DrawArm(0.8);


	DawCylinder(cylinder_obj,1.3,0.0,2.0,270,0.0, 1.0,0.0,0.4,0.4,1.8);

	glTranslatef(0.8,0.0,2.0);
    DrawArm(0.7);

*/
	glPopMatrix();

	glFlush();

	::SwapBuffers(m_pDC->GetSafeHdc());
	return TRUE;
}
void CMySDOpenGLView::init(int Width, int Height)
{GLfloat light_ambiemt[]={1.0,1.0,1.0,1.0};
 GLfloat light_diffuse[]={1.0,1.0,1.0,1.0};
 GLfloat light_specular[]={1.0,1.0,1.0,1.0};
 GLfloat light_position[]={10.0,10.0,10.0,0.0};
    glLightfv(GL_LIGHT0,GL_AMBIENT,	light_ambiemt);// 设置环境光
    glLightfv(GL_LIGHT0,GL_DIFFUSE,	light_diffuse);//设置漫射光
    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//设置镜面光
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
//    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//    glEnable(GL_BLEND);

//	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE );
//	glEnable(GL_COLOR_MATERIAL);

 
	GLfloat position1[]={ -200.0f, -200.0f,-200.0f, 1.0f };
	GLfloat light1_ambient[]={ 0.3f, 0.3f, 0.3f, 1.0f };
	GLfloat light1_diffuse[]={ 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat light1_specular[]={ 1.0f, 1.0f, 1.0f, 1.0f };

	glLightfv(GL_LIGHT1, GL_POSITION, position1);
	glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
	glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHT1);//第二盏灯有效


	glViewport(0,0,Width,Height);	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();				
	gluPerspective			
		( 45.0f,						
		  (GLfloat)Width/(GLfloat)Height,
		  0.1f,					
		  3000.0f				
		);
	glMatrixMode(GL_MODELVIEW);	
	glLoadIdentity();	
	
//====================================================
}
void CMySDOpenGLView::DrawAxisArrow(void)
{
	glBegin(GL_LINES);
    glColor3f(1.f,0.f,0.f);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(0.9f,0.1f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(0.9f,-0.1f,0.0f);

    glColor3f(0.f,1.f,0.f);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(0.0f,1.0f,0.0f);
	glVertex3f(0.0f,1.0f,0.0f);
	glVertex3f(0.1f,0.9f,0.0f);
	glVertex3f(0.0f,1.0f,0.0f);
	glVertex3f(-0.1f,0.9f,0.0f);

    glColor3f(0.f,0.f,1.f);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(0.0f,0.0f,1.0f);
	glVertex3f(0.0f,0.0f,1.0f);
	glVertex3f(0.0f,0.1f,0.9f);
	glVertex3f(0.0f,0.0f,1.0f);
	glVertex3f(0.0f,-0.1f,0.9f);




	glEnd();

}

void CMySDOpenGLView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(drawmodel==RENDER){

	MouseDownPoint.x=point.x;
    MouseDownPoint.y=point.y;

    SetCapture();
	}
	else if(drawmodel==SELECT)
	{
           int mx,my;
		   mx=point.x;
		   my=point.y;

		   if(mx&1<<15)mx-=(1<<16);
		   if(my&1<<15)my-=(1<<16);
           mouse_select(mx,my);

	}

//      get_xyz(MouseDownPoint.x,MouseDownPoint.y);
	CView::OnLButtonDown(nFlags, point);
}

void CMySDOpenGLView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(drawmodel==RENDER){
	if(GetCapture()==this)
	{
		X_Angle+=double(point.x-MouseDownPoint.x)/3.6;
     Y_Angle+=double(point.y-MouseDownPoint.y)/3.6;
//     g_eye[0]+=
//	 Invalidate(TRUE);
     MouseDownPoint=point;
	}
	}
get_xyz(point.x,point.y);
//	CView::OnMouseMove(nFlags, point);
}

void CMySDOpenGLView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		MouseDownPoint=0.0;
    ReleaseCapture();
//	CView::OnLButtonUp(nFlags, point);
}

void CMySDOpenGLView::DawObj(ModelContext *model)
{   int i,j,nextIndex,currColor;
    i=0;
    j=0;
    nextIndex=model->colorList[j].index;
    if(m_objloaded)
    {
        if(drawSetting<LINE_INDEPENDENT)
        {
         if(model->haveNormals)
          {
            do
              {
                if(i==nextIndex)
                 {
                  setColor(&model->colorList[j].ra,&model->colorList[j].rd,

⌨️ 快捷键说明

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