[转载]GLKit 矩阵变换:自转公转

2023-10-20 20:20

本文主要是介绍[转载]GLKit 矩阵变换:自转公转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:iTyran原创作品,谢绝转载!否则将追究法律责任。
在上一篇文章[iTyran原创]Xcode创建的默认iOSOpenGL ES 2.0 project代码分析中,
我跳过了- (void)update函数里面的矩阵变换分析,在这里我们来研究下这里干了些什么事情。

1.预备知识。
OpenGL ES 中有两套矩阵,都是4×4的GLfloat矩阵。一个叫modelview matrix ,你大部分时间都会与之打交道。它是你用来对虚拟世界进行变换的矩阵。要对虚拟世界中的物体进行旋转,转移或尺寸变化,你都需要对此矩阵进行修改。

另一个矩阵用来创建根据设定的视口(参考从零开始学习OpenGLES之三 – 透视)对世界坐标进行描述的二维表示。此矩阵称为 projection matrix 。在绝大部分时间内,你都不需要接触该矩阵。

一个3×3的矩阵可以描述绕任意轴旋转任何角度的情况。然而,为表示可能遇到的任何变换,我们仍然需要第四行/列。第四列用来保存变换信息,第四行用来表示透视变换。
至于第四行/列如何在矩阵变换中起到神奇的作用,那些令人你头痛的问题数学家门帮我们解决了。我们理解如何使用就好。

2.创建 projectionMatrix
视口矩阵使用GLKit是很简单的事情。

float aspect = fabsf(self.view.bounds.size.width /self.view.bounds.size.height);
GLKMatrix4 projectionMatrix =GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), 
aspect, 0.1f,100.0f);

首先是计算屏幕的宽高比aspect。我们的OpenGL ES程序是全屏的,所以这里直接使用self.view.bounds.size里面的值就能表示屏幕宽高。

GLKMatrix4MakePerspective有4个参数。
参数1:视角,要求输入幅度,GLKMathDegreesToRadians帮助我们把角度值转换为幅度。
参数2:算屏幕的宽高比,如果不正确设置,可能显示不出画面。
参数3:near,
参数4:far
near和far共同决定了可视深度,都必须为正值,near一般设为一个比较小的数,far必须大于near。

我们做个测试,把far值改为4,你会看到如下的效果。

你会发现正方体不能显示完全,有一部分看不到了。

3.baseModelViewMatrix公转
还记得笛卡尔坐标系吧,回顾下这里:http://ityran.com/article-3-1.html

GLKMatrix4 baseModelViewMatrix =GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f);

观察gCubeVertexData数据,正方体是围绕原点展开的。这里把物体往-z方向移动4个单位。

baseModelViewMatrix =GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);

GLKMatrix4Rotate做矩阵旋转
它有5个参数:
参数1:传入矩阵,被变化的矩阵
参数2:旋转的角度。正值逆时针旋转。
参数3~5:共同组成一个向量,围绕这个向量做旋转。

这里我们还是做一个测试,把向量参数变成1.0f, 0.0f, 0.0f
这时候正方体将围绕x轴旋转。如下图:


4.modelViewMatrix 自转 + 公转
// -1.5f和shader2的1.5f间隔开一个距离

modelViewMatrix = GLKMatrix4MakeTranslation(0.0f,0.0f, -1.5f);

//自转

modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix,_rotation, 1.0f, 1.0f, 1.0f);

//公转自转作用在一起。

modelViewMatrix =GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

SHADER_1通过下面的方式设置projectionMatrix和modelviewMatrix。

self.effect.transform.projectionMatrix =projectionMatrix;
self.effect.transform.modelviewMatrix = modelViewMatrix;

modelViewMatrix最终会和gCubeVertexData里面的每个点的position信息相乘,得出一个新的正方体坐标。

SHADER_2稍有不同,可编程着色器自己实现光线代码的计算,又多了些矩阵变换。

//GLKMatrix4GetMatrix3 upper-left 3x3 section of a4x4,左上角
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix),NULL);
_modelViewProjectionMatrix =GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);

具体这段代码如何结合Shader.vsh里面的代码实现的变化有待进一步研究。


由于OpenGL ES 2.0 对GLKit 的引入,使得矩阵变换更加简单。而Xcode创建的默认iOS OpenGL ES 2.0 project很好的展示了这些用法,是很值得学习的。

转载于:https://www.cnblogs.com/PursuitOnly/archive/2013/02/07/2908883.html

这篇关于[转载]GLKit 矩阵变换:自转公转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249486

相关文章

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

提问的智慧(转载)

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~   ---------------------------------      在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。       首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

【UVA】10003-Cutting Sticks(动态规划、矩阵链乘)

一道动态规划题,不过似乎可以用回溯水过去,回溯的话效率很烂的。 13988658 10003 Cutting Sticks Accepted C++ 1.882 2014-08-04 09:26:49 AC代码: #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include