2012-05-29 206 views
1

我無法將我的OpenGL場景座標轉換爲我的屏幕座標。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); 

任何想法?

回答

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; 

轉換。

+0

隨着該我得到-inf,INF爲X,Y –

+0

由ndcCoor.w它是一個零在此情況下然後取出分裂(單位立方體的邊界上的點爲無窮大,從而W = 0) –

+0

之後,你的解決方案是確切的。我使用的矩陣不是正確的! –

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