2016-06-24 5 views
1

私は、単純な画像が遺伝子改変フライに表示されている実験的セットアップを扱っています。その画像は、その飛行距離と一定の距離を置いてスクリーンに投影されます。OpenGLパースペクティブ補正を設定するには?

ここでは、水平方向のバーなどの表示された画像がフライの視点から遠いほうに表示されるように、パースペクティブ補正を設定します(experimental setup)。コードは次のようになります。

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); 

値は数年前に誰かによって入力されましたが、私たちはもう正確ではないと考えました。しかし、実験的な設定で見ることができるように、フライの視界は少し傾いているので、投影を適切にするために入力するか変更する値が混乱しています。

Iがこれらの値を考え:投影スクリーン

  • 上およびc
  • 尺度幅と高さとの間fovy =角度

    • しかしzNearは何ですか?フライから画面の上部または下部までの距離を測定する必要がありますか?私はなぜ誰かが0.1fに入った理由を知らない。
    • zFarの値はどのように知ることができますか?それは、飛行するオブジェクトの最大距離ですか?

    私はからglPerspectiveに私の情報を得た:私もSimplest way to set up a 3D OpenGL perspective projectionをチェックしますが、このポストは私の混乱の源である私の実験を、扱いませんhttps://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html

    ありがとうございました!

  • 答えて

    0

    これは、円錐台法がパースペクティブよりも使いやすい優れた例の1つです。錐台は本質的にはピラミッド型である。 4面の傾いたピラミッドの先端であなたの飛行を想像してみてください。近い値は、ピラミッドの底辺までの距離を表し、左、右、下、および頂点は、ピラミッドベースの各辺の先端までの垂直距離を表します。先端がベースエリアの「外側」にあることは完全に合理的です。また、フライの場合は、センターが「左」エッジの真上にあるかもしれません。

    fly frustum

    「ニア」投影画面右に「距離」を与える(そしてもちろん、トップ、ボトム、左)それぞれの距離は:だから私たちはこれを持って、あなたのオリジナルの絵を想定し

    先端の、誤って、画面の端に垂直に飛ぶ。

    「遠方」は、射影的特徴にとって重要ではなく、深度範囲を決定するためにのみ使用される。

    だから何あなたにプログラムすることができますが、次のされています

    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であり、シフトは本質的に両方の同じオフセットに加算/減算されています。

    +0

    ちょっとdatenwolf!ご回答どうもありがとうございました。今、私は、近所、下、左、右の測定方法と、私の場合の錐台がどのように見えるかを理解しました。私がまだ理解していないのは、倍率を決定する方法です。 「OpenGLプログラミングガイド:OpenGLの学習のための公式ガイド、バージョン3」(Googleの書籍)を読んで、私の測定値が一貫したユニットを使用している限り、私はそれらをスケーリングしないままにすることができます。深さの範囲は、フライの視野の深さに依存する可能性がありますか?私は、私の同僚と適切な価値について話し合うかもしれないと思う。 – TheCooocy

    +0

    @TheCooocy:はい、あなたは完全に限り、あなたは、OpenGLで描画しているすべてのジオメトリが一致しているとして、 'S'(すなわちS = 1)を省略することができます。あなたは物理的なビーイング(動物)と対話しているので、それは多くの意味が投影システム「外」の中で測定される。ただし*近くにあなたが同じ物理単位でのOpenGLで描画するつもりジオメトリを定義可能*距離は、実際の画面までの距離ではなく、おそらくフライの目の前に少し小さな画面をイメージして、フライに近づくようにしてください。しかし、セットアップの物理的な制約のためには、その大きな画面を使用する必要があります。 – datenwolf

    +0

    @TheCooocy:だからあなたが、その後どうなるのかN_/nはその要因 'と、右、下、上と左の近くに「仮想」の距離近く' n_'と実際の画面距離 'N'、とスケールの間の比を取ることです'。あなたがすべてをやっているならば、* mm *単位は、オブジェクトが突然消えるカットオフ距離になります。デプスバッファの解像度に関する実際的な理由から、* far *の値を小さく、* near *の値を可能な限り小さくして、描画したいジオメトリに対応する値を選択する必要があります。 – datenwolf

    関連する問題