【问题标题】:OpenGL perspective projection to map the screen pixelsOpenGL透视投影映射屏幕像素
【发布时间】:2013-07-23 09:01:52
【问题描述】:

我正在尝试在 OpenGL 中设置透视投影,使其精确映射到屏幕像素,就像我们可以在正交投影中那样。我可以针对特定的屏幕尺寸执行此操作,例如 640x960,但不能针对任何屏幕尺寸执行此操作。下面是我用来设置 640x960 尺寸的代码

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
Matrix4f perspective( Matrix4f::perspective( 60.0f, ( size.width / size.height ), 0.5f, 1500.f ) );
Matrix4f lookAt( Matrix4f::lookAt( size.width / 2.0f, size.height / 2.0f, size.height / 1.1566f, size.width / 2.0f, size.height / 2.0f, 0.0f, 0.0f, 1.0f, 0.0f ) );
Matrix4f m( ( perspective * lookAt ).translate( -( size.width / 2.0f ), -( size.height / 2.0f ), -( size.height/ 1.1566f ) ) );
glLoadMatrixf( m.get() );

这适用于 640x960 分辨率,但不适用于 1024x768 等任何其他分辨率。在其他分辨率下,它并不完全映射到屏幕像素。

我想设置透视投影,因为我也想提供沿 x 和 y 轴旋转精灵的能力。

【问题讨论】:

    标签: c++ opengl projection perspective


    【解决方案1】:

    我正在尝试在 OpenGL 中设置透视投影,使其精确映射到屏幕像素

    就其本质而言,这种映射只适用于某个特定深度。对于所有其他人,它根本无法将视图 X,Y 映射到视口 X,Y

    我想设置透视投影,因为我也想提供沿 x 轴和 y 轴旋转精灵的能力。

    没有什么能阻止您使用正射投影。

    【讨论】:

    • 是的,我只想为所有对象使用一个深度值,例如 0.0f。在正射投影中,沿 x 或 y 轴的旋转看起来并不真实。它所做的只是改变宽度/高度。
    • @user2206696:那么在这种情况下,透视是有意义的。但是,您应该直接使用构建截锥体,而不是让透视函数为您完成。另外,lookAt 完全是矫枉过正,一个简单的 translate(0,0,-near) 就足够了。投影(平截头体或正交)也属于投影矩阵,而不是模型视图。
    • 谢谢,请告诉我如何设置投影以映射屏幕像素?
    • @user2206696:在透视情况下,不能“设置投影以映射屏幕像素”。可以做的是在某个深度平面上“映射屏幕像素”(类似于正交投影通常用于获取“像素坐标”的方式)。这就是你想要的吗?
    • 好的,假设我创建了一个 1024x768 的窗口。我想设置一个透视投影,这样当我将精灵定位在 (0, 0, 0) 时,它应该从窗口的左下角渲染。然后假设我创建另一个大小为 800x600 的窗口,重新计算该窗口的投影,当我在 (400, 300, 0) 处渲染精灵时,它应该从窗口的中心渲染。
    【解决方案2】:

    似乎问题出在乘法顺序上。上面的代码现在可以在任何分辨率下正常工作。

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 1970-01-01
      • 2013-11-26
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多