从矩阵的定义开始谈OpenGL矩阵变换
前言
最近自己想用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矩阵变换的更多相关文章
- OpenGL 矩阵变换
Overview 几何数据--顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组 ...
- 浅谈OpenGL变换矩阵
OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为 http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVI ...
- 浅谈 OpenGL 中相关阻塞问题
昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在G ...
- 浅谈OpenGL之DSA
今天准备写一篇文章简单介绍一下OpenGL4.5引入的一个新的扩展ARB_direct_state_access,这个扩展为OpenGL引入了一个新的特性就是Direct State Acess,下文 ...
- OpenGL矩阵变换,坐标空间变换
- OpenGL矩阵类(C++)
概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...
- OpenGL的glPushMatrix和glPopMatrix矩阵栈顶操作函数详解
OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,opengl将会呈 ...
- OpenGL矩阵类(C++) 【转】
http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...
- OpenGL入门1.5:矩阵与变换
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 在阅读本篇博客之前,你必须对向量和矩阵有基本的认识,并且能熟练进行向量和矩阵的运算 我们已经知道了如何创建一个物体.着色.加 ...
随机推荐
- Named function expressions demystified
Introduction Surprisingly, a topic of named function expressions doesn't seem to be covered well eno ...
- 1.6 在WHERE子句中引用取别名的列
如下查询,会抛出错误:mysql> select sal as salary, comm as commission from emp where salary < 5000;ERROR ...
- 【转载】 stm32之PWM
发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...
- stl_alloc.h分配器
五.分配器:5.1.头文件: 5.1.1.include<stl_alloc.h> //内存的分配. 5.1.2.include<stl_construct.h> //对象的构 ...
- Laravel 5.2 教程 - 迁移
一.简介 迁移(Migrations)是一种数据库的版本控制.可以让团队在修改数据库结构的同时,保持彼此的进度一致.迁移通常会和 结构生成器 一起使用,可以简单的管理数据库结构. 下面以创建学生表的迁 ...
- 蓝桥杯- 奇妙的数字-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 十分钟彻底理解javascript 的 this指向,不懂请砸店
函数的this指向谁,和函数在哪里被定义的,函数在哪里被执行的没有半毛钱关系,只遵守下面的规律: 在非严格模式中: 1.自执行函数里面,this永远指向window; <script> v ...
- Java Socket应用---通信是这样练成的
网络基础简介 Java 中网络相关 API 的应用 Java 中的 InetAddress 的应用 Test01.java package com.imooc; import java.n ...
- windows下配置mysql数据库主从
所用到工具: Mysql.Navicat Premium: 主库设置: 一.设置my.ini 文件: 1.在安装目录下找到my.ini 文件: 默认路径:C:\Program Files\MySQL\ ...
- ng-options语法详解
我们先看下options的这条语句 ng-options="value.id as value.label group by value.group for value in myOptio ...