1

我无法将我的 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);

任何的想法 ?

4

2 回答 2

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;

转换。

于 2012-05-29T09:08:26.280 回答
1

更简单:使用 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);
于 2012-11-27T10:19:30.380 回答