一些初始化工作

OpenGL 的初始化其实挺麻烦的,特别是那么多的大写字母,所以记在这以后用时直接抄

 

说明:以下参考书:向世明 编著的《OpenGL 编程与实例》,电子工业出版社 1999 年9月。

比较老的一本书,呵呵,借不到更新的了,不过里面讲的还不错,起码跟着走还能运行出想要的效果

 

(一)创建新的 VC++ 工程:

选择 MFC AppWizard(exe),这里我命名为 studyOpengl

第一步:Single document

第二步:None

第三步:None 并选择 ActiveX controls

第四步:Use 3D Controls

第五步和第六步:缺省设置

 

(二)添加头文件:共两个

在 studyOpenglView.h 里添加下面两个头文件

#include "gl\gl.h"

#include "gl\glu.h"

 

(三)添加 lib :共两个

打开菜单 Project(工程) -> Setting(设置),在弹出的对话框的右边选择 Link 标签,然后在下面的

Object\Libaray Modules(对象\库模块) 中添加 OpenGl32.lib 和 glu32.lib ,注意多个 lib 之间以空格分开,

这两个 lib 文件分别帮助程序利用链接器访问动态链接库函数 opengl32.dll 和 glu32.dll,这两个 动态链接库可以

在电脑里系统盘的 WINDOWS 系统文件夹下的 system32 文件夹下找到。

 

(四)编辑 MainFrm.cpp 文件:

打开 MainFrm.cpp 文件,编辑里面的 PreCreateWindow() 函数,如下:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	// 增加下面两行,设置窗口大小
	cs.cx = 300;
	cs.cy = 335;

	return TRUE;
}

 

下面开始设置与 opengl 有关的环境

(五)设置像素格式:

在 Source Files 里打开 studyOpenglView.cpp 文件。然后在工具条中点击 WizardBar Action 方向朝下的三角形图标,选择 Add Windows Message Hander 选项,在弹出的对话框中增加 Windows 消息 WM_CREATE,选择 Add and Edit 按钮生成消息响应函数 OnCreate()。

再选择上面的三角形图标选择 Add Member Function 选项,编辑弹出的对话框,可如下:void protected Init(),在相应栏里写上即可。

按上述方法增加保护成员函数 bool  bSetupPixelFormat() 用于设置像素格式。

再打开 studyOpenglView.h 头文件,声明两个公有成员如下:

	CClientDC * m_pDC;
	CRect m_oldRect;

 再打开 studyOpenglView.cpp 文件,在构造函数里对上面声明的成员变量进行初始化,如下:

CStudyOpenGLView::CStudyOpenGLView()
{
	// TODO: add construction code here
	m_pDC  = NULL;
}

 再选择成员函数列表中的 bSetupPixelFormat(),编辑该函数如下:

bool CStudyOpenGLView::bSetupPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd = 
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
		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 pixelformat;

	if((pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd)) == 0)
	{
		MessageBox("选择象素格式失败");
		return false;
	}

	if((SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)) == false)
	{
		MessageBox("设置象素格式失败");
		return false;
	}

	return true;
}

 再选择成员函数 Init() , 编辑如下:

void CStudyOpenGLView::Init()
{
	PIXELFORMATDESCRIPTOR pfd;
	int n;
	HGLRC hrc;

	m_pDC = new CClientDC(this);

	ASSERT(m_pDC != NULL);

	if(!bSetupPixelFormat()) return ;
}

 

到这里就完成了像素格式的设置,下面将创建着色描述表相关的

(六)创建着色描述表并设置:

在上面的 Init() 函数后面追加代码,最后 Init() 函数如下:

void CStudyOpenGLView::Init()
{
	PIXELFORMATDESCRIPTOR pfd;
	int n;
	HGLRC hrc;

	m_pDC = new CClientDC(this);

	ASSERT(m_pDC != NULL);

	if(!bSetupPixelFormat()) return ;

	n =::GetPixelFormat(m_pDC->GetSafeHdc());
	::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
	hrc = wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);
}

 (七)创建 结束时的删除着色描述表:

按前面的方法增加 Windows 消息 WM_DESTROY  选择 Add and Edit 生成响应函数 OnDestroy(),如下:

void CStudyOpenGLView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	
	HGLRC hrc;

	hrc = ::wglGetCurrentContext();
	::wglMakeCurrent(NULL,NULL);

	if(hrc)
		::wglDeleteContext(hrc);

	if(m_pDC)
		delete m_pDC;

	CView::OnDestroy();
}

 然后在前面生成的 OnCreate() 函数里添加代码,如下:

int CStudyOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;	
	// TODO: Add your specialized creation code here
	Init();	
	return 0;
}

 (八)设定OpenGL 风格:

选择成员函数 PreCreateWindow() ,编辑如下:

BOOL CStudyOpenGLView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
	return CView::PreCreateWindow(cs);
}

 (九)建立 OpenGL 视点:

1:再编辑 Init() 函数,编辑后的 Init() 如下:

void CStudyOpenGLView::Init()
{
	PIXELFORMATDESCRIPTOR pfd;
	int n;
	HGLRC hrc;

	m_pDC = new CClientDC(this);

	ASSERT(m_pDC != NULL);

	if(!bSetupPixelFormat()) return ;

	n =::GetPixelFormat(m_pDC->GetSafeHdc());
	::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
	hrc = wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);

	GetClientRect(&m_oldRect);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

}

 2:添加 Windows 消息:

用前面的方法增加消息  WM_SIZE 并生成响应函数 OnSize(),编辑如下:

void CStudyOpenGLView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here

	if(cy > 0)
	{
		if((m_oldRect.right > cx) || (m_oldRect.bottom > cy))
		{
			RedrawWindow();
		}
		m_oldRect.right = cx;
		m_oldRect.bottom = cy;

		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glFrustum(-1.0,1.0,-1.0,1.0,0.0,7.0);
		glViewport(0,0,cx,cy);
	}	
}

 该函数用于当窗口尺寸大小改变时重新绘制

3:建立用户绘制函数 DrawScene():

增加保护成员函数 DrawScene(),该函数具体绘制 OpenGL 图形。

编辑 OnDraw() 函数如下:

void CStudyOpenGLView::OnDraw(CDC* pDC)
{
	CStudyOpenGLDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	DrawScene();
}

 

到这里则所有工作都已经做完,只需要在 DrawScene() 函数里调用绘制图形的各种函数绘制图形即可,例如:

void CStudyOpenGLView::DrawScene()
{
	// 设置背景颜色
	glClearColor(0.0f , 0.0f , 0.0f , 1.0f);
	// 清除颜色缓存和深度缓存
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	// 设置绘制物理的颜色,前景颜色
	glColor3f(1.0f,0.0f,0.0f);


	GLfloat fPointSize[2];
	// 得到点的可表现的象素范围大小
	glGetFloatv(GL_POINT_SIZE_RANGE , fPointSize);
	// 设置点的象素尺寸
	glPointSize(fPointSize[1]/2.0f);
	// 绘制 5 个点
	glBegin(GL_POINTS);
		glVertex2f(0.0f,0.0f);
		glVertex2f(0.5f , 0.5f);
		glVertex2f(-0.5f , 0.5f);
		glVertex2f(0.5f , -0.5f);
		glVertex2f(-0.5f , -0.5f);
	glEnd();
	glFinish();
}

 最后运行程序即可以看到效果图形,五个特别大的点。。。

需要注意下的是 最后的 glFinish() 函数,目前理解好象是输出缓冲图形,不加有时看不到该看到的效果,类似于一些语言里的 flush() 函数吧

基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值