Как получить CATransform3D из матриц Projection и ModelView?

all,

У меня есть проект iphone, который рисует 3D-модель с использованием OpenGL-ES для данной матрицы представления модели и задан проекционная матрица. Мне нужно было заменить 3D-модель на CALayer, поэтому я поместил значения матрицы представления модели в структуру CATransform3D и назначил ее layer.transform . Это работало хорошо, слой был виден и перемещался по экрану, как и ожидалось, но через некоторое время я понял, что поведение моих слоев недостаточно точное, и я должен учитывать матрицу проекции. И тут возникла проблема: когда я просто объединяю две матрицы, мой слой выглядит странно (он очень маленький, около 2 пикселей, при этом предполагается около 300, так как он далеко) или вообще не виден. Как я могу это решить?

Вот фрагмент кода:

- (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; 
}

Любая помощь будет принята с благодарностью.

6
задан Zapko 20 June 2011 в 05:40
поделиться