Como obter o CATransform3D das matrizes Projection e ModelView?
todos
Eu tenho um projeto para iphone que desenha um modelo 3D usando o OpenGL-ES para uma determinada matriz de visualização de modelo e matriz de projeção. Eu precisava substituir o modelo 3D pelo CALayer, então coloquei valores da matriz de visualização do modelo na estrutura CATransform3D e o atribuai alayer.transform
. Funcionou bem, a camada estava visível e foi movida na tela conforme o esperado, mas depois de algum tempo percebi que o comportamento das minhas camadas não era suficientemente preciso e eu deveria levar em consideração a matriz de projeção. E então surgiu um problema: quando eu simplesmente concatenar duas matrizes, minha camada parece estranha (é muito pequena, cerca de 2 pixels, enquanto deveria ser cerca de 300, pois está muito distante) ou não é visível. Como posso resolver isso?
Aqui está o trecho de código:
- (void)adjustImageObjectWithUserInfo:(NSDictionary *)userInfo
{
NSNumber *objectID = [userInfo objectForKey:kObjectIDKey];
CALayer *layer = [self.imageLayers objectForKey:objectID];
if (!layer) { return; }
CATransform3D transform = CATransform3DIdentity;
NSArray *modelViewMatrix = [userInfo objectForKey:kModelViewMatrixKey];
// Get raw model view matrix;
CGFloat *p = (CGFloat *)&transform;
for (int i = 0; i < 16; ++i)
{
*p = [[modelViewMatrix objectAtIndex:i] floatValue];
++p;
}
// Rotate around +z for Pi/2
transform = CATransform3DConcat(transform, CATransform3DMakeRotation(M_PI_2, 0, 0, 1));
// Project with projection matrix
transform = CATransform3DConcat(transform, _projectionMatrix);
layer.transform = transform;
}
Qualquer ajuda será apreciada