如何更改投影以显示我的对象?

时间:2010-09-16 19:55:12

标签: c++ opengl transform projection

我有一个尺寸为(W,H)且位于(-W * 0.5,-H * 0.5)的2D物体(GL_QUAD)。

我宁愿不调整对象的大小,因为我需要能够相对于纹理选择该对象上的点。 (即openGL中的(x,y)转换为纹理上的(x,y) - 不需要缩放。)

我想要做的是更改相机属性(投影,角度等),以便无论大小如何,对象都会显示填充屏幕的最大轴。 (Aspect Fit?)

我可以比较屏幕尺寸与对象尺寸没问题。我可以改变我的相机矩阵没问题(模型视图和投影)。但我不知道如何计算我需要的转换来查看整个对象。

我在考虑:

  1. 翻译相机(0,0,-1)
  2. 项目对象与gluProject()
  3. 的4个坐标
  4. 测试屏幕rect内是否存在点。
  5. 如果没有,请转到1。
  6. 但这似乎......计算如此密集。我有屏幕坐标和对象坐标 - 我不应该能够计算每个对象的4个角之间的线所描述的立体角并将其设置为那个吗?

    谢谢,


    [编辑]

    这是另一个非优雅的解决方案:

    void View::getCamera(eq::Matrix4f& camera)
    {
        camera = eq::Matrix4f::IDENTITY;
        camera = camera * _rotation;
        camera.set_translation( _translation  );
        float longAxis = 1.0f;
    
        // Normalize Scale
        @try {
            float tH = (float)getHeight(); // texture coords
            float tW = (float)getWidth();
            float sH = getBaseFrustum().getWall().getHeight(); // screen coords
            float sW = getBaseFrustum().getWall().getWidth();
    
            float rW = tW / sW;
            float rH = tH / sH;
    
            if (rH > rW) {
    
                longAxis *= tH*2.0f;
    
            } else {
    
                longAxis *= tW*2.0f;
            }
    
        }
        @catch (...) {
            //Nothing?
            NSLog(@"Couldn't get Height or Width");
        }
    
        // Normalize Scale to Screen/Image Size
        camera.scale( eq::Vector3f(_scale/longAxis,-_scale/longAxis,1.0f) );
    }
    

    我觉得这不是一个很好的解决方案,但是......

1 个答案:

答案 0 :(得分:0)

听起来你的东西都是2D,并且真的不需要透视投影的好处,在这种情况下,正交投影会更容易使用。正交投影使得四边形很容易填充屏幕。

http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml