2011-06-08 28 views
6

Esta es mi segunda pregunta sobre cubos 3D en iphone usando CALayer, Core Animation framework, escrito en Objective-c. Para mi primera pregunta, visite aquí 3D Cube Problem! Part 1.Problema 3D Cube, Parte 2

estoy usando código de Brad Larsons para girar mi cubo 3D desde este enlace

http://www.sunsetlakesoftware.com/2008/10/22/3-d-rotation-without-trackball

El problema es que mi cubo está girando en el eje X a lo largo de la línea rosa se muestra en la figura.

enter image description here

Pero quiero hacerlo girar alrededor del eje X a lo largo de la línea de negro se muestra en la figura.
Ahora en mi código no tengo ninguna línea rosa o línea negra dibujada en mi vista así que alguien me puede ayudar con esto.

Si ayuda aquí está el código para hacer girar mi cubo en touchesMoved: método

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint location = [[touches anyObject] locationInView:self]; 
    CATransform3D currentTransform = currentLayer.sublayerTransform; 
    CGFloat displacementInX = location.x - previousLocation.x; 
    CGFloat displacementInY = previousLocation.y - location.y; 
    CGFloat totalRotation = sqrt(displacementInX * displacementInX + displacementInY * displacementInY); 
    CGFloat x = (displacementInX/totalRotation) * currentTransform.m12 + (displacementInY/totalRotation) * currentTransform.m11; 
    CATransform3D rotationalTransform = CATransform3DRotate(currentTransform, totalRotation * M_PI/180.0, x, y, 0); 
    currentLayer.sublayerTransform = rotationalTransform; 
} 

previousLocation es un CGPoint inicializado en touchesBegan: método y currentLayer es CALayer donde he creado este cubo.

Gracias por su ayuda.

PS. Si desea saber cómo he creado este cubo, hágamelo saber

+0

Me encantaría saber cómo se creó el cubo. Estoy tratando de hacer algo similar a ti. ¿Algún progreso hasta ahora? – Jeremy

+1

retoqué el proyecto pero creo que podría darte el código para hacer un cubo en núcleo de cuarzo. – Robin

+0

Oye, obtuve un código muy similar, rotando 'CALayer' en 3D y todo, pero resolví el problema cambiando el' anchorPoint' como sugirió Simon Lee. Debes haber hecho algo mal con eso. Por favor, comparta el código de construcción de la capa, y lo resolveré ... O bien, puedo hacer mi propio cubo si es necesario. – Mazyod

Respuesta

3

Parece que necesita traducir las capas primero antes de girarlas.

En lugar de elegir un punto de pivote/ancla, puede usar CATransform3DTranslate primero para traducir las capas lejos de su origen natural, y usar CATransform3DRotate después de eso.

Ayudaría echar un vistazo a cómo se construye el cubo para determinar cómo se puede implementar.

+0

Déjame intentar eso y responderte en este caso. – Robin

+0

Hola que realmente funcionó, gracias por tu ayuda. No sabía que sería así de simple. Gracias. – Robin

3

Establezca el andchorPoint en el centro; si se trata de un CALayer, entonces ...

[myLayer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
+0

No sigue girando a lo largo de esa línea rosa en la figura – Robin

Cuestiones relacionadas