我有一个尺寸为(W,H)且位于(-W * 0.5,-H * 0.5)的2D物体(GL_QUAD)。
我宁愿不调整对象的大小,因为我需要能够相对于纹理选择该对象上的点。 (即openGL中的(x,y)转换为纹理上的(x,y) - 不需要缩放。)
我想要做的是更改相机属性(投影,角度等),以便无论大小如何,对象都会显示填充屏幕的最大轴。 (Aspect Fit?)
我可以比较屏幕尺寸与对象尺寸没问题。我可以改变我的相机矩阵没问题(模型视图和投影)。但我不知道如何计算我需要的转换来查看整个对象。
我在考虑:
但这似乎......计算如此密集。我有屏幕坐标和对象坐标 - 我不应该能够计算每个对象的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) );
}
我觉得这不是一个很好的解决方案,但是......
答案 0 :(得分:0)
听起来你的东西都是2D,并且真的不需要透视投影的好处,在这种情况下,正交投影会更容易使用。正交投影使得四边形很容易填充屏幕。