我无法将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);
有什么想法吗?
答案 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);