2010-12-28 11 views
0

vb.net에서 사용하고있는 arcball 클래스를 objective C++를 사용하여 iPhone으로 이식했지만 지금은 문제가 있습니다. 내 물건을 회전 시키면 모든 것이 잘됩니다. 내가보기를 패닝하자마자, 나의 회전 중심은 예전과 같이 내 물건 기원의 중심에 더 이상 있지 않습니다. 이상적으로는, 참조 점의 객체 프레임에서 회전 지점을 어디로 설정할 수 있는지 알고 싶습니다. 나는 이것을하기 위해 아크롤 루틴에서 어디에서 변경해야하는지 잘 모르겠습니다. 나는 그것이 작동하는 방법에 몇 가지 작은 수정을 만들어 터치 인터페이스로 변환하지만,이 역할을 어떻게 한OpenGL ES arcball 변환 문제

http://www.codeproject.com/KB/openGL/Tao_Arcball.aspx

여전히 : 구현 나는 오프의 아래 링크에서 발견 된 광산을 기반으로 한 내가 가진 문제와 관련해서는이 구현과 동일합니다. VB에서 (

http://www.j3d.org/matrix_faq/matrfaq_latest.html http://www.gamedev.net/reference/articles/article1095.asp http://en.wikipedia.org/wiki/Quaternion_rotation

내가 수정되어야 할 것이다 상상할 코드의 주요 부분은 다음과 같습니다 :

이러한 링크는 사원 수 및 매트릭스 회전 뒤에 수학을 좀 더 설명 .NET) :

 Public WriteOnly Property Rotation() As Quat4f 
      Set(ByVal value As Quat4f) 
       Dim n, s As Single 
       Dim xs, ys, zs As Single 
       Dim wx, wy, wz As Single 
       Dim xx, xy, xz As Single 
       Dim yy, yz, zz As Single 

       M = New Single(3, 3) {} 

       n = (value.x * value.x) + (value.y * value.y) + (value.z * value.z) + (value.w * value.w) 
       s = If((n > 0.0f), 2.0f/n, 0.0f) 

       xs = value.x * s 
       ys = value.y * s 
       zs = value.z * s 
       wx = value.w * xs 
       wy = value.w * ys 
       wz = value.w * zs 
       xx = value.x * xs 
       xy = value.x * ys 
       xz = value.x * zs 
       yy = value.y * ys 
       yz = value.y * zs 
       zz = value.z * zs 

       ' rotation 
       M(0, 0) = 1.0f - (yy + zz) 
       M(0, 1) = xy - wz 
       M(0, 2) = xz + wy 

       M(1, 0) = xy + wz 
       M(1, 1) = 1.0f - (xx + zz) 
       M(1, 2) = yz - wx 

       M(2, 0) = xz - wy 
       M(2, 1) = yz + wx 
       M(2, 2) = 1.0f - (xx + yy) 

       M(3, 3) = 1.0f 

       ' translation (pan) 
       M(0, 3) = pan_Renamed.x 
       M(1, 3) = pan_Renamed.y 

       ' scale (zoom) 
       For i As Integer = 0 To 2 
        For j As Integer = 0 To 2 
         M(i, j) *= scl 
        Next j 
       Next i 
      End Set 
     End Property 

편집 :

나는 이것을 어떻게하는지 거의 알았다. Arcball의 회전 중심을 설정할 수 있다는 점을 알았지 만 이제는 또 다른 문제가 발생했습니다. 특정 중심점을 중심으로 회전을 적용 할 때 두 가지 문제가 있습니다.

  1. 모델이 다른 위치로 점프합니다. 모델을 정확한 위치와 방향으로 유지하고 싶습니다.

  2. 모델은 새로운 중심점에 대해 크기가 조정되지만, 사용자가 두 손가락으로 접촉하는 지점의 평균 인 점에 대해 모형 크기를 조정하고 싶습니다.

