質問

客観的なC ++を使用して、VB.NETからiPhoneに使用してきたアークボールクラスを移植しましたが、今では問題が発生しています。オブジェクトを回転させると、すべてが問題ありません。ビューをパン化するとすぐに、私の回転の中心は、かつてのように私のオブジェクトの起源の中心にもははやありません。理想的には、オブジェクトの参照フレームのどこに回転点があるかを設定できるようにしたいと思います。これを行うために変更を加える必要があるアークボールルーチンのどこにあるのかわかりません。私が私のものにした実装は、以下のリンクにあります:

http://www.codeproject.com/kb/opengl/tao_arcball.aspx

私はそれがどのように動作するかについていくつかの小さな変更を加え、それをタッチインターフェースに変換しましたが、それがどのように行動するかは、私が抱えている問題に関する限り、この実装と同じです。

これらのリンクは、QuaternionsとMatrixの回転の背後にある数学のいくつかを説明しています。

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

私が想像するコードの主な部分は、変更する必要があると想像します(VB.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

編集:

私はこれを行う方法をほとんど考えていました。私は自分のアークボールのためにローテーションの中心を設定できるようになりましたが、今では別の問題に遭遇しました。指定された中心点に関する回転を行うために変換を適用すると、2つの問題があります。

  1. モデルは別の場所にジャンプします。モデルをまったく同じ場所とオリエンテーションに保ちたいと思います。

  2. モデルは新しい中心点についてスケーリングしますが、ユーザーが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はスタックの仕組みのために、マトリックス変換を逆順に適用します。したがって、私のコードでは、最初にボトムラインが実行され、次にそこから実行されます。事実上、モデルを移動して、回転中心が起源になるようにモデルを移動し、回転/スケールしてから、モデルをパンする必要がある場所に変換します。

私が遭遇していると思う問題は、パンをするときに中央の駆動を追加する必要があるということですが、問題はモデルが回転すると、中心的な駆動ポイントを異なるモデル空間に変換する必要があることです。モデルを回転させる前に正常に動作しますが、回転が導入されると、すべてが爆発します。

役に立ちましたか?

解決 2

わかりました、私はついに何が起こっているのかを理解しました。最悪の部分は、私がずっとそれを正しくやっていたことです。私が抱えていた唯一の問題は、私の三角形の光線交差点アルゴリズムが間違ったポイントを返すことでした。私はその問題を修正しました、そして今、コントロールは予想どおりに機能します、回転の中心が画面上で動くことはありません、モデルはただ移動するので、オリジンは同じ場所にとどまります。変換を行うコードは、私が元の投稿で言及したものでした。

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

他のヒント

VB.NETアークボールに移植するのではなく、既存のiPhoneトラックボールの実装を見ることができるかもしれません。たとえば、ビル・ダドニーは書いた サンプルアプリケーション トラックボールを使用してコアアニメーションコンテキスト内で2つの画像を回転させる少し前に、OpenGL ES内で簡単に動作するように簡単に変更できます(Core AnimationとOpenGL ESは、変換に同一のマトリックス構造を使用します)。

ユーザーが見たように、画面のyとx軸の周りを回転させるためにxとyのタッチの動きを使用して、モデルを回転させる別の方法を実装しました。これは私のソースコード内で見つけることができます 分子 アプリケーション、およびa内 サンプルアプリケーション 3-Dキューブを表示することを書きました。これがどのように機能するかについて少し説明します ここ.

これらのアプローチはどちらも、特定の方向に置き換えられたとしても、その起源についてモデルを回転させることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top