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의 회전 중심을 설정할 수 있다는 점을 알았지 만 이제는 또 다른 문제가 발생했습니다. 특정 중심점을 중심으로 회전을 적용 할 때 두 가지 문제가 있습니다.
모델이 다른 위치로 점프합니다. 모델을 정확한 위치와 방향으로 유지하고 싶습니다.
모델은 새로운 중심점에 대해 크기가 조정되지만, 사용자가 두 손가락으로 접촉하는 지점의 평균 인 점에 대해 모형 크기를 조정하고 싶습니다.
숫자 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 점이 어떻게 든 다른 위치에 있어야합니다. 모델 공간. 모델을 회전하기 전에 제대로 작동하지만 일단 회전이 도입되면 모든 것이 폭발적입니다.
나는 모든 각도에서이 문제를 조사해 왔으며 실제로 믿고 사용하는 방법을 고수하고 싶습니다. 최상의 사용자 경험을 제공하며 작동 방식면에서 가장 사용자 정의가 가능합니다. 모델을 원점에 대해서만 회전 시키면 꽤 직선적이어야합니다. 또한 '원점'이 X, Y, Z 좌표로 회전 할 위치를 설정할 수 있기를 바랍니다. – Davido