2012-03-06 76 views
2

我在使用gluOrtho2D()设置的矩阵执行所有渲染的程序中乱搞。我想要做的是在y轴(0,1,0)周围旋转一个特定的纹理,使其看起来像原始矩阵由gluPerspective()提供。我意识到,这是不可能的正投影矩阵,我将不得不建立一个新的透视投影矩阵。我希望我绘制的纹理看起来与用正交矩阵绘制时完全一样,除了有时当我将它们围绕y轴旋转时。如何找到投影矩阵相当于一个正交矩阵,但不在xy平面时给出透视图?

所以总结:
如何找到一个透视投影矩阵时的形状在xy平面绘制等同于给定正字矩阵,但给我的角度来看,当在XY平面?

+0

你为什么要这样做? – Nobody 2012-03-06 16:44:17

+0

你的总结听起来与你之前对我的说明有很大的不同。 – Nobody 2012-03-07 09:32:01

+0

前面的注意事项可能有点不清楚,但总结归结的是总结。我希望在一个大型程序中获得透视投影,该程序对所有渲染使用正交投影,同时更改最小代码量。自从我上一次参加计算机视觉课程之后的几年,所以我非常生疏。 – Leo 2012-03-07 10:24:13

回答

4

基本上我所理解的是:当物体位于XY平面中时,您希望具有与正投影相同的图像的透视矩阵。

所以,让我们开始: 你想画你的飞机在XY平面和你有gluOrtho2D(-w, w, -h, h);(非对称正投影是有点困难,如果你需要它,那么说的话)。 你现在需要做的是:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(2 * atan(h/2), w/h, 1, 3); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -2); 

我在这里做是匹配的投影视锥在XY平面,在正投影是可见的部分的中心。

就拿投影截锥和一些数学的图表,你可以自己做:)


正如一个提醒,我会离开我的回答这个老问题在这里。

要么你有正投影或透视投影。你必须决定一个。 在任何轴上旋转都不会获得透视。

为什么要改变整个程序来改变投影模式?

一个可能的解决方案: 我认为老GL不同的矩阵模式等:

glMatrixMode(GL_PROJECTION); //switch to projection matrix mode 
glPushMatrix(); //push the old matrix 
glLoadIdentity(); 
//apply the perspective projection 
//do your rendering 
glPopMatrix(); //pop the old matrix 

随着新GL方案,你将不得不这样做极本在你自己的,但它应该很容易虽然。

+0

对不起,写得不好的问题。它现在已经更新。 – Leo 2012-03-07 08:22:49

+0

该程序在为我绘制纹理时只是替换了它看起来的投影矩阵,因此我不得不放弃这个想法并编写自己的渲染代码。这回答了所问的问题,但不应该是gluPerspective(2 * atan(h/2),w/h,1,3)? – Leo 2012-03-07 14:00:46

+0

@Leo:你说的对'2 * atan'我会纠正的。关于另一个问题:我的“旧”解决方案告诉您如何保存旧矩阵并在后期恢复。 – Nobody 2012-03-07 14:04:55

0

这是可能的一些简单的方法,而不必将所有的程序转换为使用gluPerspective()?

我已经厌倦了讲这个的,但是:

投影是不是规定一个时间,然后实施对整个渲染过程。您可以随时随地切换它,而且任何先进的渲染方案都可以在单个帧中多次执行此操作。

我想大多数新人都有此困惑:

reshape(width, height): 
    glViewport(0,0,width,height) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    projection_setup() 

他们看到了重塑功能进行投影,并认为这是做到这一点的唯一地方。 请跟我说话: 投影矩阵仅仅是用于绘制作为别的一些状态。它可以像当前的颜色或纹理一样容易地改变。

只需设置你需要,你需要它,你做的提款权之前绘图命令的一定顺序的投影。

+0

对不起,我意识到我的问题写得很差,因为我很急。我想要的是一个投影矩阵,它为xy平面中绘制的对象提供与旧的正交矩阵相同的外观,但给出不在xy平面中的对象的透视投影。 – Leo 2012-03-07 08:22:22

0

,能够有立体效应,即围绕x轴或y轴旋转时,即使你的投影矩阵为正交,诀窍是将多个视图矩阵由该魔术基质之前/之后的任何其它视图变换:

// The matrix is 
// -z, 0, x, 0 
// 0, -z, y, 0 
// 0, 0, 1, 0 
// 0, 0, 1, -z 

其中:

  • x是半视口宽度,
  • y是半视口的高度,
  • z可能是除-0之外的任何负数。

几个注意事项:

  1. 如果u R电话glRotate *,这个矩阵先走,因为这些内置电话是右手乘法。如果您使用左手乘法跟踪您自己的视图矩阵,如文本书中所建议的,则此矩阵将持续最后一次。无论是哪种方式,这个矩阵实际上将通过您的正交投影矩阵相乘,所以美国可以预先计算以及
  2. ž实际上是模拟Z-深处,所以更大的是在规模,进一步对象是,作为一个后果,旋转看起来更像是正字法。 Z不能是积极的,因为这会令w的NDC负时,OpenGL不允许,它会被裁剪所以没有什么会画
  3. 最后,没有魔法,这个矩阵仅仅是一个弥补,U之后做: M(邻)XM(魔术),u得到的立体矩阵
  4. 这招是至关重要的,如果你的代码的99%是正字,但只有一个地方或两个需要透视效果,则U不需要之间切换两种模式,如果乌拉圭回合使用固定管道,GL_PROJECTION_MATRIX将保持不变
  5. 这个矩阵是由Android开源项目采取所以希望这将要给你多少信心