1

私は、遺伝子組み換えされたハエに単純な画像が表示される実験セットアップを扱っています。画像は、そのフライに一定の距離を置いてスクリーンに投影されます。

今度は、遠近法補正を設定して、表示された画像、たとえば水平バーが、ハエの視点までの距離が長くなるほど広く見えるようにします (実験設定) 。コードは次のようになります。

glMatrixMode(GL_PROJECTION);                        
glLoadIdentity();

if(!USEFRUSTUM)
   gluPerspective(90.0f, 2 * width/height, 0.1f, 100.0f);
else
   glFrustum(92.3f, 2.3f, -25.0f, 65.0f, 50.0f, 1000.0f);

値は数年前に誰かが入力したもので、もはや正確ではないことがわかりました。ただし、実験のセットアップでわかるように、ハエの視野が少し傾いているため、投影を適切に機能させるために入力または変更する値を混乱させます。

私はそれらの価値について考えました:

  • fovy = a と c の間の角度
  • 投影スクリーンの幅と高さを測定する
  • しかし、zNear とは何ですか? フライから画面の上または下までの距離を測定する必要がありますか? 誰かが 0.1f に入った理由がわかりません。私には近すぎるように思えます。
  • zFar の値を知るにはどうすればよいですか? フライまでの物体の最大距離ですか?

glPerspective に関する情報は、https ://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html から入手しました。3D OpenGL 透視投影を設定する最も簡単な方法 もチェックしましたが、この投稿はそうではありません。私の混乱の原因である私の実験装置を扱いません。

助けてくれてありがとう!

4

1 に答える 1

0

これは、遠近法よりも錐台法の方が使いやすい代表的な例の 1 つです。錐台は、本質的に切り取られたピラミッドです。フライが 4 面の傾斜したピラミッドの先端にあると想像してください。近い値は、ピラミッドの底面までの距離と、ピラミッドの底面の各側面から先端までの垂直距離を左、右、下、上に示します。先端がベース領域の「外側」にあるのは完全に合理的です。または、ハエの場合、中心が「左」端のすぐ上にある可能性があります。

したがって、元の画像を想定すると、次のようになります。

ハエ錐台

「近」は投影スクリーンまでの「距離」を表し、右 (もちろん上、下、左も) はスクリーンの端に垂直な先端、エラー、フライのそれぞれの距離を表します。

「遠」は射影機能にとって重要ではなく、深度範囲を決定するためだけに使用されます。

したがって、プログラムできるのは次のとおりです。

double near   = ${distance to screen in mm};
double left   = ${perpendicular to left screen edge in mm};
double right  = ${perpendicular to right screen edge in mm};
double top    = ${perpendicular to top screen edge in mm};
double bottom = ${perpendicular to bottom screen edge in mm};
double s = ${scaling factor from mm into OpenGL units};
double zrange = ${depth range in OpenGL units the far plane is behind near};
glFrustum(s*left, s*right, s*bottom, s*top, s*near, s*near + zrange);

左、右、上、下が負になる場合があることに注意してください。つまり、一方向に対称 (シフトされていない) ビューが必要でleft = -bottomあり、シフトは本質的に同じオフセットの両方に加算/減算するとします。

于 2016-06-24T12:31:33.327 に答える