?? opengl.cpp
字號:
#include "stdafx.h"
#include "OpenGL.h"
//////////////////////////////////////////////////////////////////////
extern HWND hWnd;
const float pi = 3.1415926f;
GLUquadricObj* quadric=NULL;
//////////////////////////////////////////////////////////////////////
OpenGL::OpenGL()
{
x_arc = 0;
y_arc = 0;
z_arc = 0;
}
OpenGL::~OpenGL()
{ CleanUp();
}
BOOL OpenGL::SetupPixelFormat(HDC hDC0)//檢測安裝OpenGL
{ int nPixelFormat; // 象素點格式
hDC=hDC0;
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd結構的大小
1, // 版本號
PFD_DRAW_TO_WINDOW | // 支持在窗口中繪圖
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 雙緩存模式
PFD_TYPE_RGBA, // RGBA 顏色模式
16, // 24 位顏色深度
0, 0, 0, 0, 0, 0, // 忽略顏色位
0, // 沒有非透明度緩存
0, // 忽略移位位
0, // 無累加緩存
0, 0, 0, 0, // 忽略累加位
16, // 32 位深度緩存
0, // 無模板緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主層
0, // 保留
0, 0, 0 // 忽略層,可見性和損毀掩模
};
if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))
{ MessageBox(NULL,"沒找到合適的顯示模式","Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
SetPixelFormat(hDC,nPixelFormat,&pfd);//設置當前設備的像素點格式
hRC = wglCreateContext(hDC); //獲取渲染描述句柄
wglMakeCurrent(hDC, hRC); //激活渲染描述句柄
return TRUE;
}
void OpenGL::init(int Width, int Height)
{ glViewport(0,0,Width,Height); // 設置OpenGL視口大小。
glMatrixMode(GL_PROJECTION); // 設置當前矩陣為投影矩陣。
glLoadIdentity(); // 重置當前指定的矩陣為單位矩陣
/*
gluPerspective // 設置透視圖
( 54.0f, // 透視角設置為 45 度
(GLfloat)Width/(GLfloat)Height, // 窗口的寬與高比
0.1f, // 視野透視深度:近點1.0f
3000.0f // 視野透視深度:始點0.1f遠點1000.0f
);
*/
glOrtho(-3.0, 3.0, -3.0, 3.0,-3.0,3.0);
// 這和照象機很類似,第一個參數設置鏡頭廣角度,第二個參數是長寬比,后面是遠近剪切。
glMatrixMode(GL_MODELVIEW); // 設置當前矩陣為模型視圖矩陣
glLoadIdentity(); // 重置當前指定的矩陣為單位矩陣
//====================================================
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void OpenGL::Render()//OpenGL圖形處理
{
glClearColor(0.0f, 0.0f, 0.3f, 1.0f); // 設置刷新背景色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// 刷新背景
glLoadIdentity(); // 重置當前的模型觀察矩陣
Vector3f vVector1, vVector2;
vVector1.x = 200;
vVector1.y = 200;
vVector1.z = 200;
vVector2.x = 0;
vVector2.y = 0;
vVector2.z = 0;
draw2point(vVector1,vVector2);
vVector2.x = 440;
vVector2.y = 440;
vVector2.z = 440;
draw2point(vVector1,vVector2);
glFlush(); // 更新窗口
SwapBuffers(hDC); // 切換緩沖區
}
void OpenGL::CleanUp()//清除OpenGL
{
wglMakeCurrent(hDC, NULL); //清除OpenGL
wglDeleteContext(hRC); //清除OpenGL
}
int OpenGL::Init()
{return 0;}
void OpenGL::display()
{
glFlush();
SwapBuffers(hDC); // 切換緩沖區
}
void OpenGL::draw2point(Vector3f vVector1, Vector3f vVector2)
{
float Zoom = 100;
//printf("before unproject: %f,%f,%f \n",vVector1.x,vVector1.y,vVector1.z);
//printf("before unproject: %f,%f,%f \n",vVector2.x,vVector2.y,vVector2.z);
//printf("after unproject: %f,%f,%f \n\n",xx,yy,zz);
//需要考慮float 越界問題
Vector3f *vt1 = new Vector3f(vVector1.x/Zoom,vVector1.y/Zoom,vVector1.z/Zoom);
Vector3f *vt2 = new Vector3f(vVector2.x/Zoom,vVector2.y/Zoom,vVector2.z/Zoom);
Vector3f vt4 = *vt2-*vt1;
Vector3f *vty = new Vector3f(0,0,1);
double arc12 = AngleBetweenVectors(*vty,vt4);
double rarc12 = 180 + 180*arc12/pi;
float len= Distance(*vt1,*vt2);
Vector3f vt3 = Cross(*vty,vt4);
glPushMatrix();
glTranslatef (vt1->x,vt1->y,vt1->z);
glColor3f(1.0f,0.5f,0.7f);
auxSolidSphere(0.09);
glTranslatef (vt4.x,vt4.y,vt4.z);
auxSolidSphere(0.09);
glColor3f(1.0f,1.0f,0.7f);
glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);
gluCylinder(quadric,0.06,0.06,len,35,35);
glPopMatrix();
delete vt1;
delete vt2;
delete vty;
}
void OpenGL::clear()
{
glClearColor(0.0f, 0.0f, 0.3f, 1.0f); // 設置刷新背景色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// 刷新背景
glLoadIdentity();
if(!quadric)
{
quadric=gluNewQuadric();
gluQuadricNormals(quadric,GLU_SMOOTH);
gluQuadricTexture(quadric,GL_TRUE);
}
//gluCylinder(quadric,0.06,0.06,0.9,35,35);
glRotatef (25.0,1.0,1.0,0.0);
glRotatef ((float)x_arc,1.0,0.0,0.0);
glRotatef ((float)y_arc,0.0,1.0,0.0);
glRotatef ((float)z_arc,0.0,0.0,1.0);
draw_ground();
}
//將骨架旋轉到y軸上來
int OpenGL::Correct_3D_Layout(Vector3f vVector1, Vector3f vVector2)
{
Vector3f vt4 = vVector2-vVector1;
Vector3f *vty = new Vector3f(0,1,0);
double arc12 = AngleBetweenVectors(*vty,vt4);
double rarc12 = 180*arc12/pi;
Vector3f vt3 = Cross(*vty,vt4);
glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);
delete vty;
return 0;
}
void OpenGL::draw_ground()
{
glPushAttrib(GL_CURRENT_BIT);
glEnable(GL_BLEND);
glPushMatrix();
glColor3f(0.5f, 0.7f, 1.0f);
glTranslatef(0,0.0f,0);
float size0=2;
glBegin(GL_LINES);
for (float x = -size0; x < size0;x+=0.5f)
{glVertex3f(x, -1.5, -size0); glVertex3f(x, -1.5, size0);}
for (float z = -size0; z < size0;z+=0.3f)
{glVertex3f(-size0, -1.5, z); glVertex3f( size0, -1.5, z);}
glEnd();
glPopMatrix();
glDisable(GL_BLEND);
glPopAttrib();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -