Opengl 如何在二维正交投影中变换输入坐标?

Opengl 如何在二维正交投影中变换输入坐标?,opengl,matrix,graphics,glm-math,Opengl,Matrix,Graphics,Glm Math,我通过glm::ortho函数生成变换矩阵。 我想要中间的原点,[编辑] x轴向右,y向上。[/编辑] < /P> 这在绘图时效果很好,但每当我从窗口获得鼠标输入时,(0,0)位于左上角 处理此转换的一般方法是什么? 我现在用的是一种非常特别的方式 y= sizey-y; x-=sizex/2; y-=sizey/2; 处理这一问题的一般方法是: 这将生成以下矩阵: 您可以将输入坐标乘以该矩阵进行变换,但问题中的原始坐标要简单得多。您描述的坐标仅使用投影矩阵是不可能的。

我通过glm::ortho函数生成变换矩阵。
我想要中间的原点,[编辑] x轴向右,y向上。[/编辑] < /P> 这在绘图时效果很好,但每当我从窗口获得鼠标输入时,(0,0)位于左上角

处理此转换的一般方法是什么?
我现在用的是一种非常特别的方式

    y= sizey-y;
    x-=sizex/2;
    y-=sizey/2;
处理这一问题的一般方法是: 这将生成以下矩阵:
您可以将输入坐标乘以该矩阵进行变换,但问题中的原始坐标要简单得多。

您描述的坐标仅使用投影矩阵是不可能的。X轴水平,Y轴垂直。您需要一个视图矩阵来更改预转换坐标的方向。我不这么认为,但我会尝试。。。你想让Y指向右边,让X指向上。投影本身无法做到这一点,您需要围绕Z轴旋转坐标90度才能做到这一点。但是旋转不是使用glm::ortho构建的投影矩阵的一部分,这是视图矩阵的责任。你可以将这两个元素相乘,得到一个矩阵,但实际上你有多个变换,它不再是一个纯粹的投影矩阵。好的,那么我必须从正交矩阵导出视图矩阵?这应该和我目前的方法一样迟钝。我一直在寻找一些巧妙的解决方案,包括倒数……等等:(不,这两者是完全分开的。这里的基本问题是,在剪辑-/NDC-/window空间中,Y轴始终垂直,X轴水平。我真的不知道,如果要匹配鼠标坐标,为什么要这样旋转坐标90度——它们使用水平X轴和垂直Y轴。噢,天哪天哪,那是个错误。抱歉,y向上x向右约定是可以的。一般来说,我的意思是,假设我稍后将选择更改为另一个坐标系。我如何避免再次手动执行此操作?如果你想获得技术性的知识,你可以从视口和投影矩阵中导出此转换。这实际上是无投影的坐标,这是一个定义良好的过程,
glm
可以帮助您使用一个字面上被称为
unProject
的函数。同样,这是一种过分的做法,因为它需要大量计算,但在任何情况下都会起作用。诀窍是在调用该函数时使用
模型
的身份矩阵,我建议使用
win.z
=-1.0(或者在创建投影矩阵时对近平面使用的任何值)。
Translate (-sizex/2, sizey/2, 0.0); // Y translation:  -sizey/2 + sizey = sizey/2
Scale     ( 1.0,        -1.0, 1.0);
|1.0  0.0 0.0 0.0|   |1.0 0.0 0.0 -sizex/2|     |1.0  0.0 0.0 -sizex/2|
|0.0 -1.0 0.0 0.0| * |0.0 1.0 0.0  sizey/2|  =  |0.0 -1.0 0.0 -sizey/2|
|0.0  0.0 1.0 0.0|   |0.0 0.0 1.0   0.0   |     |0.0  0.0 1.0    0.0  |
|0.0  0.0 0.0 1.0|   |0.0 0.0 0.0   1.0   |     |0.0  0.0 0.0    1.0  |