文档库 最新最全的文档下载
当前位置:文档库 › OpenGL学习脚印_ 虚拟相机控制2(camera control)-第一人称相机(First Person Camera)

OpenGL学习脚印_ 虚拟相机控制2(camera control)-第一人称相机(First Person Camera)

OpenGL学习脚印_ 虚拟相机控制2(camera control)-第一人称相机(First Person Camera)
OpenGL学习脚印_ 虚拟相机控制2(camera control)-第一人称相机(First Person Camera)

分类: OpenGL 学习脚印

目录(?)

[+]

OpenGL学习脚印: 虚拟相机控制2(camera control)-第一人称相机(First Person Camera)

2014-10-09 21:38

1044人阅读

评论(0) 收藏 举报

opengl 人机交互

图形

OpenGL 学习脚印: 虚拟相机控制2(camera control) ------第一人称相机(First Person

Camera)

写在前面

上一节对投影中裁剪平面和投影平面宽高比有了一些认识,本节从视变换的角度来构造适合于人机交互的虚拟相机系统,这里以构造一个第一人称相机(First person camera)为例来帮助理解。第一人称相机网上已经有很多可利用代码,文中给出了一些参考链接,因此这里不再列出全部参看代码。本节的主旨在于着重理解相机控制的原理和知道如何用代码实现。

1.构造虚拟相机的原理

首先了解OpenGL 中控制虚拟相机的一般方法。OpenGL 旧版中一直使用:

void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ)?

这个函数来控制虚拟相机。这里的三个参数分别为观察者眼睛位置,也称为视点eyePos ;场景的观察参考点,也称为目标点targetPos ;以及用户指定的相机朝上向量,一般情况下朝上向量设置为(0.0,1.0,0.0)。这里还是将虚拟相机的原理图给出:

通过这个函数我们要完成什么样的目的呢?

在《OpenGL 学习脚印: 关于gluLookAt 函数的理解》一节推导了整个过程后明白:

原创:转载:译文:评论:个人资料

逐梦行者

访问:积分:等级:

排名:博客专栏

数据库应用开发文章:6篇阅读:9779

文章分类

Windows VC++程序设计IBM 汇编语言程序设计数据库编程Linux C++人生感悟php web 后端java 基础UML 软件工程头脑风暴OpenGL 学习脚印matlab 编译器web 前端错误列表设计模式开发环境搭建和维护数据结构与算法机器学习python 目录视图摘要视图订阅

王定桥的专栏

Do what I can manage,and do it well !

登录 | 注册

193089次3637第4112名146篇6篇11篇79条

(29)(2)(8)(4)(11)(3)(2)(8)(29)(1)(1)(2)

(19)(2)(1)(8)(9)(9)

(6)(16)(1)(2)

gluLookAt 通过指定观察者和观察参考点来构造观察正向forward ,同时通过指定朝上向量vup ,来构造相机坐标系的up 方向,通过forward 和up 叉积来构造第三个方向,我们称之为side 方向。这样eyePos 和forward(翻转

该方向)、up 方向、side 方向构成一个新的坐标系,这就是虚拟相机坐标系。而求取视变换矩阵view ,可以看做

两步,第一步将世界坐标系旋转和平移到与虚拟相机坐标系重合,这个矩阵称为M=T*R ;第二步求M 矩阵的逆矩

阵,该矩阵即为所求的视变换矩阵,也就是: view = inverse(T*R) = inverse(R)*inverse(T)。

这个函数已经能完成基本任务了,包括指定视点位置和场景观察点位置,以及观察的朝上向量。我们可

以在程序中动态修改这些参数来完成相机的控制。

但是这样仍然不能很好的用于人机交互,通常使用的第一人称相机,通过键盘WASD 等键和鼠标来控制虚拟相机更加方便,因此需要改进我们的相机控制。2.第一人称相机的交互目标

要想构造适合人机交互的相机类,必须明确我们需要实现的目标。

第一人称相机的目标包括:键盘来移动相机,是相机前后左右移动,通过鼠标来控制相机绕xy 轴转动角度,通过鼠标滚轮来实现缩放。这些运动从相机来看如下图所示(整理自A Camera Class for OpenGL John McGuiness 课件):

这里我们实现第一人称相机,滚转角roll 则暂时不需要(飞行器相机需要)。与gluLookAt 不同,我们这次构造的相机坐标系,默认情况下,即是forward(0.0,0.0,-1.0),side(1.0,0.0,0.0),和up(0.0,1.0,0.0),一开始可以看

做与世界坐标系重合(当然需要翻转forward 方向)。通过绕xy 轴旋转和平移来实现,因此红宝书旧版上实现飞行员相机的代码为:

[cpp] view plain copy print ?

01. void pilotView{GLdouble planex, GLdouble planey, 02. GLdouble planez, GLdouble roll, 03. GLdouble pitch, GLdouble heading) 04. {

05. glRotated(roll, 0.0, 0.0, 1.0); 06. glRotated(pitch, 0.0, 1.0, 0.0);

07. glRotated(heading, 1.0, 0.0, 0.0);

08. glTranslated(‐planex, ‐planey, ‐planez); 09.

}

注意,这里角度roll 等没有取反,也是可以的,这只是一个习惯而已。我们计算视变换矩阵使用如下公式:

其中Rx 、Ry 、Rz 分别表示绕x,y,z 轴的旋转,T 表示移动到相机到位置position 的平移。针对这一公式有两种代码实现。

实现一(参考自:Modern OpenGL 04 - Cameras, Vectors & Input ):

[cpp] view plain copy print ?

展开

数学基础阅读排行

php windows 开发环境搭建和基础入门中文编码转换---6种编码30个方向的转换MyEclipse 第一个Servlet 程序 --解决Win7系统下MyEclipse 与Tomcat 连接问题vi(vim)入门简明实例教程---总览全局 快速入门

VC ANSI 环境下按行读取ANSI 、UNICODE 、UNICODE big endian 、UTF-8四种文本文件孙鑫VC++ 20节课的反思java 学习脚印:深入java 绘图机制c++ 学习错误列表

html 实战演练--高级邮箱登陆界面和邮件管理系统数据库应用程序开发基础篇—— .NET 中SQL Server 数据库的操作C#篇之一

文章存档2015年06月2015年05月2015年01月2014年12月2014年11月最新评论

html 实战演练--高级邮箱登陆界面和邮件管理系统baidu_29798579: 我没有这个背景图,怎样才有

OpenGL 学习脚印: 顶点数据传送和着色器处理2skillart : 这么好的文章竟然没人顶汇编语言子程序设计 查找电话号码WirelessMouse : 帅帅帅

OpenGL 学习脚印: 关于gluLookAt 函数的理解

wangmopp : 顶一个,博主讲得不

错!

