2012-05-29 5 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

내가 Y –

+0

이어서이 경우 제로이다 ndcCoor.w하여 분할을 제거한 X의 INF를 -INF 얻고 (장치 큐브의 경계의 점 때문에, 무한대 = W 간다 0) –

+0

후에 솔루션이 정확합니다. 내가 사용한 행렬은 올바른 것이 아닙니다! –

1

더 쉽게 : GLKit 수학 함수 GLKMathProject를 사용하십시오.

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

만약 UIKit을 이용 중이라면 원점 왼쪽에있을 경우, 그 y 좌표 전환되도록 좌표 원점은 왼쪽 아래에있는 것을

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

참고, 예를 들어 그게

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