• 締切済み

openGLにおいて描画した物体によってできる影

OpenGLで3次元オブジェクトを描画する際, 光源の位置によって物体の明るい場所と暗い場所を 表現する方法は知っています.(glShadeModel(GL_SMOOTH);など) しかし,このような方法ではオブジェクトにできる影は光源と オブジェクトの形状のみに依存し, その他のオブジェクトに影響されません. そこで,添付した画像のように, 「複数の3次元オブジェクトを描画した際に, 一方のオブジェクトがもう一方のオブジェクトによって影ができる」 という風に描画するにはどうすればよいですか? ご存知の方がいましたら,どうか教えていただけないでしょうか. よろしくお願いします.

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

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

OpenGLは(というか、OpenGLにかぎらず、3D描画ハードウェアでは) 陰計算(光源と面の傾きなどによる明るさ。Shade)は計算できますが、 影計算(別の物体に光源が遮られること。Shadow)は簡単できません。 Shadowを計算するには、 シャドウポリゴン生成とステンシルバッファを使ったり、 http://son-son.sakura.ne.jp/programming/post.html 光源から見て作画したシャドウマップを使ったり http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20050926 する必要があります。

関連するQ&A

  • OpenGLでのオブジェクトの描画上限

    OpenGLを使って、オブジェクトを描画する場合の上限はあるのでしょうか。 下記のようにリストを使ってオブジェクトを501個以上描画するとうまく描かれませんでした。 GLUquadricObj *sphere; //オブジェクトポインタを準備 GLint list; /* 新しいリスト番号を取得 */ list=glGenLists(1); /* 新しいリストを作成 */ glNewList(list, GL_COMPILE); /* 球を描画 */ for(i=0;i<600;i++){ //オブジェクトを生成 sphere = gluNewQuadric(); //球を描画 半径1.0,緯経それぞれ20.0分割 gluSphere(sphere, 2.0, 20.0, 20.0); } /* リスト作成終了 */ glEndList(); 仕様なのかPCのスペックの問題なのかわかりましたらアドバイスお願い致します。

  • 【C++でOpenGL】平面から立体を作るには

    こんにちは。最近大学の研究にOpenGLを利用しようと思っている者です。 今,2次元座標上に平面図形を描画し,それを底面をその形のまま 3次元座標上に立体として起こす,という点で悩んでいます。 現在は,3次元座標上のx,y平面にGL_POLYGONで多角形を描画し, for文でz軸方向に繰り返し描画するよう設定していて, 擬似的に立体っぽくしてはいるのですが, 真横からみるとやはり平面と平面の隙間が目立って上手くいきません。 繰り返し回数を増やし,1回のz座標の増加量を小さくすると, 隙間はあまり目立たなくなるのですが,やはり実行時間が大幅にかかってしまいます。 OpenGLで底面が多角形の3Dオブジェクトを描画する方法を ご存知の方がいらっしゃいましたら,ぜひご指導お願い致します。 また,「こうした方がもっと効率良いのでは?」という意見もございましたら, ぜひお願い致します! 殆ど初心者ですので,受け答えなどに至らない点がございましたらすみません。

  • 【opengl オブジェクト読込】

    現在VC++でプログラムの開発を行っています。 Shadeや3dsMAXなどで作った3次元オブジェクトをVC++で実行するopenGL上の プログラムに読み込みたいのですがよい方法はあるでしょうか?(opengl+glut) 現在以下を参考にしてvrml形式に変更して読み込んでいるのですが、複雑な形状になると読み込めなくなってしまいます。。。 http://www.komoto.org/opengl/sample12.html ほかによいサンプルや方法などあれば教えてください。 色情報なども保持したまま読み込みたいので、dxf形式ではなくvrmlやobj形式での読み込みを考えています。

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

  • vc++のpictureboxにopenGLの画像を描画する方法につい

    vc++のpictureboxにopenGLの画像を描画する方法について。 現在、Visual C++ 2010のフォームアプリケーションで、任意のパラメータを入力したらその値に応じて物体の動きが変わるといったアプリケーションを開発しています。その動き方をopenGLでアニメーションとして可視化したいと思っています。そして、そのアニメーションをvc++のフォームアプリケーションのpictureboxに表示したいと思っているのですが、vc++とopenGLのどちらもかなりの初心者なので、pictureboxへの表示の仕方がわかりません。 以下に参考URLを貼らせていただきます。このようなものにパラメータを入力する部分を設けたものを作りたいのですが、まったく意味がわかりません。どなたかご教授お願いいたします。 http://www.t-pot.com/program/127_OpenGLNET/index.html

  • 平面の描画

    複数の3次元空間上の点から最小二乗法で平面の式 (z = ax + by + c) を算出したのですがそれをOPENGLで描画する方法がわかりません。面の4隅の点を調べるにはどうしたらいいのでしょうか?

  • PowerPoint2000 オブジェクトに勝手に影が付いてしまいます。

    PowerPoint2000で作成したpptファイルですが、 新しく図形描画をするとオブジェクトに勝手に影が付いてしまい 困っています。 気が付いたらこのような設定になってしまいました。 (別のpptファイルはこのような設定にはなっておりません。) 図形描画ツール「影の設定」から、影を消すことはできました。 が、新しいオブジェクトを作るたびに 毎回消さなければならないので大変です。 設定を元に戻す方法をご存知ないでしょうか・・? よろしくお願い致しますm(_ _)m

  • JOGLで、GLJpanelの外でOpenGLの関数を呼ぶには

    JOGLでは、GLJPanelの各種メソッド(init,display,reshapeなど)でしか、OpenGLの関数を呼べないみたいですが、どうしてもGLJPanelの外でOpenGL の関数を呼びたいんです。携帯電話とPCの両方で動かすことができる2D描画のライブラリをつくっているので、特定のクラスの派生クラスにしなくちゃいけないとかではなく、ユーザーが自作したクラスからOpenGLを呼べるようにしたいんです。 試しに以下のコードを参考にして、initで取得したGLクラスの参照を使って、GLJPanelの外でOpenGLの関数を呼んだら、AccessVioration(アクセス違反)のエラーが出てJavaのVMが落ちてしまいました。しかも、GLJPanelのinitが呼び出されるタイミングが分からず、最初はglがnullになっていることもあります。何かいい方法はないでしょうか・・? http://d.hatena.ne.jp/SofiyaCat/20090425/1240646625

  • エクセルで作ったグラフの背景に影をつける方法

    エクセルで作ったグラフの特定の期間について、背景を暗転するなどして影をつけたいのですが、描画オブジェクトで描いても、グラフの折れ線などの後ろになるまでそのオブジェクトの順序を変えることができません。 何かいい方法はありますか? 宜しくお願いいたします。

  • 物理シミュレータを自分で組んでいるのですが、物体の衝突判定のために物体

    物理シミュレータを自分で組んでいるのですが、物体の衝突判定のために物体周りのディスタンスフィールドを構築しようとしています。そのために、物体周りの各格子点からオブジェクトの一番近いメッシュへの距離を求めたいです。 そこで質問なのですが、三次元空間上のある点から、同じく三次元空間上の三角形までの最小距離はどのように求めればよいでしょうか?直線と三角形の交差判定+線分と直線の交差判定を組み合わせれば実装出来そうな気がしますが、もっと簡単な方法がないものかと思って質問させていただきました。 またそもそもディスタンスフィールドを構築出来るもっと良い方法があれば教えてください。 わかりにくい説明ですみません。 よろしくお願いします。

専門家に質問してみよう