C++复制构造函数及三法则liuhmmjj : 写的很好

孙鑫VC++ 20节课的反思

逐梦行者: @mimica:如你所述,理论基础非常重要,要想在计算机行业里做的更自由更自如,就需要更深的内功。加...

孙鑫VC++ 20节课的反思

小米mimica : 计算机语言不论高级低级大部分都能体现出运行的原理,语言也只是程序员开发工作的工具,究其根本还是要打好...

数据结构与算法5: 递归(Recursion)heatn : @ziyuanxiazai123:感谢前辈!帮大忙了

数据结构与算法5: 递归(Recursion)逐梦行者: @heatn:Koch 曲线,其中一点数学主要是圆心坐标公式,另一个是递归。你可以拿铅笔在纸上做个进行...

数据结构与算法5: 递归(Recursion)heatn : 您好,最近新接触编程,学习的是python ,关于一个koch 曲线绘制的递归程序,实在是难以理解。。。...

(5)

(12478)

(11823)(5822)(4955)(4520)(4326)(3919)(3734)

(3526)

(3192)(11)(5)(1)(1)(6)

01. glm::mat4 FPCamera::getCameraOrientation()

02. {

03. glm::mat4 orientation;

04. orientation = glm::rotate(orientation,

05. ‐this‐>verticalAngle,glm::vec3(1.0,0.0,0.0));//pitch angle

06. orientation = glm::rotate(orientation,

07. ‐this‐>horizontalAngle,glm::vec3(0.0,1.0,0.0));//yaw angle

08. return orientation;

09. }

10. glm::mat4 FPCamera::getViewMatrix()

11. {

12. return getCameraOrientation()*glm::translate(glm::mat4(),‐this‐>position);

13.

14. }

实现二(参考自:Understanding the View Matrix):

[cpp] view plain copy print?

01. // Pitch should be in the range of [‐90 ... 90] degrees and yaw

02. // should be in the range of [0 ... 360] degrees.

03. glm::mat4 FPCamera::getViewMatrix( glm::vec3 eye, float pitch, float yaw )

04. {

05. // If the pitch and yaw angles are in degrees,

06. // they need to be converted to radians. Here

07. // I assume the values are already converted to radians.

08. float cosPitch = cos(this‐>degreeToRadians(pitch));

09. float sinPitch = sin(this‐>degreeToRadians(pitch));

10. float cosYaw = cos(this‐>degreeToRadians(yaw));

11. float sinYaw = sin(this‐>degreeToRadians(yaw));

12.

13. glm::vec3 xaxis(cosYaw, 0, ‐sinYaw);

14. glm::vec3 yaxis (sinYaw * sinPitch, cosPitch, cosYaw * sinPitch );

15. glm::vec3 zaxis(sinYaw * cosPitch, ‐sinPitch, cosPitch * cosYaw);

16. // Create a 4x4 view matrix from the right, up, forward and eye position vectors

17. float matrix[16] = {

18. xaxis.x, yaxis.x,zaxis.x,0 , //column 1

19. xaxis.y, yaxis.y,zaxis.y,0 , //column 2

20. xaxis.z, yaxis.z,zaxis.z,0 , //column 3

21. ‐glm::dot( xaxis, eye ), ‐glm::dot( yaxis, eye ),

22. ‐glm::dot( zaxis, eye ), 1 //column 4

23. };

24. return glm::make_mat4(matrix);

25. }

这两种方式的区别在于,第一种利用rotate和translate组合构造,第二种方式直接计算出其结果,两者构造的矩阵是等价的。

这里还有一个问题,在移动相机时,一种方式是计算移动距离在每个方向的分量,然后修改相机位置,参看A

C++ Camera Class for Simple OpenGL FPS Controls;另一种方式利用相机的三个方向向量,利用位移向量来计算相机位置,参看Modern OpenGL 04 - Cameras, Vectors & Input。

使用第二种方式时,需要计算forward,up,side三个方向向量,这三个向量的求取的方法即是:利用在旋转定位相机时的旋转矩阵来乘以原始的三个方向向量。原始三个向量方向forward(0.0,0.0,-1.0),side(1.0,0.0,0.0),和

up(0.0,1.0,0.0)。因此可以这样书写代码:

[cpp] view plain copy print?

01. glm::mat4 FPCamera::getCameraOrientation()

02. {

03. glm::mat4 orientation;

04. orientation = glm::rotate(orientation,

05. ‐this‐>verticalAngle,glm::vec3(1.0,0.0,0.0));//pitch angle

06. orientation = glm::rotate(orientation,

07. ‐this‐>horizontalAngle,glm::vec3(0.0,1.0,0.0));//yaw angle

08. return orientation;

09. }

10. glm::vec3 FPCamera::getForwardDir()

11. {

12. glm::vec4 forward = glm::inverse(getCameraOrientation())*glm::vec4(0.0,0.0,‐1,0.0);

13. return glm::vec3(forward);

14. }

15. glm::vec3 FPCamera::getUpDir()

16. {

17. glm::vec4 up = glm::inverse(getCameraOrientation())*glm::vec4(0.0,1.0,0.0,0.0);

18. return glm::vec3(up);

19. }

20. glm::vec3 FPCamera::getSideDir()

21. {

22. glm::vec4 side = glm::inverse(getCameraOrientation())*glm::vec4(1.0,0.0,0.0,0.0);

23. return glm::vec3(side);

24. }

也可以根据旋转矩阵,直接计算出方向向量,例如forward向量可以计算如下:

[cpp] view plain copy print?

01. glm::vec3 FPCamera::forward() const {

02. glm::vec4 forward;

03. forward.x = ‐sin(DegreesTORadians(yawAngle))*cos( DegreesTORadians(pitchAngle));

04. forward.y = sin(DegreesTORadians(pitchAngle));

05. forward.z = ‐cos(DegreesTORadians(pitchAngle))*cos(DegreesTORadians(yawAngle));

06. return glm::vec3(forward);

07. }

这里代码中提到的三角函数公式,为什么是这个样子? 可以参阅OpenGL Angles to Axes推导的旋转矩阵后自行演算一遍,以加深理解。唯一需要注意的是,不同作者的代码中旋转角度的正负号有所不同,这样计算过程可能稍有不同,注意区别。

同时在设计相机类时,我们也希望把投影矩阵包含进去,这个也很简单,利用glm::Perspective即可实现。

3.一个可运行的实例

很多教程已经开始使用GLFW来管理窗口,鉴于我之前一直使用的FreeGLUT来实现窗口管理(以后会采用GLFW),因此这里仍然给出FreeGLUT实现的部分代码供参考。

[cpp] view plain copy print?

01. //绘制回调函数

02. void display( void )

