前言

最近自己想用C语言写一个Minecraft clone(GitHub链接:http://github.com/CharlesDong/m3c/),因为是现代OpenGL,又是C语言,GLM用不了,就要自己写OpenGL矩阵变换,发现自己对具体的变换也不了解,于是决定写一篇博客来总结.

矩阵的定义

先从2D场景说起.先从一个最简单的问题开始.

Q1:一个点P(x,y)它关于原点O的对称点为P'(x',y'),请问x',y'与x,y有什么关系?

A1

下面两个问题稍微难一些。

Q2:点绕O逆时针旋转45°,得到点P'(x', y'),求P'的坐标。

A2:设P坐标为P(x,y),且满足

由题意

P旋转45°后得到P'(x',y'),由三角函数知识可得

由公式可得

所以P'坐标为.

Q3:点P(x,y)绕O逆时针旋转且旋转角为α,得到P(x',y'),请问x',y'与x,y有什么关系?

A3:设

设P(x,y)经过某种变换之后得到点P'(x',y'),且满足,则这种变换被称为线性变换(linear transformation).为方便,我们把这种变换记作一个正方形数表

这种数表被称为矩阵(matrix)。这里这个数表是2x2的,因此被称为二阶矩阵。例如Q1中,矩阵为;Q2中,矩阵为Q3中,矩阵为

为方便,我们将点P(x,y)理解为一个从O指向P的向量,将(x,y)称为向量OP的坐标。讨论矩阵时,可以认为点P和向量OP是等价的,不区分它们。点P(x,y)经过某种变换后得到点P'(x',y'),与向量v(x,y)经过某种变换后得到向量v'(x',y')两种说法等价。

像矩阵一样,(x,y)也可以写成一列的形式

这种形式的向量被称为列向量

矩阵运算(矩阵乘向量)

如果向量v经过矩阵M的变换后得到一个新的向量v',我们为方便,就会说向量v'是矩阵M与向量v的乘积,记为v'=Mv.注意矩阵要在前面,不能写成v'=vM.

如果矩阵M1,M2分别和向量v相乘(也就是向量v经过M1,M2的变换后),得到一个新的向量v',记作.

矩阵运算(矩阵乘矩阵)

如果有3个矩阵M1、M2和M,对于向量v,M2M1v得到的结果和Mv相等,可以认为矩阵M1、M2所共同产生的变换等于矩阵M的变换。这种情况下,我们会说M1与M2的乘积等于M,用公式表示就是M1M2=M。

(to be continued)

从矩阵的定义开始谈OpenGL矩阵变换的更多相关文章

  1. OpenGL 矩阵变换

    Overview 几何数据--顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组 ...

  2. 浅谈OpenGL变换矩阵

    OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为  http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVI ...

  3. 浅谈 OpenGL 中相关阻塞问题

    昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在G ...

  4. 浅谈OpenGL之DSA

    今天准备写一篇文章简单介绍一下OpenGL4.5引入的一个新的扩展ARB_direct_state_access,这个扩展为OpenGL引入了一个新的特性就是Direct State Acess,下文 ...

  5. OpenGL矩阵变换,坐标空间变换

  6. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  7. OpenGL的glPushMatrix和glPopMatrix矩阵栈顶操作函数详解

    OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,opengl将会呈 ...

  8. OpenGL矩阵类(C++) 【转】

    http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...

  9. OpenGL入门1.5:矩阵与变换

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 在阅读本篇博客之前,你必须对向量和矩阵有基本的认识,并且能熟练进行向量和矩阵的运算 我们已经知道了如何创建一个物体.着色.加 ...

随机推荐

  1. mysql加密解密方式用法

    如果你使用的正是mysql数据库,那么你把密码或者其他敏感重要信息保存在应用程序里的机会就很大.保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为你既不能让未经授权的人员使用或者破坏应 ...

  2. TCP/IP笔记(六)TCP与UDP

    终于来到了传输层,这个面试问的最多了,内容比较多,要分两篇来总结,这是第一篇

  3. Android开发事件总线之EventBus运用和框架原理深入理解

    [Android]事件总线之EventBus的使用背景 在我们的android项目开发过程中,经常会有各个组件如activity,fragment和service之间,各个线程之间的通信需求:项目中用 ...

  4. lua 运算符

    lua 运算符 算术运算符 操作符 描述 + 加 - 减 * 乘 / 除 % 求模 ^ 求幂 示例程序 local a, b = 1, 2 print(a + b) print(a - b) prin ...

  5. spring 动态创建数据源

    项目需求如下,公司对外提供服务,公司本身有个主库,另外公司会为每个新客户创建一个数据库,客户的数据库地址,用户名,密码,都保存在主数据库中.由于不断有新的客户加入,所以要求,项目根据主数据库中的信息, ...

  6. 【从无到有】HTML的初识——part1

    Ⅰ.HTML的初识 1.HTML:超文本标签语言(网页源代码) 2.html的基本结构: <html> <head> <meta charset="utf-8& ...

  7. yii框架后台过滤器的使用 安全防护

    Yii过滤器简介 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行.例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证:性能过滤器可用于测量控制器执行所用的时间. 一个 ...

  8. Angular2.js——主从结构

    学习这一篇的内容,还回到我们快速起步的应用上来. 主从结构,我们想要做一个英雄的列表,我们希望用户在列表中选中一个英雄,然后这个被选中的英雄出现在详情视图中.主视图是英雄列表,从视图则是被选中英雄的详 ...

  9. Angular2.js——表单(上)

    表单创建一个有效.引人注目的数据输入体验.Angular表单协调一组数据绑定控件,跟踪变更.验证输入的有效性,并且显示错误信息. 接下来,主要内容有: 1.使用组件和模板构建Angular表单: 2. ...

  10. PTA自测-3 数组元素循环右移问题

    自测-3 数组元素循环右移问题  一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M≥0)个位置,即将A中的数据由(A0A1···A​N-1​​)变换为 ...