2009-07-11 10 views
15

私はAとBの2つのモデルと1つのライトLを持っています。私はモデルAにモデルBの影を投げたいと思います。私はシャドウボリュームや適切なシャドウを邪魔したくはありません。円の影で十分です。モデルAはシャドーキャスティングの目的で球として扱われるという効果があります。三角形を描く、モデルBの各三角形についてはOpenGLで安い影を作成する方法は?

:ここ

は、私はアルゴリズムを想像する方法です。 LからAまでの線に沿って三角形に円を投影し、三角形の距離に応じて円のサイズを増やします。円が三角形の境界にクリップされていることを確認します(何らかの形でステンシルバッファを使用します)。

私は、OpenGLとプレーンC.

私は読むことができるいくつかのリファレンスマニュアルの任意のポインタをして働いていますか?またはインプランテーションのアイデア?

答えて

9

OpenGLがあなたのために仕事をすることができるので、実際には正しいシャドウを実装する方が簡単だと思います。

私はここにたくさんの文書で作業影のコードが見つかりました:http://www.opengl.org/resources/code/samples/mjktips/TexShadowReflectLight.html

上記のコードは二回、オブジェクトをレンダリングする:第1常その後、特別なマトリックスと。それは、マウスや反射のコントロールなど、無関係なことがたくさんあります。ここに興味深い部分があります。私は完全にこれを理解するふりをしていない

/* Create a matrix that will project the desired shadow. */ 
void 
shadowMatrix(GLfloat shadowMat[4][4], 
    GLfloat groundplane[4], 
    GLfloat lightpos[4]) 
{ 
    GLfloat dot; 

    /* Find dot product between light position vector and ground plane normal. */ 
    dot = groundplane[X] * lightpos[X] + 
    groundplane[Y] * lightpos[Y] + 
    groundplane[Z] * lightpos[Z] + 
    groundplane[W] * lightpos[W]; 

    shadowMat[0][0] = dot - lightpos[X] * groundplane[X]; 
    shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y]; 
    shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z]; 
    shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W]; 

    shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X]; 
    shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y]; 
    shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z]; 
    shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W]; 

    shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X]; 
    shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y]; 
    shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z]; 
    shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W]; 

    shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X]; 
    shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y]; 
    shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z]; 
    shadowMat[3][3] = dot - lightpos[W] * groundplane[W]; 

} 

これは影行列を計算します。 lightposは光源の位置です。地面の最初の3つの座標は、地面の法線ベクトルです。 4番目はオフセット(0,0,0からどれだけ離れているか)です。

そして、この部分は、実際に影をレンダリングする:

glPushMatrix(); 
/* Project the shadow. */ 
glMultMatrixf((GLfloat *) floorShadow); 
drawDinosaur(); 
glPopMatrix(); 

あなたはglEnableです/またはglDisableに必要ないくつかのものは、最初にこれが機能するためにありますので、リンクを見てください。

+4

これは、モデルを平面上に単に「平坦化」します。平面に影を投影するのに適しています。 OPは任意の形状の3Dオブジェクトに影を描きたい。 –

+0

これはおそらくそれを行うことができます:http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=27 残念ながら私はgccでコンパイルできません。 – stribika

+0

このメソッドはうまくいくようですが、Bの各フェースに対してソースモデルを1回描画するコストが高いようです。この方法の複雑さを減らす方法はありますか? – Martin

0

This paperは、OpenGLとハードウェアアクセラレーションを使用して詳細なシャドウマップを作成するように見えます。

私がこれを達成しようとしていたなら、私はレイキャスティングを使用するように誘惑されるでしょう。 Bの各三角形について、三角形からライトにベクトルを作成します。道に沿って何かを打つと、それは影になっている。あなたがまともな加速構造と高速の三角ヒットテストを使用していない限り、これは一種のものです。私はbounding volume hierarchiesが好きです。多くのプログラムで衝突検出にも使用されています。

関連する問題