03. {

04. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

05. glUseProgram(programId);

06. glBindVertexArray(vaoId);

07. //设置纹理

08. glActiveTexture(GL_TEXTURE0);

09. glBindTexture(GL_TEXTURE0,textureId);

10. glUniform1i(samplerId, 0);

11. //设置投影矩阵

12. glm::mat4 projection = fpCamera.getProjectionMatrix();

13. glUniformMatrix4fv(projectionMatrixId,1,GL_FALSE,glm::value_ptr(projection));

14. //设置视变换矩阵

15. glm::mat4 view = fpCamera.getViewMatrix();

16. glUniformMatrix4fv(viewMatrixId,1,GL_FALSE,glm::value_ptr(view));

17. //设置模型变换矩阵

18. for(int i=0;i

19. {

20. glutil::MatrixStack modelMatrix;

21. modelMatrix.Translate(instanceOffset[i].x,instanceOffset[i].y,0.0);

22. modelMatrix.Rotate(glm::vec3(0.0,1.0,0.0),angle*(i+1));

23. modelMatrix.Scale(0.3);

24. glUniformMatrix4fv(modelMatrixId,1,GL_FALSE,glm::value_ptr(modelMatrix.Top()));

25. //绘制立方体

26. glDrawArrays(GL_TRIANGLES,0,36);

27. }

28. glUseProgram(0);

29. glBindVertexArray(0);

30. glutSwapBuffers();

31. }

32. //调整窗口大小回调函数

33. void reshape(int w,int h)

34. {

35. glViewport(0,0,(GLsizei)w,(GLsizei)h);

36. fpCamera.setAspectRatio((GLfloat)w/(GLfloat)h);

37. }

38. //键盘按键回调函数

39. void keyboardAction( unsigned char key, int x, int y )

40. {

41. float deltaTime = 1;

42. switch( key )

43. {

44. case 033: // Escape key

45. exit( EXIT_SUCCESS );

46. break;

47. //前后移动

48. case 'w':

49. fpCamera.moveForward(moveSpeed*deltaTime);

50. glutPostRedisplay();

51. break;

52. case 's':

53. fpCamera.moveBackward(moveSpeed*deltaTime);

54. glutPostRedisplay();

55. break;

56. //左右移动

57. case 'a':

58. fpCamera.strafeLeft(moveSpeed*deltaTime);

59. glutPostRedisplay();

60. break;

61. case 'd':

62. fpCamera.strateRight(moveSpeed*deltaTime);

63. glutPostRedisplay();

64. break;

65. //上下移动

66. case 'z':

67. fpCamera.offsetCameraPosition(moveSpeed*‐glm::vec3(0,1,0));

68. glutPostRedisplay();

69. break;

70. case 'x':

71. fpCamera.offsetCameraPosition(moveSpeed*glm::vec3(0,1,0));

72. glutPostRedisplay();

73. break;

74. case 0x20:

75. spinPause = ! spinPause;//空格键暂停立方体旋转

76. glutPostRedisplay();

77. break;

78. }

79. }

80. //鼠标回调函数

81. void mouseMoveAction(int button, int state, int x, int y)

82. {

83. if (button == GLUT_LEFT_BUTTON) {

84.

85. // 鼠标移动后松开时,更新窗口

86. if (state == GLUT_UP) {

87. int widowWitdh = glutGet(GLUT_WINDOW_WIDTH);

88. int widowHeight = glutGet(GLUT_WINDOW_HEIGHT);

89. float horizMovement = (x ‐ mousePos.x) * mouseSensitivity;

90. float vertMovement = (y ‐ mousePos.y) * mouseSensitivity;

91. //更新相机角度

92. fpCamera.offsetCameraAngles(horizMovement,vertMovement);

93. glutPostRedisplay();

94. mousePos = glm::vec2(‐1,‐1);

95. }

96. else {// state = GLUT_DOWN

97. mousePos.x = x;

98. mousePos.y = y; //刚按下鼠标左键时,记录鼠标位置

99. }

100. }

101. }

102. //鼠标滚轮回调函数

103. void mouseWheelAction( int wheel, int direction, int x, int y )

104. {

105. float fov = fpCamera.getFovAngle();

106. if (direction > 0)

107. {

108. // 放大

109. fov += mouseWheelSensitivity;

110. if(fov > 130.0f) fov = 130.0f;

111. fpCamera.setFovAngle(fov);

112. }

113. else

114. {

115. //缩小

116. fov ‐= mouseWheelSensitivity;

117. if(fov < 5.0f) fov = 5.0f;

118. fpCamera.setFovAngle(fov);

119. }

120. glutPostRedisplay();

121. }

主题推荐opengl

猜你在找

Part 2:Cocos2d-x开发基础-Cocos简介与环境搭建太空大战游戏实战课程Swift 编程语言入门Qt基础与Qt on Android入门微信公众平台开发入门

OpenGL学习脚印 投影矩阵的推导用VC6 进行Android NDK 开发

glPushMatrixglPopMatrix以及glMatrixMode的用法OpenGL进阶十四 - UVN Camera实现

Win32 OpenGL编程3 基本图元点直线多边形的绘制

准备好了么? !

更多职位尽在 CSDN JOB

上一篇OpenGL学习脚印: 虚拟相机控制1(camera control)下一篇

C++复制构造函数及三法则

实例效果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

查看评论 暂无评论

您还没有登录,请[登录]或[注册]

跳吧深圳市乐易网络有限公司

|cocos2dx工程师6-10K/月

我要跳槽深圳市壹捌无限科技有限公司

|高级产品经理(O2O)10-20K/月

我要跳槽金恪投资控股股份有限公司

|J2EE架构设计师

20-30K/月

我要跳槽创新工场(Innovation Works)

|创新工场-小叶子-cocos2d-x工程师7-14K/月

我要跳槽

* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

核心技术类目

全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker

OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC

WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML

LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra

CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App

SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP

HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap

公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈网站客服杂志客服微博客服webmaster@https://www.wendangku.net/doc/877718995.html,400-600-2320|北京创新乐知信息技术有限公司 版权所有|江苏乐知网络技术有限公司 提供商务支持京 ICP 证 070598 号|Copyright ? 1999-2014, https://www.wendangku.net/doc/877718995.html,, All Rights Reserved

自动控制原理MATLAB仿真实验报告

实验一 MATLAB 及仿真实验(控制系统的时域分析) 一、实验目的 学习利用MATLAB 进行控制系统时域分析,包括典型响应、判断系统稳定性和分析系统的动态特性; 二、预习要点 1、 系统的典型响应有哪些? 2、 如何判断系统稳定性? 3、 系统的动态性能指标有哪些? 三、实验方法 (一) 四种典型响应 1、 阶跃响应: 阶跃响应常用格式: 1、)(sys step ;其中sys 可以为连续系统,也可为离散系统。 2、),(Tn sys step ;表示时间范围0---Tn 。 3、),(T sys step ;表示时间范围向量T 指定。 4、),(T sys step Y =;可详细了解某段时间的输入、输出情况。 2、 脉冲响应: 脉冲函数在数学上的精确定义:0 ,0)(1)(0 ?==?∞ t x f dx x f 其拉氏变换为:) ()()()(1)(s G s f s G s Y s f === 所以脉冲响应即为传函的反拉氏变换。 脉冲响应函数常用格式: ① )(sys impulse ; ② ); ,();,(T sys impulse Tn sys impulse ③ ),(T sys impulse Y = (二) 分析系统稳定性 有以下三种方法: 1、 利用pzmap 绘制连续系统的零极点图; 2、 利用tf2zp 求出系统零极点; 3、 利用roots 求分母多项式的根来确定系统的极点 (三) 系统的动态特性分析 Matlab 提供了求取连续系统的单位阶跃响应函数step 、单位脉冲响应函数impulse 、零输入响应函数initial 以及任意输入下的仿真函数lsim.

OpenGL入门学习之七——使用光照来表现立体感

OpenGL入门学习之七——使用光照来表现立体感 2009-01-07 11:49 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 图1 OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

自动控制原理习题全解及MATLAB实验 第6章习题解答

第6章控制系统的校正 本章主要讨论利用频率法对单输入-单输出的线性定常系统的综合和设计。在介绍控制系统校正的基本概念、控制系统的基本控制规律的基础上,介绍了各种串联校正装置(超前校正装置、滞后校正装置、滞后-超前校正装置)的特性及按分析进行相应设计的基本步骤和方法;还介绍了期望设计法的基本概念、常见的期望特性和设计步骤;另外还介绍了根轨迹法的串联校正和反馈校正的基本概念和方法;最后介绍了利用MATLAB进行控制系统校正。 教材习题同步解析 试分别说明系统的固有频率特性与系统期望频率特性的概念。 答:系统本身固有元件所具有的频率特性称为固有频率特性。设计者希望系统所能达到的频率特性称为系统期望频率特性。 试比较串联校正和反馈校正的优缺点。 答:a、校正装置和未校正系统的前向通道环节相串联,这种叫串联校正,串联校正是最常用的设计方法,设计与实现比较简单,通常将串联装置安置在前向通道的前端。 b、并联校正也叫反馈校正,它是和前向通道的部分环节按反馈方式连接构成局部反馈回路,设计相对较为复杂。并联校正一般不需要加放大器,它可以抑制系统的参数波动及非线性因素对系统性能的影。 PD控制为什么又称为超前校正?串联PD控制器进行校正为什么能提高系统的快速性和稳定性? 答:加入PD控制相当于在系统中加入一个相位超前的串联校正装置,使之在穿越频率处有较大的相位超前角。因此,PD控制称为超前控制。PD控制的传递函数为G s Kp sτ =+,由比例控制和微分控制组合而成。增大比例系数Kp,可以展宽系统的()(1) 通频带,提高系统的快速性。微分控制反映信号的变化率的预报作用,在偏差信号变化前给出校正信号,防止系统过大地偏离期望值和出现剧烈振荡倾向,有效地增强系统的相对稳定性。 PI控制为什么又称为滞后校正?串联PI控制器进行校正为什么能提高系统的稳态性能?如何减小它对系统稳定性的影响? 答:PI控制在低频段产生较大的相位滞后,所以滞后校正。PI控制的比例部分可以提高系统的无差度,改善系统的稳态性能。在串入系统后应使其转折频率在系统幅值穿越频率

实验7 OpenGL光照

实验7 OpenGL光照 一、实验目的 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。 二、实验内容 (1)下载并运行Nate Robin教学程序包中的lightmaterial 程序,试验不同的光照与材质系数; (2)运行示范代码1,了解光照与材质函数使用。 三、实验原理 为在场景中增加光照,需要执行以下步骤: (1)设置一个或多个光源,设定它的有关属性; (2)选择一种光照模型; (3)设置物体的材料属性。 具体见教材第8章8.6节用OpenGL生成真实感图形的相关内容。 四、实验代码 #include #include static int year =0,day=0; void init(void){ GLfloat mat_specular[]={1.0,1.0,1.0,1.0}; GLfloat mat_shininess[]={50.0}; GLfloat light_position[]={1.0,1.0,1.0,0.0};

GLfloat white_light[]={1.0,1.0,1.0,1.0}; GLfloat Light_Model_Ambient[]={0.2,0.2,0.2,1.0}; glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); //glMaterialfv(材质指定,单值材质参数,具体指针); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射光的反射系数 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射指数 //glLightfv(光源,属性名,属性值); glLightfv(GL_LIGHT0, GL_POSITION, light_position); //光源位置 glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //漫放射光分量强度 glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //折射光强度 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient); //光源2 GL_LIGHT1 GLfloat mat_specular1[]={1.0,1.0,1.0,1.0}; GLfloat mat_shininess1[]={50.0}; GLfloat light_position1[]={0.0,0.0,0.0,0.0}; GLfloat red_light[]={1.0,0.0,0.0,1.0}; GLfloat Light_Model_Ambient1[]={0.2,0.2,0.2,1.0}; glLightfv(GL_LIGHT1, GL_POSITION, light_position1); //光源位置 glLightfv(GL_LIGHT1, GL_DIFFUSE, red_light); //漫放射光分量强度 glLightfv(GL_LIGHT1, GL_SPECULAR, red_light); //折射光强度 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient1); //开启灯光

