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;
}
Любая помощь будет принята с благодарностью.