• ベストアンサー

OpenGLで視点の位置を遠くしすぎた場合

OpenGLを使用していて,マウスのホイールを利用して 視点と注視点の距離を近づけたり遠くしたりできるようにしています. ところが,マウスホイールを回して 視点と注視点の距離をどんどん遠くしていくと 距離が100を超えたあたりから 画面中心に表示した物体が欠けて見え始めて, さらに遠くしていくと物体が見えなくなってしまいます. 視点は遠くしすぎてはダメなのでしょうか? 視点と注視点の距離には限界があるのでしょうか?

  • vjpo
  • お礼率23% (17/71)

質問者が選んだベストアンサー

  • ベストアンサー
  • bitch_
  • ベストアンサー率18% (2/11)
回答No.1

視点は遠くしすぎてはダメなのでしょうか? ⇒ダメです. 視点と注視点の距離には限界があるのでしょうか? ⇒あります. いずれも自分で設定できますが... gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) でググりましょう. OpenGL は視錐台ってのが定義されています. 視錐台は三角錐を途中で切ったような形をしています. その三角錐の頂点の部分に視点があります. 要するに視錐台が人間の視野になります. 視錐台の外にあるものは描画されません. OpenGLでは 実際の人間の視点と同じように視野角が定義されています. というか視錐台から定義されます. 当然, 視野角の外にあるものは見えませんよね? ⇒ すなわち視錐台には幅があります. まあ視錐台(三角錐)の底面の縦と横です. この縦と横の長さによって三角錐の側面間の角度が決まります. これが視野角です. 実際の人間の視点と同じように遠くのものを見るにも限界があります. というか視錐台から定義されます. 視点から遠くに置き過ぎるとオブジェクトは見えなくなります. ⇒ すなわち視錐台には奥行きがあります. まあ視錐台(三角錐)の高さの事です. その高さよりも遠くへ置かれてしまったものは, 視野角内にあったとしても見えません. ひとつだけ実際の人間の視点と違うものがあります. それは 近すぎるものは見えない という事です. なぜ見えないかというと視錐台の外に出てしまっているからです. 視錐台は三角錐を切り取った形になると言いましたが, 三角錐の 「どこ」から「どこ」までを切り取るかを決めなければなりません. (三角錐の頂点) 視点→→→→→→→→→切り口1→→→→切り口2→→→→→→(三角錐の底面) 上の図は三角錐を切り取るときの図であると思ってください. 切り口1~切り口2が視錐台になるとすると 視点~切り口1の部分は見えません. 要は視点から近すぎるものは見えないって事になります. そして OpenGLで視野を広げるのは 視錐台の視野角を広くしたり狭くしたりして行なうのを知ってますか? このとき OpenGL で拡大をします.すると... (三角錐の頂点) 視点→→→→→→→→→→→→→→→切り口1→→切り口2→→(三角錐の底面) 上の図のようになります. なぜかというと 拡大は視野角を狭くするという操作にあたるからです. すなわち三角錐の側面間の角度を狭くするという操作になります. 当然の事ながら三角錐は細長くなっていきます. すると今まで見えていた部分が見えなくなってしまう事もあるのです! なぜなら視錐台が大きさが変わってしまうからです! 一応自分なりに説明をしましたが 図と数式があった方が絶対分かりやすいので 良いサイトを紹介させていただきます. ↓視錐台のイメージがわかると思います. http://www.is.oit.ac.jp/~whashimo/server/~whashimo/Article/OpenGL/Chapter3/index.html#Section2 http://mail2.nara-edu.ac.jp/~asait/open_gl/linear.htm ↓もう少し詳しく http://angra.blog31.fc2.com/blog-entry-114.html ↓gluPerspectiveなどの解説が分かりやすい http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#8.3 良い書籍としては... http://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE3D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E6%95%B0%E5%AD%A6-Eric-Lengyel/dp/4939007375 を読めば全て分かります. ネットで探すなら 射影変換 視錐台 とかでググるとより詳しい内容が分かると思います.

