OpenGL场景坐标到屏幕坐标

时间:2012-05-29 09:02:34

标签: opengl coordinates glkit

我无法将OpenGL场景协调转换为我的屏幕坐标。

我认为我需要将我的坐标与模型视图矩阵相乘,然后使用投影矩阵来获得ndc。但我得到了奇怪的坐标。

这是我的一段代码

GLKVector3 coor = GLKVector3Make(point.x, point.y, 0);
GLKMatrix4 modelview = GLKMatrix4MakeWithArray(glProjectionMatrix);
GLKMatrix4 projetion = GLKMatrix4MakeWithArray(modelViewMatrix.data);

GLKVector3 eyeCoor = GLKMatrix4MultiplyVector3(modelview, coor);
GLKVector3 ndcCoor = GLKMatrix4MultiplyVector3(projetion,eyeCoor);

CGPoint p = CGPointMake(ndcCoor.x, ndcCoor.y);

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

代码似乎完全有效,但您应该使用4D向量进行这些同构变换。

所以,

GLKVector4 coor = GLKVector4Make(point.x, point.y, 0, 1);

/// I hope those matrices are fine
GLKMatrix4 modelview = GLKMatrix4MakeWithArray(glProjectionMatrix);
GLKMatrix4 projetion = GLKMatrix4MakeWithArray(modelViewMatrix.data);

GLKVector4 eyeCoor = GLKMatrix4MultiplyVector4(modelview, coor);
GLKVector4 ndcCoor = GLKMatrix4MultiplyVector4(projetion,eyeCoor);

float XScr = ndcCoor.x / ndcCoor.w;
float YScr = ndcCoor.y / ndcCoor.w;

CGPoint p = CGPointMake(XScr, YScr);

如果您希望XScr和YScr在[0..1]范围内,请添加

XScr = (XScr + 1.0f) * 0.5f;
YScr = (YScr + 1.0f) * 0.5f;

转换。

答案 1 :(得分:1)

更简单:使用GLKit Math函数GLKMathProject。

GLKVector3 GLKMathProject (
   GLKVector3 object,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport
);

所以,在你的情况下,例如。

int viewport[] = {0, 0, 320, 480};
GLKVector3 windowVector = GLKMathProject(coor, modelview, projetion, viewport);
CGPoint p = CGPointMake(windowVector.x, windowVector.y);

请注意,原点位于左下方,因此如果您使用原点位于左上角的UIKit坐标,则切换y坐标,例如

CGPoint p = CGPointMake(windowVector.x, window.bounds.size.height - windowVector.y);