`
如沐春风的小妮
  • 浏览: 69742 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

opengl学习(五)------ 视图(二)

阅读更多

     今天说一下模型变换。
     模型变换有三种变换:移动,旋转,拉伸。对应到函数就是glTranslate*(), glRotate*()和glScale*()。这三个函数相当于产生一个适当的矩阵,然后当前矩阵与这个矩阵相乘,得出变换后的矩阵,也就呈现了变换效果。
      看一下函数定义:

Void glTranslate{fd}(TYPE x, TYPE y, TYPE z);

     把当前矩阵与一个表示移动物体的矩阵相乘,这个移动矩阵由x、y和z值指定或者在局部坐标系统中移动相同的数量。

使用(0.0, 0.0, 0.0)为参数调用glTranslate*()是单位操作,也就是说,物体将不进行移动。


void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);


     把当前矩阵与一个表示移动物体(或物体的局部坐标系统)的矩阵相乘,以逆时针方向绕着从原点到点(x, y, z)的直线进行旋转。angle参数指定了旋转的度数。

ps:远离旋转轴的物体比靠近旋转轴的物体的旋转幅度更大(轨道更长)。另外,如果angle参数为零,glRotate*()函数就不能产生任何效果。


void glScale{fd}(TYPE x, TYPE y, TYPE z);


      把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩和反射的矩阵相乘。这个物体中每个点的x、y和z坐标与对应x、y和z参数相乘。使用局部坐标系统方法,局部坐标系统的轴将由x、y和z因子拉伸、收缩或者反射,相关联的物体也根据它们进行变换。

     单位缩放值为:(1.0, 1.0, 1.0).

ps:如果缩放值为0,它会把所有沿这个轴的物体坐标收缩为0.通常,这并不是一种好的做法,因为这种操作是无法还原的。从数学角度而言,这种矩阵是没有逆矩阵的。但是对于有些光照计算,逆矩阵又是必须的。一般而言,如果一个坐标系统需要收缩为0,应该使用投影矩阵,而不是模型视图矩阵。



 

      现在我们假设这样两种变换:一个物体,沿着原点绕z轴逆时针旋转45度,然后再沿x轴向下进行平移。显然,进行了这两种变换之后的物体是处于x轴上的。那么,如果这个物体先沿着x轴向下平移,然后再绕z轴进行45度的逆时针旋转,物体处在哪里呢?物体处于y = x的直线上。看起来是在做相同的操作,但是变换的顺序不同,变换的结果也是不相同的。
        上面这样的变换是因为我们固定了坐标系统,物体进行变换时,是以这个固定的坐标系统中心点为参考点的。如果换一种思路,使用一个可以局部移动的坐标系统,将会发生怎样的不同呢。所谓的局部移动坐标系统,是假设坐标系统随着物体的移动而移动。就好吧上面将的例子,移动---旋转。

     首先,假设这个物体拥有一个移动的坐标系统。当这个物体沿着x轴移动时,这个局部坐标系统也随着物体沿x轴移动。然后物体再进行旋转(沿原点),就会是绕着已经移动的局部坐标系统的原点进行旋转。旋转之后的物体在固定坐标系统中,还是处于x轴上,与旋转--移动变换效果相同。

 

 

分享到:
评论
3 楼 nanapoleon 2012-06-16  
如沐春风的小妮 写道
nanapoleon 写道
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?

那个啥,首先后面多了个逗号。。。本来就是要只写这段结尾的。。

2 楼 如沐春风的小妮 2012-06-15  
nanapoleon 写道
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?

那个啥,首先后面多了个逗号。。。本来就是要只写这段结尾的。。
1 楼 nanapoleon 2012-06-11  
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?

相关推荐

    android-openGL-canvas-master.zip

    通过学习和分析这个项目,开发者可以深入了解如何在 Android 应用中结合使用 OpenGL ES 和 Canvas,以实现高效且具有高度交互性的图形界面。同时,这也是提高图形编程能力,理解和实践现代移动设备上的图形渲染技术...

    openGl设计--3D迷宫

    OpenGL支持纹理加载和映射,开发者需要学习如何使用glBindTexture、glTexImage2D等函数来处理和应用纹理。 再者,碰撞检测是游戏中的核心部分。在3D迷宫中,玩家角色与墙壁的碰撞检测至关重要,以防止玩家穿墙或被...

    OpenGL----动态球体---源代码

    OpenGL是一种强大的图形...通过分析这个"OpenGL动态球体源代码",我们可以学习到如何使用OpenGL的基本概念和方法,以及如何实现3D对象的动态旋转效果。同时,这也是学习图形学和理解计算机图形渲染过程的一个好起点。

    OpenGL-html-funciton-manual

    170多个函数覆盖了OpenGL的核心功能,包括顶点处理(如`glVertex()`)、图元装配(`glBegin()`和`glEnd()`)、着色(`glColor()`)、投影和模型视图变换(`glTranslate()`、`glRotate()`等)、纹理映射(`glTexImage...

    opengl-自用-trackball

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。"trackball"在OpenGL中通常指的是虚拟轨道球,它是一种常见的交互式旋转视角的工具,常用于3D视图的操控。在这个...

    OpenGLES1.1-Spec

    通过这些文档,开发者可以学习到如何利用OpenGL ES 1.1的全部潜力,创建高效的3D应用程序,无论是游戏、科学可视化还是其他图形密集型应用。理解并熟练运用这些规范将有助于开发人员优化代码,提高性能,同时确保其...

    OpenGL - color-灯光.rar

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成高质量的2D和3D图像。...通过学习这个项目,开发者可以了解如何在实际应用中结合MFC和OpenGL,创建具有视觉吸引力的3D图形应用程序。

    Opengl---glm库

    OpenGL是计算机图形学中广泛使用的开源图形库,用于在各种操作系统和硬件平台上创建2D和3D图像。GLM,全称OpenGL Mathematics,是OpenGL的一个重要...通过学习和熟练掌握GLM,你可以更好地理解和利用OpenGL的强大功能。

    OpenGLES demo - 5. 深度测试

    通过对源码的学习,你可以掌握如何设置深度测试,如何在着色器中处理深度值,以及如何通过调整深度测试参数来优化渲染效果,例如避免深度冲突或实现深度预pass等高级技术。 总之,深度测试是OpenGL ES中不可或缺的...

    iOS实例开发源码——jzucker2-OpenGL-Side-Project-1974f39.zip

    项目描述虽然简短,但我们可以从中推测,开发者jzucker2创建了这个项目作为个人学习或实践OpenGL的一个边项目。版本号"1974f39"可能代表Git仓库中的一个特定提交,这表明该项目可能是在Git版本控制系统下管理的,...

    OpenGL教学程序-选取、平移、旋转

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。本教学程序“OpenGL教学程序-选取、平移、旋转”是为初学者设计的,旨在帮助他们理解如何在OpenGL环境中实现物体...

    opengl编程基础--(美)Edward Angel 源码

    3. **模型视图和投影变换**:在OpenGL中,模型视图变换用于将物体从模型空间转换到世界空间,然后到视口空间,最后通过投影变换将其映射到屏幕上的二维像素坐标。 4. **着色器**:OpenGL 3.0之后,引入了着色器语言...

    opengl游戏编程-材质实例

    1. 初始化OpenGL环境,包括设置视口、投影矩阵和模型视图矩阵。 2. 创建和设置光源,可以有多个光源,每个光源都有自己的位置、颜色和类型(点光源、方向光源等)。 3. 设定材质属性,根据需要为每个球体设定不同的...

    CH12-1、OpenGL编程入门-1

    ### OpenGL编程入门知识点详解 #### 一、概述 OpenGL是一个跨语言、跨平台的应用程序接口(API),用于渲染2D和3D...通过本节的学习,读者应该能够掌握OpenGL的基本使用方法,为进一步学习高级图形学打下坚实的基础。

    OpenGLES demo - 9. 矩阵变换

    这个示例可能包括创建顶点数组、设置模型视图投影矩阵、应用矩阵变换以及使用`glDrawArrays`绘制图形等内容。通过研究并运行这个示例,你可以更直观地理解OpenGLES中的矩阵变换是如何工作的。 总之,OpenGLES中的...

    OpenGL 作图例子 - 全屏幕

    OpenGL全屏作图示例是基于图形库OpenGL的编程实践,用于在计算机屏幕上展示全屏图像或图形。OpenGL是一个跨语言、跨平台的编程接口,主要用于渲染2D、3D矢量图形...理解并掌握这些概念对于深入学习OpenGL编程至关重要。

    MFC+OpenGL视图分割

    在IT领域,MFC(Microsoft Foundation Classes)是一个C++库,由微软开发,用于构建Windows应用程序。...这个项目对于学习和理解MFC与OpenGL的结合使用,以及如何在实际应用中实现视图分割,提供了宝贵的参考。

    opengl实验2_opengl实验2交互_

    OpenGL实验2是一个深入学习计算机图形学的实践环节,主要聚焦于使用OpenGL库进行交互式图形渲染。OpenGL是一种跨语言、跨平台的编程接口,用于渲染2D和3D图形。这个实验旨在帮助学生理解如何利用OpenGL创建动态、...

    香港某大学的openGl课件B---讲解的不错的,香港的老师很负责

    OpenGL教程是计算机图形学领域的重要学习资源,尤其对于想要深入理解3D图形编程的学者而言。这个由香港某大学提供的OpenGL课件包含了丰富的教学内容,旨在帮助学生掌握从基础的图形学理论到实际的OpenGL应用。OpenGL...

Global site tag (gtag.js) - Google Analytics