関連するQ&A

  • openglをVC++2010で利用したいです。

    VisualC++2010でopenglのプログラムを利用しているものです。 openglのインストールを完了し、プログラムにエラーもなくコンパイル、実行したのですが、図形が描画されるところが真っ黒のまま何も表示されません。 視点の問題かと思い、gluPerspectiveをいじったりしても何も表示されず、 プログラムのミスかと思いネット上のプログラムをコピペしても何も表示されません。 原因をいろいろネットで調べたのですが、なかなか解決に至りません。 使ってるPCはdynabookR542/16FS PR54216FNTS osはWindows7の64bitです。 よろしくお願いします。

  • OpenGLでkeyboardやmouseを使いたい

    OpenGLでグラフィックを描いてるんですが キーボードやマウスを使って次のことが したいんですが、上手くいきません。 よいヒントをお願いします。 キーボードでしたいこと: キーボードで何かを入力したら グラフィックが既定の動作をする。 マウスでしたいこと: マウスで動かした方向に 視点を回転させたい。 またホイールを上に回すと、拡大 ホイールを下に回すと、縮小。 上のプログラムを組む方法が よくわからず上手くいきません。 視点を回転させる方は static int x0, y0, z0; switch (button) { case GLUT_LEFT_BUTTON: if (state==GLUT_DOWN) { x0+=1; gluLookAt(0.0, 75.0, 225.0, x0, 0.0, 0.0, 0.0, 1.0, 0.0); glFlush(); } break; case GLUT_MIDDLE_BUTTON: if (state==GLUT_DOWN) { z0+=1; gluLookAt(0.0, 75.0, 225.0, 0.0, 0.0, z0, 0.0, 1.0, 0.0); glFlush(); } break; case GLUT_RIGHT_BUTTON: if (state==GLUT_DOWN) { y0+=1; gluLookAt(0.0, 75.0, 225.0, 0.0, y0, 0.0, 0.0, 1.0, 0.0); glFlush(); } break; default: break; } という風にプログラムしてみたんですが クリックするたびに視点が遠ざかり 最後には消えました・・・・。

  • OpenGL

    BCCにOpenGLをインストールしたのですが ウィンドウは表示されるのですが全く描画されません。 画面上に元からあった画像がずっと表示されています(ドラッグしてもです)。 ソースは間違いのないものなのでインストールに誤りがあると考えています。 BCC用にインポートライブラリも作成したのですが他にBCCにインストールする場合に注意すべきことはあるでしょうか? 設定を一括で行うbatファイルを実行してもダメでした。 どうかご教授くださいm(_ _)m

  • OpenglでのRotation(glRotatef)について

    OpenglでのRotation(glRotatef)について Openglで回転を行うとき、glRotatef()を使っているのですが、 表示画面の縦横の比が1でない場合、たとえばx-y平面に描画した正方形をz軸を中心に90度回転すると 形が正方形になりません。(X-Y平面をまっすぐに見ているので、2Dになっています。) おそらく、頂点情報は、あくまで画面の縦や横の長さを1とした小数点比で 記載するため、回転をすると、基準の長さが変わってしまって変形するのだと思います。 90度であれば、glScalefなどで、縦横のスケールを変えて正方形に戻すことは出来るのですが、 任意の角度にした場合は、Scalefなどでの補正がうまくいきません。 正方形を正方形のまま回転するにはどうすればよいのでしょうか?

  • openGLでのグラフィクスの変形について

    openGLで表示させたグラフィクスを変形させたいと考えています。 特にいま行いたいことは、「ボールのような球状のものを棒のような先の細いもので突いて凹ませる」というグラフィクスを作成したいのですが、わからなくて困っています。 制御点の考え方を利用すれば、出来るような気もしているのですが、曲面を球状にすることがわからないので行き詰まってしまいました…。 良いサンプルプログラム、またはアイディアがあれば教えていただきたいです。 よろしくお願いいたします。

  • 地図を利用して距離圏を表示するソフト

    地図を利用して距離圏を表示するソフトを探しています。 と言ってもマピオン等の「一点から一点の直線距離」とか 「マウスの移動距離を計測する」と言ったものではなく ある一点を中心に円を描くように距離圏が表示できるソフト を探しています。(ソフトでなくてもサイトでも結構です。) 例えば皇居から半径20km圏内を地図上で見る・・・。 と言った使い方をします。 よろしくお願いいたします。 プラットフォームOSはWinXPです。

  • マウスのホイールの設定

    マウスのホイールで画面スクロールができなくなりました。 最初のうちはできていたのですが、途中から・・・。 インストールしなおしてもだめです。 今はホイールを回すと、音の大きさが変わるようになっています。 どこを変えれば、画面スクロールになりますでしょうか? ちなみに、同じ機種の別のマウスは正常に画面スクロールができます。 どうぞよろしくお願いします。

  • 凸レンズのパラドクス

    自分の視点を中心として、そこからある一定の距離(半径)をとり、同心円状にある物体を隙間なく並べます。 その一個の物体の幅は、自分の視点から見て視角10度とします。 この物体を、その同心円上に隙間なく並べると、36個(10度×36=360度)並びます。 そこで、自分の視点とその物体の間に凸レンズを置きます。 このレンズは、自分の頭とつながって固定されていて、視点の動きとともに一緒に動きます。 このレンズと対象物、レンズと視点の間の距離は常に一定で、このレンズは対象物を2倍の視角に拡大する能力を持っています。 レンズを通して、この物体を見ると一個の物体の視角は20度となります。 そのまま、ぐるりと一周しながら、レンズを通してこの物体を見ると一個の物体の幅の視角は20度ですから、36個全部の物体を見るためには、20度×36個=720度、即ち2周、回らなければなりません????。 レンズによる拡大の程度は、常に視角で評価することにして、(別に2倍でなくても拡大さえすれば何倍でもかまいません。)幅の長さでは評価しないことにします。 長さで評価すると、レンズが動くときに拡大した分だけ対象物が速く動くから常に360度の中に収まるということになりますが、視角で評価すると対象物の動く速さは関係なく、常に(?)(対象物の視角)×(個数)分の角度、まわらなければなりません。 どこが間違っていますか。

  • 平面バッフル・ユニットの取り付け位置・中心をずらす意味

    平面バッフルではユニットは中心からずらすよう言われていますが、いまいち理由が分かりません。。 音は遠心状に広がると思うので、イメージとしては四角の中心あたりからコンパスでグルグル円を書く場合、四角の中心であってもそうでなくても、周辺とは計8個とかで交わりますよね。どの場所を中心にとっても必ず周辺までの距離が同じ点ができる、そういうイメージで捉えているので、中心からずらすことに意味があるとは思えないのですが・・。 わかりにくい質問かもしれませんが、誰か教えてください。 よろしくお願いいたします。 もし中心で構わないのであれば見た目的にもスッキリすると思うので・・。

  • サブミット後の画面の位置

    こんばんは、質問させて下さい。 現在縦に20コくらいセレクトボックスが並ぶ画面を作成しています。 上から順に選択するようになっており、それぞれは連動していてonChangeで自分にサブミットしています。(a.php とすると a.phpへサブミットしている) その際、15コ~20コ辺りのセレクトボックスを変更してサブミットすると画面が上に戻ってしまい、マウスホイールで下に移動しないと対象のセレクトボックスまでたどり着けません。 これではあまりユーザビリティがよくないと思いますので、サブミット後、ある程度サブミット前の画面の位置(15コ~20コ辺り)へ移動できませんでしょうか。 イメージ的には<a href="">と<a name="">みたいな感じを想像しているのですが・・・ ※仕様でセレクトボックスの数を減らすことはできません。 ※仕様でajaxは使わないことになっています。 宜しくお願い致します。

    • ベストアンサー
    • HTML

専門家に質問してみよう