OpenGL(正確にはCocos3d)を使用して、iPhone/iPadプロジェクトに地球儀を表示します。ユーザーが指で地球儀を回転できるようにしたい。 1軸だけ回転するとうまくいきますが、3軸を一緒に解決する方法がわかりません...2次元ジェスチャー/ムーブメント(OpenGL/Cocos3D)での3D回転
指の動きをキャプチャすると動作します - > 2D(x/y)値を取得しますが、これらを3D回転でどのように変換するのですか?
OpenGL(正確にはCocos3d)を使用して、iPhone/iPadプロジェクトに地球儀を表示します。ユーザーが指で地球儀を回転できるようにしたい。 1軸だけ回転するとうまくいきますが、3軸を一緒に解決する方法がわかりません...2次元ジェスチャー/ムーブメント(OpenGL/Cocos3D)での3D回転
指の動きをキャプチャすると動作します - > 2D(x/y)値を取得しますが、これらを3D回転でどのように変換するのですか?
ウィンドウの中央には、ウィンドウのエッジに接触する3D球(楕円ではない)があるとします。これは、画面空間にあり、世界の空間にはありません。 「スクリーンスペース」とは、ウィンドウが640x480の場合、球がx = 320、y = 240にあり、モデルビュー/投影行列に関係なく半径が240(min(width,height)/2
)であることを意味します。
ユーザがクリックすると、マウスボタンが押されると、球上のポイントが選択されます。クリックがその球の外にある場合、初期点は球の境界に移動します。この点をpointA
としましょう。ユーザーがマウスをドラッグしているとき、マウスの位置マークは、ユーザーがその最初のポイントを望む場所を示します。それをpointB
としましょう。
R^2 = X^2+y^2+z^2
以来ですから、第三は、初期点(
pointA
)と第三の現在のポイント(
pointB
)座標座標を計算することができ、第三は、2番目与えられた座標を計算することは非常に簡単です。 2つの点を使用して、球の中心(
O
)から点(
vectorOA = pointA - O; vectorOB = pointB - O
)までの2つのベクトルを計算できます。今では2つのベクトルがあるので、それらを使って回転軸(クロス積=
rotationAxis = normalize(vecOA x vecOB);
を使用)と回転角度(正規化されたベクトルの内積を使ってacos =
acos(dot(normalize(vecOA), normalize(vecOB))
)を計算することができます。軸と角度を使用すると、画面空間で回転行列を構築し、空間に変換してオブジェクトに適用することができます。
このテクニックは、一般に「トラックボール」と呼ばれます。これは、Microsoft DirectX SDKのいくつかの例で使用されており、NVidia OpenGL SDKのどこかで見つけることができます。したがって、説明を理解できない場合は、sdkを取得し、マウスでオブジェクトを回転させることができる例を調べることをお勧めします。
簡単な方法は、Y軸回りの回転をtranslationInView
コンポーネントに、X軸回りの回転はtranslationInView
コンポーネントに設定するだけです。回転値はラジアンであるため、翻訳をある程度分ける必要があるかもしれません。ユーザーに2自由度を与えるのが一般的ですが、ユーザーがz軸を中心に回転できるようにする必要がある場合は、UIRotationGestureRecognizer
を使用してそのケースを個別に処理することを検討してください。
CGPoint translation = [sender translationInView:self.view];
_rotationY = translation.x/100.0f;
_rotationX = translation.y/100.0f;
+1です。いくつかの素敵な写真で説明されています:http://viewport3d.com/trackball.htm –