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

上一篇下一篇

猜你喜欢

热点阅读