私は OpenGL を使用してシーンの軸外投影を行おうとしています。Robert Kooima の軸外投影のドキュメントを読んで、実際に何をしなければならないかについてより良いアイデアが得られましたが、まだいくつかの部分があります。私はここでトリッキーだと思っています。OpenGL の軸外投影コードが次のようになることを知りました。
コード 1:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(fNear*(-fFov * ratio + headX),
fNear*(fFov * ratio + headX),
fNear*(-fFov + headY),
fNear*(fFov + headY),
fNear, fFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
glTranslatef(0.0,0.0,headZ);
これが、ユーザーが画面の中央にいる通常の透視投影であった場合、私が理解しているように、かなり簡単に理解できます。
Screen
|
| h = H/2
|
x----- n -----------
|
| h = H/2
|
ユーザーが x にいて、画面からの距離が n の場合、 glFrustumの上下の座標は次のように計算されます (theta は視野 (fov)であり、 30 度と仮定します)
h = n * tan (theta/2);
tanValue = DEG_TO_RAD * theta/2;
[EDIT Line additon here>>]: fFov = tan(tanValue);
h = n * tan (tanValue);
したがって、トップとボトム (トップの値を否定) は両方ともglFrustum引数に対して取得されます。左のものは今のところ左右です。
Now, Aspect Ratio, r = ofGetWidth()/ofGetHeight();
Right = n * (fFov * r); , where r is the aspect ratio [Edit1>> Was written tanValue*r earlier here]
質問1) 上記の (tanValue*r) は水平視野角を取得し、それを適用して左右の値を取得していますか?
double msX = (double)ofGetMouseX();
double msY = (double)ofGetMouseY();
double scrWidth = (double)ofGetWidth();
double scrHeight = (double)ofGetHeight();
headX = (msX / scrWidth) - 0.5;
headY = ((scrHeight - msY) / scrHeight) - 0.5;
headZ = -2.0;
ここで、軸外の投影を考えて、headXとheadYの位置を計算します (実際のユーザーの頭の代わりにここではマウスを使用します)。
質問2) headX と y はどのように計算され、上記から -0.5 を差し引くのは何に使用されますか? msX と msY が変化すると、x 値が (-0.5 から 0.5) になり、y 値が (0.5 から -0.5) になることがわかりました。
質問3) 上記のコード (コード 1) で、headY は計算された tan(fov/2) 値にどのように追加されますか?
-fFov + headY
fFov + headY
この価値は私たちに何をもたらしますか?-fFov は theta/2 の計算された tan ですが、headY を直接追加するにはどうすればよいですか?
-fFov * ratio + headX
-fFov * ratio + headX
abvoe は、軸外投影の非対称 glFrustum 呼び出しの左と右を与える n (近い値) を掛けた値をどのように与えるのでしょうか?
質問4) View Point で錐台の頂点をユーザーの目の位置 (この場合はマウスの位置) に移動するには、glLookAt を実行する必要があることを理解しています。上記のコードの次の行に注意してください。
gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
ここで使用できる目の xPosition、headX*headZ
目の yPosition はどのようにして得られるのでしょうか?headY*headZ
gluLookAt()
編集:ここに完全な問題の説明が追加されました: pastebin.com/BiSHXspb