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