2012-01-05 3 views
1

터치를 사용하여 iOS에서 OpenGL 개체를 회전하려고하는데 문제가 있습니다. 여기에 사용자를 붙잡고 있습니다 :GLKit을 사용하여 OpenGL ES 개체 회전

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
    UITouch *touch = [touches anyObject]; 
    startPoint = [touch locationInView:self.view]; 
    } 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
    { 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:self.view]; 
    dx = point.y - startPoint.y; 
    dy = point.x - startPoint.x; 
    startPoint = point; 
    } 

로테이션을 수행하기 위해 내 업데이트 기능에 사용하고 있습니다. 지금은 왼쪽에서 오른쪽으로 회전하려고 할 때 왼쪽에서 오른쪽으로 회전하려고합니다. 나는 이상한 조합 회전을 얻는다.

- (void)update 
    {  
    float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 

    self.effect.transform.projectionMatrix = projectionMatrix; 

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.5f); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, -1, startPoint.x, startPoint.y, 0.0f); 
    dx = dy =0; 
    self.effect.transform.modelviewMatrix = modelViewMatrix; 
    } 
+0

GLK로하는 방법을 모르지만 회전하기 전에 원점으로 변환 하시겠습니까? – dan

+0

아니, 나는 그렇게 생각하지 않는다. 객체가 화면 밖으로 벗어나지 않고, 회전하고 있습니다. 원하는 방식이 아닙니다. 내가 그 일을해야합니까? – Adam

+0

OpenGL에서 객체를 원점 (0,0,0)으로 먼저 변환 (= 슬라이드) 한 다음 회전시킨 다음 다시 원래 위치로 변환합니다. OpenGL은 항상 원점을 회전시킵니다. 슬라이드를 그곳으로 미끄러 뜨리면 객체가 원점을 "궤도에 띄우지 만"예상 된 arround만큼 회전하지 않습니다. – dan

답변

2

둘 다 X에서 회전을 이야기하고 있기 때문에와 y :

이 시도 : :이 X 주위 startPoint.x 라디안 회전합니다

modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.x, 1.0f, 0.0f, 0.0f); 

여기 코드는 -중심선.

마지막 세 개의 매개 변수를 변경하여 원하는 축을 중심으로 회전 할 수 있습니다 (예 : 0,1,0이 y 축을 중심으로 회전하며 1,1,0은 x 축과 y 축 사이에서 45 ° 회전합니다). .)

NB 감사 @Marcelo 칸토 정화 : deanWombourne 당으로

+0

답해 주셔서 감사합니다. 나는 당신의 추론을 이해하고 그것이 합리적입니다. 나는 그 한방을 줬지만, 이제는 전혀 움직이지 않는다. – Adam

+0

나는 그것을 이해했다. 너는 옳은 길을 가고 있었다. 내가 가진 것이 왜 효과가 없는지 정확히 모르겠지만 작동하는 것을 발견했다. GLKMatrix4Rotate()를 사용하여 두 동작을 동시에 수행하는 대신 GLKMatrix4RotateX() 및 GLKMatrix4RotateY()를 사용하고 있습니다. – Adam

+0

죄송합니다. 메소드 서명을 잘못 읽었으며 축/라디안이 섞여 있습니다. - 죄송합니다! 더 나은 답변을 보려면 편집을 참조하십시오! – deanWombourne

1

를 들어, 당신이 잘못 GLKMatrix4Rotate을 사용하고 있습니다. 수행 할 때 :

GLKMatrix4Rotate(modelViewMatrix, -1, startPoint.x, startPoint.y, 0.0f); 

축 (startPoint.x, startPoint.y, 0.0f)을 중심으로 -1 라디안을 회전합니다. startPoint.x 라디안 (1, 0, 0)과 startPoint.y 라디안 (0, 1, 0)을 중심으로 회전하는 것처럼 들립니다. 따라서, 예를 들어 :

modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.x, 1.0f, 0.0f 0.0f); 
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.y, 0.0f, 1.0f 0.0f); 

또는 당신은 아마 그 접촉에 하이퍼 반응 할 것이기 때문에, startPoint.x 및 startPoint.y를 나눌.

또한 짐벌 잠금 문제가있을 것입니다. 본질적으로 x를 중심으로 회전하면 y 축이 반드시 원래 위치를 차지하는 것은 아니므로 y 축을 중심으로 회전하면 x 축이 회전하지 않습니다. 꼭 당신이 생각하는 곳입니다. 그게 당신이 염려하는 것입니까?

+0

감사합니다. 나는 더 명확하게 지금 본다. 나는 startPoint가 매우 민감하다는 문제를 발견했습니다. 나는 그것을 나누고있다. 나는 당신의 손가락이 움직이는 것처럼 모델을 움직이고 싶습니다. 당신이 어떤 각도로 움직인다면 나는 위아래로 회전하고 싶습니다. RotateX와 RotateY를 사용하여 분리 된 코드는 그런 식으로 작동하는 것 같습니다. 나는 당신의 손가락에 딱딱 거리는 것을 멈추게하는 방법을 생각할 수 없다. – Adam