自动控制原理MATLAB仿真实验

自动控制原理MATLAB仿真实验 实验一典型环节的MATLAB仿真 一、实验目的 1.熟悉MATLAB桌面和命令窗口,初步了解SIMULINK功能模块的使用方法。 2.通过观察典型环节在单位阶跃信号作用下的动态特性,加深对各典型环节响应曲线的理解。 3.定性了解各参数变化对典型环节动态特性的影响。 二、SIMULINK的使用 MATLAB中SIMULINK是一个用来对动态系统进行建模、仿真和分析的软件包。利用SIMULINK功能模块可以快速的建立控制系统的模型,进行仿真和调试。 1.运行MATLAB软件,在命令窗口栏“>>”提示符下键入simulink命令,按Enter 键或在工具栏单击按钮,即可进入如图1-1所示的SIMULINK仿真环境下。 2.选择File菜单下New下的Model命令,新建一个simulink仿真环境常规模板。 图1-1 SIMULINK仿真界面图1-2 系统方框图

3.在simulink 仿真环境下,创建所需要的系统。 以图1-2所示的系统为例,说明基本设计步骤如下: 1)进入线性系统模块库,构建传递函数。点击simulink 下的“Continuous ”,再将右边窗口中“Transfer Fen ”的图标用左键拖至新建的“untitled ”窗口。 2)改变模块参数。在simulink 仿真环境“untitled ”窗口中双击该图标,即可改变传递函数。其中方括号内的数字分别为传递函数的分子、分母各次幂由高到低的系数,数字之间用空格隔开;设置完成后,选择OK ,即完成该模块的设置。 3)建立其它传递函数模块。按照上述方法,在不同的simulink 的模块库中,建立系统所需的传递函数模块。例:比例环节用“Math ”右边窗口“Gain ”的图标。 4)选取阶跃信号输入函数。用鼠标点击simulink 下的“Source ”,将右边窗口中“Step ”图标用左键拖至新建的“untitled ”窗口,形成一个阶跃函数输入模块。 5)选择输出方式。用鼠标点击simulink 下的“Sinks ”,就进入输出方式模块库,通常选用“Scope ”的示波器图标,将其用左键拖至新建的“untitled ”窗口。 6)选择反馈形式。为了形成闭环反馈系统,需选择“Math ” 模块库右边窗口“Sum ”图标,并用鼠标双击,将其设置为需要的反馈形式(改变正负号)。 7)连接各元件,用鼠标划线,构成闭环传递函数。 8)运行并观察响应曲线。用鼠标单击工具栏中的“”按钮,便能自动运行仿真环境下的系统框图模型。运行完之后用鼠标双击“Scope ”元件,即可看到响应曲线。 三、实验原理 1.比例环节的传递函数为 221211()2100,200Z R G s R K R K Z R =-=-=-== 其对应的模拟电路及SIMULINK 图形如图1-3所示。

