OpenGL场景坐标转换为屏幕坐标(OpenGL scene coordinates to scre

2019-09-17 13:56发布

我无法将我的OpenGL场景coordiates我的屏幕坐标。

我想我需要加倍重视自己的坐标与模型视图矩阵然后用投影矩阵,以获得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);

任何想法 ?

Answer 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;

转换。



Answer 2:

更简单:使用GLKit数学函数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);


文章来源: OpenGL scene coordinates to screen coordinates