我有一个OpenGL渲染,它是矩形的,即没有厚度。通过UI控件,可以对渲染应用许多变换,例如:
在任何时间点,我都可以得到变换矩阵,它给出了所应用的任何上述变换的累积效果。
如何使用变换矩阵来确定渲染(例如,中心)到z平面上任何点的原点和投影之间的距离?
答案 0 :(得分:2)
假设您熟悉矩阵&向量代数...
概念你应该做这样的事情:
float Distance(int width, int height const mat4& TransformMatrix, const vec2& center)
{
vec4 point(center,0,1);
vec4 transformed = TransformMatrix * point;
float w = transformed.w;
if (abs(transformed.x)>w || abs(transformed.y)>w || abs(transformed.z)>w)
return -1.0; // point is out of clipping volume
vec4 projected = transformed / transformed.w;
projected.x *= width *0.5;
projected.y *= height *0.5;
// assuming origin point is in viewport center
return length(projected.x,projected.y);
}
如果您使用的是OpenGL< 3.0或OpenGL ES< 2.0然后上面的矩阵可以通过以下方式确定:
float modelview[16], projection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
glGetFloatv(GL_PROJECTION_MATRIX, projection);
所有OpenGL都提供了视口尺寸:
int viewport[4]; // width = viewport[2], height = viewport[3]
glGetIntegerv(GL_VIEWPORT, viewport);
您还可以使用一些oldskull GLU函数: gluProject() - >计算由ModelView和&amp ;;转换的点位置。以像素为单位的投影和视口。