2010-11-24 12 views
1

私は原点を中心とし、カメラも原点の中心にあります。カメラはz = -1を向いています。 カメラを最初にx軸を中心に、次にz軸を中心に回転させることによって、視点を変更します。これは、 glrotate(phi、1,0,0)を使ってopengl 1.1で行われます。 glrotate(theta、0,0,1)球を点から点まで回転

これは、私にはz =(0,0,1)が常にアップベクトルであるカメラの視点を与えます。 gluLookAtを使用すると、見るべき点を指定していても同じ結果が得られます。 私は以前に投影行列を定義しました。

は今本当の問題のために:

私は、画面をクリックして、私は上をクリックし最初のポイントは、投影行列とモデルビューマトリックスを通って戻るように変換されて格納されます。すなわち、 p1 =画面上のピクセル位置、P =投影行列、M =モデルビュー行列、ps =球面上の点(球面上)

P * M * ps = pl ps = inv * pl

この手順を実行するのは簡単です。次の部分はisnt。

今私はスクリーン上の他の場所をクリックしたいので、私はplnewを取得して、ポイントのpsがスクリーン上のplnewに表示されるような回転を引き起こすMatewを見つけたいです。 P * Mnew * ps = plnew

これは明らかに過小ですので、私は正しい制約を見つける必要があります。制約は、質問の紹介に記載されているように、私がphiとthetaを使ってのみ回転できるという事実に基づいています。だから私はどのようにMnewを解くのですか?つまり、phiNewとthetaNewです。

ところで、ユーザーが球のどこかをクリックして球をドラッグすると、ドラッグしている間にクリックされた点がマウスの下にとどまり、球が直立したままになるということです。

答えて

0

私は昨日私の頭を叩いて一日を無駄にしたにもかかわらず質問を投稿した後、私はそれをかなり簡単に解決することができました。

psnew =装置INV(M)とする* INV(P)* PL

すなわちpsnewは、球面上の点の位置にすぎません。変換は標準であり、ウィキペディアに見出さ又はどこ

ことができる

V = psnew-PS

ので(シータ、ファイ)= convertToPolarCoordinates(V)

関連する問題