OpenGL中的坐标系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL中的坐标系相关的知识,希望对你有一定的参考价值。

参考技术A OpenGL中坐标系主要分为两大类

如图所示

右手系需要遵循右手法则,左手系需要遵循左手法则

而我们常用的坐标系主要有以下几种

在物体成像到屏幕的过程中,需要经过这三个坐标系的相互转换,惯性坐标系是物体坐标系向世界坐标系转换的”重点“

如图所示

即 3D物体转换成2D图像的变化过程

在这个变换过程中,属于OpenGL定义的坐标系有3个

属于用户自定义坐标系同样也有3个

其中下列的变换操作是用户可以自定义变换的,即可以由用户根据需要自行制定,这些变换使在顶点着色器中完成

以下两种是属于OpenGL 中的变换,即由OpenGL自动执行,在顶点着色器处理后的阶段完成

如何在OpenGL中的对象空间坐标中获得近剪裁平面坐标

【中文标题】如何在OpenGL中的对象空间坐标中获得近剪裁平面坐标【英文标题】:how to get the near clipping plane coordinates in object space coordinate in OpenGL 【发布时间】:2013-02-17 03:47:10 【问题描述】:

我正在渲染一个有 8 个顶点的立方体。当我旋转或靠近立方体时,一些顶点可能会被近剪裁平面剪裁。但是,出于某种原因,在我的问题中,我需要找到立方体边缘与近剪裁平面的交点。我知道分数可能会有所不同。所以我想的是获得近剪裁平面(可能在眼睛空间 - 但如何?)并对矩阵进行一些逆计算以获得我的立方体对象空间中的坐标,然后我可以找到交叉点并解决我的问题。但这里的问题是:

    如何获得近剪裁平面每个角的坐标? (或平面方程系数) 如何返回对象空间?

测试:

作为测试我是否可以正确获取坐标,我尝试了这个: 我试图做的是得到 MVM(ModelView Matrix)和 PM(Projection Matrix)的倒数。并试图想象具有 V1 = (-1,-1,-1,1), V2 = (1, -1, -1, 1), V3 = (1, 1, -1, 1) 的近剪裁平面, 和 V4 = (-1, 1, -1, 1) 坐标。所以我在想如果我对四个顶点中的每一个都这样做:

V1 = IMVM * ( IPM * V1 );

V2 = IMVM * (IPM * V2);

V3 = IMVM * ( IPM * V3 );

V4 = IMVM * (IPM * V4);

其中 IMVM 是模型视图矩阵的逆矩阵,IPM 是投影矩阵的逆矩阵。 然后,当我使用当前加载的矩阵(我只是使用了逆矩阵)渲染这四个点时,我应该在屏幕前看到一个站立的窗台正方形,因为我的逆乘法应该被与 openGL 当前加载的矩阵的乘法相抵消.但由于某种原因它不起作用,我尝试转置和正常。我注意成为专栏专业等。但它似乎不起作用,而不是得到一个静止的 suqare(代表我的近剪裁平面)我得到一个不断移动和跳跃的飞机!

【问题讨论】:

scratchapixel.com/lessons/3d-basic-rendering/… 【参考方案1】:

看来我在这个论坛上的所有问题都将由我自己来回答!首先经过思考,我意识到我们不需要投影矩阵的逆。我们指定相机空间中的点并将它们带回对象空间,我们只需要模型视图矩阵的逆矩阵。

与总是会导致您死亡的错误一样,我的向量矩阵乘法计算中存在逻辑错误。当我用在线矩阵计算器仔细检查时,我意识到我的第一个元素是正确的,但其余元素是不正确的。那时我突然想到,我将结果存储在与我相乘的同一矩阵中,因此我只是改变了原始矩阵。所以我只是为结果添加了一个新矩阵,一切正常。基本上我指定了一个点,然后将它乘以模型视图矩阵的倒数,得到对象空间坐标中的点。

【讨论】:

以上是关于OpenGL中的坐标系的主要内容,如果未能解决你的问题,请参考以下文章

openGL中的坐标系

裁剪坐标系和标准化设备坐标系(OpenGL)中的裁剪

openGL中的坐标系

OpenGL入门(四)-- OpenGL坐标系与坐标变换

Android--OpenGL坐标系

Android--OpenGL坐标系