第三章光照模型纹理映射

第三章光照模型及纹理映射 基本光照模型 1.在现实生活中,当光照在非透明物体上时,部分光线被物体吸收,剩余的部分光线被反射。人眼依靠这种反射光来感知物体的形状、颜色和其他细节。从光源投向物体的光称为入射光,从物体表面反射回的光称为反射光。 1.1光照模型概述 当光照射到物体表面上时,将出现3种情况: ●光从物体表面反射,形成反射光 ●光穿透物体,形成透射光 ●光被物体吸收,转化成为物体的内能 在上述三种情形的光线中,通常只有前2种情形的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。 OpenGL用一种近似的光照模型模拟现实世界的光照效果。在该模型中,仅当物体表面吸收和反射光线时,光源才会起做作用。每一个物体表面都假定是由某种特性的材料构成的。一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能像镜子一样在某个方向强烈地反射入射光。 1.2光照分量 在OpenGL的简化光照模型中,将光照分为4个独立的组成部分:辐射光、环境光、漫反射光和镜面反射光。 1)辐射光

辐射光是直接从物体或光源发出的,不受任何其他光源的影响。 2)环境光 环境光是这样一种光线,它被环境多次反射,以致于连初始 方向也难以确定。这种光线看起来就像来自于所有的方向, 当它照在一个物体表面时,它在所有的方向上等量地反射。 3)漫反射光 在被照射物体表面的反射光中,那些均匀地向各个方向反射 出去的光,称为漫反射光,如黑板反射就属于漫反射光 4)镜面反射光 镜面反射光是指超一定方向的反射光,如点光源照射光滑金 属球表面时,会在球表面形成一个特别亮的区域,呈现所谓 的高亮(Highlight>,这就是光源在该物体表面形成的镜面反射光(Specular Light>。点光源照射表面光滑的物体时,高亮区域小而亮;而点光源照射表面粗糙的物体时,高亮区域大而不亮。 1.3创建光源 光源有许多特性,如颜色、位置、方向等。不同特性的光源,作用在物体上的效果是不一样的。 1.3.1定义一个简单光源 在OpenGL中,定义一个光源是由函数glLight(>来实现的,该函数的原型为:void glLight(GLenum light,GLenum pname>; light为一个光源,pname为光源light指定一个单值的光源参数,

自动控制原理Matlab程序作业(精)

自控控制原理 MATLAB 程序设计作业 指导老师:汪晓宁 目录 一、题目 (2) 二、运行结果 (3) 三、程序说明 (8) 四、附录 ............................................ 9 代码 . ............................................. 9 参考文献 .. (17) 一、题目 用 Matlab 创建用户界面,并完成以下功能 a 将产生未综合系统的根轨迹图以及 0.707阻尼比线, 你可以交互地选择交点的运行点。界面能显示运行点的坐标、增益值以及近似为二阶系统估算的超调量、调整时间、峰值时间、阻尼比、无阻尼自然震荡频率以及稳态误差 b 显示未综合系统的阶跃响应 c 输入控制器的参数, 绘制综合后系统的根轨迹图以及显示综合的设计点 (主导极点 , 允许不断改变控制器参数,知道所绘制的根轨迹通过设计点 d 对于综合后的系统, 显示运行点的坐标、增益,近似为二阶系统估算的超调量、调整时间、峰值时间、阻尼比、无阻尼自然震荡频率以及误差系数 e 显示综合后系统的阶跃响应 二、运行结果

输入传递函数分子分母 生成根轨迹图

选择点并得到该点各项参数在下方输出面板输出 获得阶跃响应图 用 rltool(辅助,选择合适的插入零点

输入零点,并得到根轨迹图

选择根轨迹图上的任一点,得到数据,在下方输出面板输出得到阶跃响应图 三、运行说明

第一步, 在请输入分子后的输入框输入传递函数分子的矩阵, 在下一输入框输入传递函数分母并按“生成根轨迹图”按钮获得根轨迹 第二步, 按选择点并显示各参数获得根轨迹图上任一点的各项数据, 数据全部输出在下方输出面板 第三步,按“生成阶跃响应图”按钮可以获得该函数的阶跃响应 第四步,在“请输入插入零点”后的输入框中输入参数,并按“生成综合后根轨迹图” 按钮产生根轨迹 (可以通过点击“根轨迹校正”按钮,调用工具箱拖动零点进行快速查看根轨迹图,选择合适的根轨迹再在输入框中输入零点的值 第五步,按“选择点并显示各参数(综合后系统”选取各点,查阅参数,数据输出在下方输出面板上 第六步,按“生成阶跃响应图(综合后系统”可以得到综合后系统的阶跃响应 最后,点击“退出”结束程序 四、附录 代码: function varargout = Liushuai20122510(varargin % LIUSHUAI20122510 MATLAB code for Liushuai20122510.fig % LIUSHUAI20122510, by itself, creates a new LIUSHUAI20122510 or raises the existing % singleton*. %

《自动控制原理》MATLAB分析与设计

《自动控制原理》MATLAB分析与设计 仿真实验报告 第三章线性系统的时域分析法 1、教材P136.3-5系统进行动态性能仿真,并与忽略闭环零点的系统动态性能进行比较,分析仿真结果; (1)原系统的动态性能 SIMULINK仿真图: 仿真结果: 分析:从图中可以看出:峰值时间:tp=3.2s,超调量18.0%,调节时间ts=7.74s。 (2)忽略闭环零点的系统动态性能 SIMULINK仿真图:

仿真结果: 分析:从图中可以看出:峰值时间:tp=3.6s,超调量16.7%,调节时间ts=7.86s。 (3)两种情况动态性能比较 SIMULINK仿真图: 仿真结果:

原系统 忽略闭环零点 分析:通过比较可以看出闭环零点对系统动态性能的影响为:减小峰值时间,使系统响应速度加快,超调量增大。这表明闭环零点会减小系统阻尼。 3-9系统 SIMULINK仿真图: 仿真结果:

Scope0 分析:从图中可以看出:峰值时间:tp=1.05s,超调量35.1%,调节时间ts=3.54s(△=2%)。 Scope1 分析:从图中可以看出:峰值时间:tp=0.94s,超调量37.1%,调节时间ts=3.44s(△=2%)。

Scope2 分析:由于计算机在计算的过程也存在误差,因此,不同的参数时,两条线重合,需将闭环传递函数计算出来再作比较。 计算出闭环传递函数 SIMULINK仿真图:

分析:从图中可以看出:峰值时间:tp=1.05s,超调量35.1%,调节时间ts=3.54s(△=2%)。 Scope4 分析:从图中可以看出:峰值时间:tp=0.94s,超调量37.1%,调节时间ts=3.44s(△=2%)。

自动控制原理 matlab实验报告

自动控制原理实验(二) 一、实验名称: 基于MATLAB的控制系统频域及根轨迹分析 二、实验目的: (1)、了解频率特性的测试原理及方法; (2)、理解如何用MATLAB对根轨迹和频率特性进行仿真和分析; (3)、掌握控制系统的根轨迹和频率特性两大分析和设计方法。 三、实验要求: (1)、观察给定传递函数的根轨迹图和频率特性曲线; (2)、分析同一传递函数形式,当K值不同时,系统闭环极点和单位阶跃响应的变化情况;(3)、K值的大小对系统的稳定性和稳态误差的影响; (4)、分析增加系统开环零点或极点对系统的根轨迹和性能的影响。 四、实验内容及步骤 (1)、实验指导书:实验四 (1)、“rlocus”命令来计算及绘制根轨迹。会出根轨迹后,可以交互地使用“rlocfind”命令来确定点击鼠标所选择的根轨迹上任意点所对应的K值,K值所对应的所有闭环极点值也可以使用形如“[K, PCL] = rlocfind(G1)”命令来显示。 (2)、波特图:bode(G1, omga) 另外,bode图还可以通过下列指令得出相位和裕角: [mag,phase,w] = bode(sys) (3)、奈奎斯特图:nuquist(G, omega) (2)课本:例4-1、4-2、4-7 五实验报告要求 (1)、实验指导书:实验四

思考题 请绘制下述传递函数的bode图和nyquist图。 1. 根据实验所测数据分别作出相应的幅频和相频特性曲线; 2. 将思考题的解题过程(含源程序)写在实验报告中。 幅频特性曲线相频特性曲线 Gs = zpk([10], [-5; -16; 9], 200) subplot(1, 2, 1) bode(Gs) grid subplot(1, 2, 2) nyquist(Gs) grid (2)课本:例4-1、4-2、4-7

实验七 OPENGL光照效果

1.实验七OpenGL光照效果(选做) 1.实验七:OpenGL光照效果。 2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。 3.实验要求: (1)先做实验项目:实验六“OpenGL组合图形”。 (2)每人一组,独立完成。 (3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形” 中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一 定的光照明暗效果。 4.实验原理及内容: 在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定 的真实感光照效果。 (1)颜色: OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red,green,blue[,alpha]); glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。在该函数之后绘制的所有物体都将使用该 颜色。 (2)光线: OpenGL的光照模型中将光源分成四种: 发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。 环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。被环境光照射的物体,各个表面都均等受光。 散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。 镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。高亮

度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。 对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。 除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。 在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。计算混合光的亮度时,则把相应的颜色亮度叠加即可,例如:环境光为(R1,G1,B1),散射光为(R2,G2,B2),镜面光为(R3,G3,B3),则混合后的光线为(R1+R2+R3,G1+G2+G3,B1+B2+B3)。 (3)材质: 材质是物体本身的一种属性,主要用来表征物体对不同颜色、不同类型光线的反射、吸收性能。 在OpenGL中设置材质参数,就是要指定这种材质对环境光、散射光、镜面光的反射能力,有时还需要说明该种材质是否具有发光能力。 在最终绘制每个像素时,OpenGL自行将物体材质的各分量与光线的各分量相乘再叠加,从而得到每个像素的RGB值。例如:光线为(R,G,B),材质为(MR,MG, MB),则最终绘制时颜色为(MR*R,MG*G,MB*B)。 (4)获得光照效果的一般过程为: a)使能光照:glEnable(GL_LIGHTING); b)设置一种光照模式:glLightModel*(); 如果只需要普通的无方向的环境光: GLfloat light_ambient[]={red,green,blue,alpha};//环境光的分值 //全局环境光的默认取值为(0.2,0.2,0.2,1.0) glLightModel*(GL_LIGHT_MODEL_AMBIENT,light_ambient); 如果需要在某个具体位置上放置某个光源,例如: GLfloat light_ambient[]={0.3,0.3,0.3,1.0};//环境光 glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); GLfloat light_diffuse[]={0.7,0.7,0.7,1.0};//散射光 glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); GLfloat light_specular[]={1.0,1.0,1.0,1.0};//镜面光 glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);

MATLAB在自动控制原理中的应用

本论文主要研究如何根据用户要求的性能指标进行自动控制系统的串联校正设计,而此设计又具有很重要的现实意义。对于给定的线性定常系统,我们通常通过加入串联超前、滞后或超前滞后综合校正装置,以达到提高系统的精度和稳定性的目的。本文将给出基于频率特性法串联校正的具体设计方法,同时对该课题中的控制系统模型进行仿真。本设计可实现如下功能:对一个线性定常系统,根据需求的性能指标,通过本设计可给出系统的串联校正网络,从绘制出的各种响应曲线可以直观地将校正前后的系统进行比较,而仿真实例结果也进一步表明了此设计方法有效性和实用性。 关键词:串联校正;根轨迹;频率特性法;MATLAB 1.1研究目的 在实际工程控制中,往往需要设计一个系统并选择适当的参数以满足性能 指标的要求,或对原有系统增加某些必要的元件或环节,使系统能够全面满足 性能指标要求,此类问题就称为系统校正与综合,或称为系统设计。 当被控对象给定后,按照被控对象的工作条件,被控信号应具有的最大速 度和加速度要求等,可以初步选定执行元件的形式、特性和参数。然后,根据 测量精度、抗扰能力、被测信号的物理性质、测量过程中的惯性及非线性度等 因素,选择合适的测量变送元件。在此基础上,设计增益可调的前置放大器与 功率放大器。这些初步选定的元件以及被控对象适当组合起来,使之满足表征 控制精度、阻尼程度和响应速度的性能指标要求。如果通过调整放大器增益后 仍然不能全面满足设计要求的性能指标,就需要在系统中增加一些参数及特性 可按需要改变的校正装置,使系统能够全面满足设计要求,这就是控制系统设 计中的校正问题。系统设计过程是一个反复试探的过程,需要很多经验的积累。MATLAB为系统设计提供了有效手段。 1.2相关研究现状 系统仿真作为一种特殊的实验技术,在20世纪30-90年代的半个多世纪中经历了飞速发展,到今天已经发展成为一种真正的、系统的实验科学。自动控制系统仿真是系统仿真的一个重要分支,它是一门设计自动控制理论、计算机数学、计算机技术、系统辩识以及系统科学的综合性新型学科。它为控制系统的分析、计算、研究、综合设计以及自动控制系统的计算机辅助教学等提供了快速、经济、

OpenGL光照与材质

OpenGL---------光照的基本知识 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。 在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为镜面反射)。光线如果射入粗糙的、不光滑的平面,则反射后的光线是杂乱的(这样的反射称为漫反射)。现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以看成是这两种反射的叠加。对于光源发出的光线,可以分别设置其经过镜面反射和漫反射后的光线强度。对于被光线照射的材质,也可以分别设置光线经过镜面反射和漫反射后的光线强度。这些因素综合起来,就形成了最终的光照效果。 二、法线向量 在OpenGL中,法线的方向是用一个向量来表示。不幸的是,OpenGL并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成的物体的表面的每个点的法线(这话听着有些迷糊),通常,为了实现光照效果,需要在代码中为每一个顶点指定其法线向量。 指定法线向量的方式与指定颜色的方式有雷同之处。在指定颜色时,只需要指定每一个顶点的颜色,OpenGL就可以自行计算顶点之间的其它点的颜色。并且,颜色一旦被指定,除非再指定新的颜色,否则以后指定的所有顶点都将以这一向量作为自己的颜色。在指定法线向量时,只需要指定每一个顶点的法线向量,OpenGL会自行计算顶点之间的其它点的法线向量。并且,法线向量一旦被指定,除非再指定新的法线向量,否则以后指定的所有顶点都将以这一向量作为自

自动控制原理MATLAB仿真实验报告.

自动控制原理实验报告学院电子信息与电气工程学院

实验一 MATLAB 及仿真实验(控制系统的时域分析) 一、实验目的 学习利用MATLAB 进行控制系统时域分析,包括典型响应、判断系统稳定性和分析系统的动态特性; 二、预习要点 1、 系统的典型响应有哪些? 2、 如何判断系统稳定性? 3、 系统的动态性能指标有哪些? 三、实验方法 (一) 四种典型响应 1、 阶跃响应: 阶跃响应常用格式: 1、)(sys step ;其中sys 可以为连续系统,也可为离散系统。 2、),(Tn sys step ;表示时间范围0---Tn 。 3、),(T sys step ;表示时间范围向量T 指定。 4、),(T sys step Y =;可详细了解某段时间的输入、输出情况。 2、 脉冲响应: 脉冲函数在数学上的精确定义:0 ,0)(1)(0 ?==?∞ t x f dx x f 其拉氏变换为: ) ()()()(1 )(s G s f s G s Y s f === 所以脉冲响应即为传函的反拉氏变换。 脉冲响应函数常用格式: ① )(sys impulse ; ② ); ,(); ,(T sys impulse Tn sys impulse ③ ),(T sys impulse Y = (二) 分析系统稳定性 有以下三种方法: 1、 利用pzmap 绘制连续系统的零极点图; 2、 利用tf2zp 求出系统零极点; 3、 利用roots 求分母多项式的根来确定系统的极点 (三) 系统的动态特性分析 Matlab 提供了求取连续系统的单位阶跃响应函数step 、单位脉冲响应函数impulse 、零输入响应函数initial 以及任意输入下的仿真函数lsim.

自动控制原理MATLAB仿真实验报告

自动控制原理实验报告 学 院 电子信息与电气工程学院 实验一 MATLAB 及仿真实验(控制系统的时域分析) 一、实验目的 学习利用MATLAB 进行控制系统时域分析,包括典型响应、判断系统稳定性和分析系统的动态特性; 二、预习要点 1、 系统的典型响应有哪些? 2、 如何判断系统稳定性? 3、 系统的动态性能指标有哪些? 三、实验方法 (一) 四种典型响应 1、 阶跃响应: 阶跃响应常用格式: 1、)(sys step ;其中sys 可以为连续系统,也可为离散系统。 2、),(Tn sys step ;表示时间范围0---Tn 。 3、),(T sys step ;表示时间范围向量T 指定。 4、),(T sys step Y =;可详细了解某段时间的输入、输出情况。 2、 脉冲响应: 脉冲函数在数学上的精确定义:0 ,0)(1)(0 ?==?∞ t x f dx x f 其拉氏变换为:) ()()()(1)(s G s f s G s Y s f === 所以脉冲响应即为传函的反拉氏变换。 脉冲响应函数常用格式: ① )(sys impulse ; ② ); ,();,(T sys impulse Tn sys impulse ③ ),(T sys impulse Y = (二) 分析系统稳定性 有以下三种方法: 1、 利用pzmap 绘制连续系统的零极点图; 2、 利用tf2zp 求出系统零极点; 3、 利用roots 求分母多项式的根来确定系统的极点 (三) 系统的动态特性分析 Matlab 提供了求取连续系统的单位阶跃响应函数step 、单位脉冲响应函数impulse 、零输入响应函数initial 以及任意输入下的仿真函数lsim.

自动控制原理MATLAB仿真实验指导书

自动控制原理 MATLAB 仿真实验实验指导书 电气电子信息工程系自动化教研室

实验一典型环节的MATLAB仿真 一、实验目的 1.熟悉 MATLAB桌面和命令窗口,初步了解SIMULINK功能模块的使用方法。 2.通过观察典型环节在单位阶跃信号作用下的动态特性,加深对各典型环节响应曲线的理解。 3.定性了解各参数变化对典型环节动态特性的影响。 二、 SIMULINK 的使用 MATLAB 中SIMULINK是一个用来对动态系统进行建模、仿真和分析的软件包。利用SIMULINK功能模块可以快速的建立控制系统的模型,进行仿真和调试。 1.运行 MA TLAB软件,在命令窗口栏“>> ”提示符下键入simulink 命令,按Enter 键或在工具栏单击按钮,即可进入如图1-1 所示的 SIMULINK仿真环境下。 2.选择 File 菜单下 New 下的 Model 命令,新建一个simulink 仿真环境常规模板。 图 1-1SIMULINK 仿真界面图 1-2系统方框图 3.在 simulink 仿真环境下,创建所需要的系统。 以图 1-2 所示的系统为例,说明基本设计步骤如下: 1)进入线性系统模块库,构建传递函数。点击simulink 下的“ Continuous”,再将右边窗口中“ Transfer Fen”的图标用左键拖至新建的“untitled ”窗口。 2)改变模块参数。在 simulink 仿真环境“ untitled ”窗口中双击该图标,即可改变传递函数。其中方括号内的数字分别为传递函数的分子、分母各次幂由高到低的系数,数字之间用空格隔开;设 置完成后,选择OK ,即完成该模块的设置。 3)建立其它传递函数模块。按照上述方法,在不同的simulink 的模块库中,建立系统所需的传递函数模块。例:比例环节用“Math ”右边窗口“ Gain”的图标。 4)选取阶跃信号输入函数。用鼠标点击simulink 下的“ Source”,将右边窗口中“Step”图标用左键拖至新建的“untitled ”窗口,形成一个阶跃函数输入模块。 5)选择输出方式。用鼠标点击simulink 下的“ Sinks”,就进入输出方式模块库,通常选用“ Scope” 的示波器图标,将其用左键拖至新建的“untitled ”窗口。 6)选择反馈形式。为了形成闭环反馈系统,需选择“Math ”模块库右边窗口“Sum”图标,

OpenGL中的光照模型

OpenGL中的光照模型 一、OpenGL的光照模型 在OpenGL的简单光照模型中反射光可以分成三个分量,环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light): a、环境光Ambient,是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。特征:入射方向和出射方向均为任意方向。 b、漫射光Diffuse,来自特定方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮。特征:入射方向唯一、出射方向为任意方向。 c、镜面光Specular,来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。特征:入射方向和出射方向均唯一。 二、创建光源 定义光源特性的函数:glLight*(light , pname, param) 其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7;第二个参数pname指定光源特性,这个参数的辅助信息见表1所示;最 GL_LIGHT0,其他几个光源的GL_DIFFUSE和GL_SPECULAR缺省值为 (0.0,0.0,0.0,1.0)。 三、启用光源和明暗处理 如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算。要启用光照或关闭光照,调用函数:glEnable(GL_LIGHTING) 或glDisable(GL_LIGHTING)。 启用光照后必须调用函数glEnable(GL_LIGHT0) ,使所定义的光源有效。其它光

