Как установить центр вращения анимации CATransformLayer
У меня есть представление с его нижележащим слоем, и я добавляю CATransformLayer к слою представления:
[view.layer addSublayer: transformLayer];
Мой добавленный слой содержит все виды подслоев, представляющих отдельные стороны нескольких трехмерных блоков. Я хотел бы применить анимацию к слою, чтобы вращать блоки.
CATransform3D rotation = CATransform3DMakeRotation(deg * M_PI / 180, x, y, z);
[CATransaction begin];
[(CATransformLayer *)[pView.layer.sublayers objectAtIndex:0] setSublayerTransform:rotation];
or (both seem to produce the same result)
[(CATransformLayer *)[pView.layer.sublayers objectAtIndex:0] setTransform:rotation];
[CATransaction commit];
Проблема в том, что слой вращается примерно вокруг переднего угла вместо центра кубов (см., Например, ниже).
/ \ / \
/ \ / \ / \ / \ / \
/ \ / \ |\ / \ /| |\ / \ /|
|\ / \ /| | |\ /| | | |\ /| |
| |\ /| | \| | |/ \ OR / \| | |/
|\| | |/| ==> \|/ \ / \ / \ / \|/
|1|\|/|B| |\ / \ /| |\ / /|
\|2|A|/ |A|\ /| | | |\ /|2|
\|/ \|B| |/ \| |1|/
\|/ \|/
Метки A/B должны переместиться в положения 1/2, или 1/2 должны переместиться в положение A/B, в зависимости от направления вращения. Вместо этого он изменяется от первой фигуры, вращается примерно вокруг переднего угла, что приводит к чему-то близкому к другим фигурам. Верхние немеченые блоки находятся в другом виде и статичны, поэтому не являются частью вращения. Нижние помеченные блоки находятся в виде / слое, который я пытаюсь анимировать.
Как мне изменить центр вращения, чтобы достичь желаемого результата?
Я перепутал с anchorPoint, zPosition, anchorPointZ для различных слоев без успеха. Пробовал setSublayerTransform, setTransform, а также.
Должен ли я возиться с настройками для подслоев на стороне блока, слоя трансформации, слоя вида или самого вида, чтобы добиться того, что мне нужно?
Любое руководство или направление будет оценено.
1 ответ
ОБНОВИТЬ:
Я наконец пришел к осознанию и принял тот факт, что я не могу сделать это с помощью Core Animation.
Я пошел по пути использования OpenGL для решения этой проблемы.
Эта проблема постепенно развивалась по мере того, как я постепенно вносил улучшения, но конечный результат заключается в том, чтобы сделать родительский слой CATransformLayer, который сохраняет трехмерную перспективу, и вращать ее.
Что касается центра вращения, я использую CATransform3DMakeTranslation, чтобы изменить положение слоя.