我有一个2d对象(gl_quad),大小(w,h),位于(-w*0.5,-h*0.5)。
我不想调整对象的大小,因为我需要能够选择对象上相对于纹理的点。(即,OpenGL中的(x,y)转换为纹理上的(x,y)-无需缩放)。
我要做的是更改相机属性(投影、角度等),使对象,无论大小,显示填充屏幕最大轴。(方面适合吗?)
我可以比较屏幕大小和对象大小,没问题。我可以改变我的相机矩阵没有问题(模型视图和投影)。但我不知道如何计算查看整个对象所需的转换。
我在想:
-
平移摄影机(0,0,-1)
-
项目对象与gluproject()的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) );
}
不过,我觉得这不是一个很好的解决方案…