OpenGL光照

计算机图形学实验指导(三) – OpenGL光照 1.光照简介 采用光照要做的工作包括:创建光源,激活光照以及光源,以及定义物体的材质。创建光源是要定义光源的特征,物体的材质则与光源一起决定到达人眼的光的颜色。若光源颜色为(LR,LG,LB),材质颜色为(MR,MG,MB),则到达人眼的颜色为(LR*MR, LG*MG, LB*MB)。 2.简单光照模型 一般来说,反射光可以分成三个分量,即环境反射、漫反射和镜面反射。环境反射分量假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去,通常物体表面还会受到从周围环境来的反射光(如来自地面、天空、墙壁等的反射光)的照射,这些光常统称为环境光(Ambient Light);漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光,这些光常称为漫射光(Diffuse Light);镜面反射光为朝一定方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光(Specular Light)。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。 3.OpenGL光源 光源有许多特性,如颜色、位置、方向等。选择不同的特性值,则对应的光源作用在物体上的效果也不一样,下面的函数定义了OpenGL的光源。 void glLightfv(GLenum light , GLenum pname, TYPE param) 其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。第二个参数pname指定光源特性,这个参数的具体信息见下表所示。最后一个参数设置相应的光源特性值。 pname 参数名说明 GL_AMBIENT RGBA模式下环境光 GL_DIFFUSE RGBA模式下漫反射光 GL_SPECULAR RGBA模式下镜面光 GL_POSITION 光源位置齐次坐标(x,y,z,w) GL_SPOT_DIRECTION 点光源聚光方向矢量(x,y,z) GL_SPOT_EXPONENT 点光源聚光指数 GL_SPOT_CUTOFF 点光源聚光截止角 例如:下面定义了一个位置在(1,1,1),没有环境光,镜面反射光和漫反射光都为白光的光源GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; GLfloat light_ambient [] = { 0.0, 0.0, 0.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 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient ); glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse );

