opegl 坐标系

今天看3D模型动画代码中,发现用四元组来进行插值和旋转,了解了使用欧拉角做旋转会有万向锁的问题存在。但这个是建立在对模型坐标系进行旋转的基础上,于是又对OGL中矩阵变化的部分再次学习了一下。发现了一篇好文章,转发学习,留供查阅。

 

 

openGL使用右手坐标

从左到右,x递增
从下到上,y递增
从远到近,z递增


--------------------------------------------------------------------------------

 

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。

当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的

 


 

OpenGL中的6种坐标系

OpenGL中存在6种坐标系,

1. Object or model coordinates

2. World coordinates

3. Eye (or Camera) coordinates

4. Clip coordinates

5. Normalized device coordinates

6. Window (or screen) coordinates

从object coordainates到world coordinates再到camera coordinate的变换,在OPENGL中统一称为model-view转换,初始化的时候,object coordinates和world coordinates还有camera coordinates坐标重合在原点,变换矩阵都为Identity。model-view matix转换points,vectorsd到camera坐标系。

 

在opengl编程中,有个困惑的问题,就是那个坐标系是不动的,我想是你想参考坐标系是不动的。比如我想建立了一个object,放到 camera坐标系中,这时,我以camera的原点为参考点。当然,我想看这个物体的时候,我就以object的原点为参考点,移动camera坐标系的原点,就可以看到object了。好像写了一堆废话,呵呵。

 

 

其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标

 

世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

 

非常重要:OpenGL 中有一个坐标变换矩阵栈(ModelView),栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)。

 

glTranslate*(x,y,z):平移,参数为各轴向的移动量。
glRotate(d,x,y,z):旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反

 

物体坐标是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

 

眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

 

同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

 

设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

 

矩阵栈切换:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

 

矩阵栈操纵命令:
glPushMatrix(); 当前矩阵入栈,这时矩阵栈将栈顶值压入栈。
glPopMatrix(); 栈顶出栈,通常与上一条命令配合使用。
glLoadIdentity(); 将栈顶设为不变矩阵(就是对角线全为1其它为0的那个)。
glMultMatrix(M);将栈顶T设为M·T。

 

 

转自:http://blog.chinaunix.net/u1/49717/showart_2263380.html

### 回答1: 首先,需要明确的是,树莓派4B是基于ARM架构的单板计算机,而Qt是一个跨平台的应用程序框架,支持多种操作系统和硬件平台。交叉编译是指在一台主机上编译适用于另一种不同的平台的程序。 要在树莓派4B上交叉编译Qt 5.12.9并支持OpenGL,需要按照以下步骤进行: 1. 准备交叉编译环境: - 在主机上安装交叉编译工具链,该工具链应该是针对ARM架构的。你可以在树莓派官网上找到相应的工具链。 - 下载Qt 5.12.9源代码并解压到主机上。可以从Qt官网下载源代码。 2. 配置编译环境: - 进入Qt源代码目录,运行`./configure`命令来配置编译选项。 - 设置交叉编译工具链路径,例如:`./configure -xplatform linux-arm-gnueabi-g++ -device linux-rasp-pi4-g++ -sysroot /path/to/sysroot`。 - 如果需要使用OpenGL,确保在配置选项中启用OpenGL相关选项,例如:`-opengl es2 -device-option CROSS_COMPILE=/path/to/cross-compiler`。 3. 编译和安装Qt: - 运行`make`命令开始编译Qt。这个过程可能会耗费一些时间,请耐心等待。 - 编译完成后,运行`make install`命令来安装Qt到指定目录。 4. 在树莓派上部署和测试: - 将编译好的Qt安装目录复制到树莓派上。 - 在树莓派上编写一个简单的Qt程序,并尝试运行以验证交叉编译是否成功,并且能够使用OpenGL功能。 需要注意的是,以上步骤只是一个简要的概述,实际操作可能会因为环境和配置的不同而有所不同。在进行此过程时,建议参考Qt的官方文档和树莓派相关的论坛、社区以获得更具体的指导和帮助。 ### 回答2: 树莓派4B 是一款强大的单板计算机,由于其资源受限,为了满足更高的性能需求,可以使用交叉编译技术在其他主机上编译运行Qt 5.12.9和OpenGL。 首先,我们需要准备一个具备足够性能的主机,用于进行交叉编译。这个主机可以是一台电脑或服务器,确保其硬件配置和性能足够强大。 接下来,我们需要在主机上安装交叉编译工具链。交叉编译工具链包括交叉编译器、交叉链接器和交叉工具等。可以根据所使用的操作系统,在主机上下载相应的交叉编译工具链。 然后,我们将Qt 5.12.9和OpenGL源代码下载到主机上。确保选取适用于树莓派4B的源代码版本,并将其解压到合适的目录中。 接着,我们可以创建一个交叉编译的目录,用于存放编译生成的可执行文件。进入该目录,并配置Qt和OpenGL的编译选项。一般情况下,我们需要指定交叉编译器、库的路径和安装的目标路径等。 然后,我们可以执行编译命令,开始交叉编译Qt和OpenGL。编译过程需要耐心等待,具体时间取决于主机的性能和网络速度。 最后,编译完成后,我们将生成的可执行文件拷贝到树莓派4B上,并安装所需的依赖库。通过相关命令启动程序,即可在树莓派4B上运行Qt 5.12.9和OpenGL应用程序。 总之,树莓派4B的交叉编译需要在性能强大的主机上进行,下载并配置好对应的交叉编译工具链,在主机上完成Qt 5.12.9和OpenGL的编译,然后将生成的可执行文件拷贝到树莓派4B上即可运行。这样可以满足树莓派4B的高性能需求,并享受到Qt和OpenGL的开发和应用的乐趣。 ### 回答3: 树莓派4B是一款强大的嵌入式系统开发板,我们可以通过交叉编译的方式在树莓派上安装和运行Qt5.12.9及其相关的OpenGL库。 首先,我们需要在PC机上准备好交叉编译环境。在电脑上安装好相应版本的Qt Creator,并下载好树莓派的交叉编译工具链。 接下来,我们需要下载Qt5.12.9的源码,并进行配置和编译。在命令行中进入Qt源码根目录,执行以下命令: ``` ./configure -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=xxx- ``` 其中,`xxx-`是你的交叉编译工具链的前缀,例如`arm-linux-gnueabihf-`。 配置完成后,执行`make -j4`命令进行编译。这里的`-j4`可以使用多线程加速编译过程,具体线程数量可以根据你的电脑配置进行调整。 编译完成后,可以将生成的Qt安装到树莓派的系统目录中。首先,将树莓派连接到电脑上,然后通过SSH登录到树莓派的终端。 在终端中执行以下命令: ``` make install ``` 这将会将编译好的Qt安装到树莓派的系统目录中。 接下来,我们需要安装OpenGL相关的库。在树莓派的终端中执行以下命令: ``` sudo apt-get install libgles2-mesa-dev ``` 这将会安装OpenGL ES 2.0 的开发包。 最后,我们可以在Qt Creator中新建一个项目,并将其部署到树莓派上进行运行调试。在Qt Creator的编译选项中,选择交叉编译工具链,并设置好Qt的安装路径以及树莓派的IP地址。 配置完成后,点击我点击“运行”即可开始在树莓派上运行Qt应用程序,并享受Qt5.12.9的强大功能以及OpenGL的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值