숫자 2의 경우, 어떻게해야하는지 알 것 같지만 번호 2를 제대로 작동 시키려면 숫자 1을 알아야합니다. 숫자 2의 경우 평균 평면을 가까운 평면과 평행하지만 파트의 원점을 통과하는 평면에 투영 한 다음 사용자가 손가락을 위로 올릴 때까지 회전 중심을 만듭니다. 1 번 아이디어는? 내가 회전 중심을 변경할 때 사용하는 코드는 다음과 같습니다 : 그냥 당신의 정보를

glTranslatef(panVector.x, panVector.y, 0); //panVector is a variable that keeps track of the user panning the model 
glMultMatrixf(arcballMatrix); //arcball matrix is the 16 element rotation/scale matrix that controls the model orientation 
glTranslatef(-centerOfRotation.x, -centerOfRotation.y, -centerOfRotation.z); //centerOfRotation is a point that is set where I want the center of rotation to be 

, OpenGL은 때문에 스택이 작동하는 방법의 역순으로 행렬 변환을 적용합니다. 그래서 내 코드에서, 최종선이 먼저 실행되고 나서 실행됩니다. 효과적으로 모델을 이동하여 회전 중심이 원점에있는 경우 회전/크기 조절 한 다음 패닝 할 필요가있는 모델을 변환합니다.

나는 내 패닝을 할 때 centerOfRotation을 다시 추가해야한다고 생각하지만, 일단 모델이 회전하면 centerOfRotation 점이 어떻게 든 다른 위치에 있어야합니다. 모델 공간. 모델을 회전하기 전에 제대로 작동하지만 일단 회전이 도입되면 모든 것이 폭발적입니다.

답변

0

좋아요, 나는 마침내 무슨 일이 일어나고 있는지 알아 냈습니다. 최악의 부분은 내가 그것을 정확하게하고 있었다는 것입니다. 내가 가지고있는 유일한 문제는 삼각형 광선 교차 알고리즘이 잘못된 점을 반환하고 있다는 것입니다. 그 문제를 해결하고 컨트롤이 예상대로 작동하면 회전 중심이 화면에서 움직이지 않습니다. 모델이 움직여 원점이 같은 위치에 유지됩니다. 변환 작업을 수행하는 코드는 원래 게시물에서 언급 한 내용입니다.

0

VB.NET arcball을 포팅하는 대신 기존 iPhone 트랙볼 구현을 살펴볼 수 있습니다.예를 들어, Bill Dudney는을 작성한 지 얼마되지 않아서 Core Animation 컨텍스트 내에서 두 개의 이미지를 회전시키기 위해 트랙볼을 사용합니다.이 애니메이션은 OpenGL ES에서 쉽게 작동하도록 수정 될 수 있습니다 (Core Animation 및 OpenGL ES는 변형을 위해 동일한 매트릭스 구조 사용).

나는 X와 Y의 터치 동작을 사용하여 사용자가 보는 것처럼 화면의 Y 축과 X 축을 중심으로 회전하여 모델을 회전시키는 다른 방법을 구현했습니다. 소스 코드에서 내 Molecules 응용 프로그램뿐만 아니라 3 차원 큐브를 표시하는 sample application 내에서 찾을 수 있습니다. 이게 어떻게 작동하는지 조금 설명해 드리겠습니다. here.

두 방법 모두 특정 방향으로 변위 된 경우에도 모델의 원점을 중심으로 모델을 회전 할 수 있습니다.

+0

나는 모든 각도에서이 문제를 조사해 왔으며 실제로 믿고 사용하는 방법을 고수하고 싶습니다. 최상의 사용자 경험을 제공하며 작동 방식면에서 가장 사용자 정의가 가능합니다. 모델을 원점에 대해서만 회전 시키면 꽤 직선적이어야합니다. 또한 '원점'이 X, Y, Z 좌표로 회전 할 위치를 설정할 수 있기를 바랍니다. – Davido