OpenGL列主元矩阵的运算
代码中使用列主元还是行主元?当然都可以。如果是行主元,在void glUniformMatrix4x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);中transpose是GL_TRUE。无论是行主元还是列主元,在glUniformMatrix4fv的作用下,都统一为列主元,因此着色器代码是相同的。读法是先读列再读行,比如glUniformMatrix2x4fv的意思是要传入一个2列4行的矩阵。
经常会遇到例子代码的主元和自己工程的主元不一致的情况,如何进行调整?
举个例子:Assimp里对矩阵的读取的aiMatrix4x4t矩阵是行主元的,要读进(列主元的)glm::mat4中,需要做一个transpose转置操作,将行主元变为列主元。
如果例子代码里有的:aiMatrix4x4t mx = m1 * m2 * m3;//m1, m2, m3都为行向量,那么在glm的环境下应该怎么做呢:
m1 = glm::transpose(m1);
m2 = glm::transpose(m2);
m3 = glm::transpose(m3);
glm::mat4 mx = m1 * m2 * m3;//为什么不是m3 * m2 * m1?不是(A*B)T=(B)T * (A)T吗?
因为在glm中,m1 * m2的计算是拿m1的第i列与m2的第j行相乘,并不是像行矩阵里的规则m1的第i行和m2的第j列相乘。下面是矩阵的等价运算规则。GL_FALSE是指的glUniformMatrix4x4fv的transpose参数。你们可以使用1*2和2*3的矩阵测试一下,比较清晰。
| 项之间的乘积 | m1,m2为行主矩阵 | (m1)T,(m2)T为列主矩阵 |
| 左边的i行x右边的j列 | m1*m2,GL_TRUE | (m2)T*(m1)T,GL_FALSE |
| 左边的i列x右边的j行 |
m2*m1,GL_TRUE |
(m1)T*(m2)T,GL_FALSE |
注意:存储都是以行进行存储的。这里不是说用行依次存储每一列,而是用行存储每一列的相应行的项。比如一个列主元矩阵是由4个列向量构成(a11, a12, a13, a13), (a21, a22, a23 ,a24), (a31, a32, a33, a34), (a41, a42, a43, a44),那么存储的时候是以数组(a11, a21, a31, a41), (a12, a22, a32, a42), (a13, a23, a33, a43), (a14, a24, a34, a44)存储,通过glUniformMatrix4fv传递的数据序列为(a11, a21, a31, a41, a12, a22, a32, a42, a13, a23, a33, a43, a14, a24, a34, a44),在传递到shader时,还原为列向量形式,然后与顶点等进行乘积。在instance效果中,将matrxi的每一行作为顶点属性,在shader中依然还原为列向量的矩阵。顶点向量被认为是行向量。
OpenGL列主元矩阵的运算的更多相关文章
- OpenGL列主元矩阵和列主序存储
OpenGL矩阵要考虑两个点,一个是向量如何排布,一个是矩阵如何存储和恢复. 1.排布 排布决定了运算的顺序.OpenGL使用的是列主元,它的意思就是一个4X4的矩阵是由4个列向量构成(这里的v1,v ...
- ogre, dx, opengl坐标矩阵
opengl 右手坐标系 列向量 左乘 列主序存储矩阵osg 右手坐标系 行向量 右乘 行主序存储矩阵d3d 左手坐标系 行向量 右乘 行主序存储矩阵ogre 右手坐标系 列向量 ...
- Opengl中矩阵和perspective/ortho的相互转换
Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...
- OpenGL投影矩阵
概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...
- C#的winform矩阵简单运算
C#的winform矩阵简单运算 程序截图 关键代码 using System; using System.Collections.Generic; using System.ComponentMod ...
- HDU 2276 Kiki & Little Kiki 2(矩阵位运算)
Kiki & Little Kiki 2 转载自:点这里 [题目链接]Kiki & Little Kiki 2 [题目类型]矩阵位运算 &题意: 一排灯,开关状态已知,每过一秒 ...
- OpenGL投影矩阵【转】
OpenGL投影矩阵 概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它 ...
- 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...
- OpenGL的矩阵使用——绘制桌子
其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小). 桌子的模型尺寸如 ...
随机推荐
- 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")
一.利用select多路复用I/O的Web服务应用模型 /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...
- 解决linux联网问题的方法论
解决linux联网问题的方法论 */--> 解决linux联网问题的方法论 Table of Contents 1. ip网络配置流程 1.1. 1.确认电脑能和路由器ping通 1.2. 2. ...
- mongodb使用mongoose分组查询
一个分组查询的例子: model.aggregate([{$match: ops}, {$unwind: '$details'}, {$sort: {create_at: -1}}, { $group ...
- iis7 php urlrewrite 并隐藏index.php
<rewrite> <rules> <rule name="OrgPage" stopProcessing="true"> ...
- 【转】java.util.vector中的vector的详细用法
[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...
- JavaScript 数组方法总结
最近公司没项目.所以所幸学学JS.毕竟很多人和我一样.属于培训机构出来的.JS基础也很差. 面试的时候面试官问你 .你会JS不.你会毫不犹豫的回答会.因为你确实用过.但是真正会的或许只是以前项目中需要 ...
- sharepoint 删除list里的所有内容
[System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") $siteUrl = " ...
- 【原创】java 流星划过天空
import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...
- redirect_uri参数错误解决方法
坑,微信改来改去的,找死人了,以前在“开发者中心”中,现在改在”接口权限“中了.
- 如何入侵Linux操作系统
我发现了一个网站,于是常规入侵.很好,它的FINGER开着,于是我编了一个SHELL,aaa帐号试到zzz(by the way,这是我发现的一个网上规律,那就是帐号的长度与口令的强度成正比, 如果一 ...