代码之家  ›  专栏  ›  技术社区  ›  Stephen Furlani

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

  •  1
  • Stephen Furlani  · 技术社区  · 14 年前

    我有一个2d对象(gl_quad),大小(w,h),位于(-w*0.5,-h*0.5)。

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

    我要做的是更改相机属性(投影、角度等),使对象,无论大小,显示填充屏幕最大轴。(方面适合吗?)

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

    我在想:

    1. 平移摄影机(0,0,-1)
    2. 项目对象与gluproject()的4个坐标
    3. 测试屏幕矩形内是否存在点。
    4. 如果没有,转到1。

    但那似乎…计算如此密集。我有屏幕坐标和对象坐标——我不应该计算出每个对象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 回复  |  直到 14 年前