自动控制原理matlab仿真实验实验严进宁

实验一 系统的数学模型 一、实验目的和任务 1、 学会使用MATLAB 的命令; 2、 掌握MATLAB 有关传递函数求取及其零、极点计算的函数。 3、 掌握用MATLAB 求取系统的数学模型 二、实验仪器、设备及材料 1、 计算机 2、 MATLAB 软件 三、实验原理 1、 MATLAB 软件的使用 2、 使用MATLAB 软件在计算机上求取系统的传递函数 四、实验报告要求 1、 将各实验内容的要求写入实验报告。 2、 写出要求的实验程序。 3、 记录各命令运行后的结果 五、实验内容 例1-3、设置传递函数2 2)13() 5(6)(+++= s s s s G ,时间延迟常数4=τ 方式1:set(G,'ioDelay',4) %为系统的ioDelay 属性设定值 G %显示传递函数 解:该传递函数模型可以通过下面的语句输入到MATLAB 工作空间为: >> num=6*[1,5]; den=conv([1,3,1],[1,3,1]); G=tf(num,den); set(G,'ioDelay',4) G 运行结果为:

Transfer function: 6 s + 30 exp(-4*s) * ------------------------------ s^4 + 6 s^3 + 11 s^2 + 6 s + 1 例1-4、已知传递函数22)13() 5(6)(+++= s s s s G ,提取系统的分子和分母多项式(实验) 解:提取系统的分子和分母多项式程序为: >> num=6*[1,5]; den=conv([1,3,1],[1,3,1]); G=tf(num,den) [num den]=tfdata(G,'v') 运行结果为: Transfer function: 6 s + 30 ------------------------------ s^4 + 6 s^3 + 11 s^2 + 6 s + 1 num = 0 0 0 6 30 den = 1 6 11 6 1 例1-5例1-5 某系统的零极点模型为: ) 22)(22)(2)(1()5(6)(2 j s j s s s s s G -++++++= 方法2:利用算子(实验) >> s=zpk('s') G=6*(s+5)^2/((s+1)*(s+2)*(s+2+2)*(s+2-2))

相关文档
相关文档 最新文档