OpenGL ES 3D世界坐标转换为屏幕坐标
2019-01-16 本文已影响24人
X1aoHey
- (CGPoint)worldToScreen:(GLKVector4)vector
{
GLKMatrix4 mvp = GLKMatrix4Multiply(GLKMatrix4Multiply(_projectionMatrix, _cameraMatrix), _modelViewMatrix) ;
GLKVector4 ndc = GLKMatrix4MultiplyVector4(mvp, vector);
float x = ndc.x / ndc.w;
float y = ndc.y / ndc.w;
float k1 = self.frame.size.width / 2 ;
float k2 = -self.frame.size.height / 2;
float b1 = k1;
float b2 = -k2;
x = k1 * x + b1;
y = k2 * y + b2;
CGPoint p = CGPointMake(x, y);
return p;
}
基本思路:
Position * ModelMatrix * ViewMatrix * ProjMatrix,之后再进行Viewport映射就好了
Position 是本地坐标空间
ModelMatrix 是模型矩阵
ViewMatrix 是视区矩阵(观察矩阵,又叫相机矩阵)
ProjMatrix 是投影矩阵
上面的vector 是3D坐标补齐W值之后的四维向量,如坐标为(5,30,23),对应的四维向量为(5,30,23,1)。