ログイン交差判定_3DCG交差判定レイトレース処理での一番大事な部分、交差判定について記述します。ここではレイ(視点位置と視線ベクトルを持つ)とポリゴン(三角形)との交差判定になりますね。ポリゴンをX/Y/Z軸を圧縮する形で2次元に投影してしまいます。これは、X-Y平面への投影・X-Z平面への投影・Z-Y平面への投影の3つの投影があります。確実なのは(誤差を少なくするのは)それぞれの面に投影した場合の面積を計算して、一番面積の大きい面に投影するとするといいです。上図の場合は、X-Z平面に投影しています(三角形の頂点座標のうち、X/Z成分のみを取り出します)。レイの方向ベクトルと面の法線ベクトルにより「直線と面の交点位置」を求めます(これは3次元空間での処理)。このときに交点が求まります。三角形内に内包されているかは分かりません。これを、X-Z平面に三角形を投影している場合は交点座標のX/Z成分のみを取り出すとよいです。後は2次元空間の処理になります。空間としては、横方向プラスは右向き・縦方向プラスは上向きで三角形の頂点の並びが逆時計周り、としていますが下記方法だと特に意識する必要はありません。ポリゴン頂点座標を0-1-2、交点位置をPとします。P-0、0-1の順にベクトルを作成(上図の灰色の矢印)してこれの外積を求めます。bxこの外積が>0の場合はカウンタを+1します。それ以外は-1します。同様に、P-1/1-2のベクトル・P-2/2-0のベクトルも外積を求めてカウンタを操作します。この結果、カウンタが-3または+3の場合では三角形内に交点Pが内包されている、と結論を下すことができます。」の論文の交差判定です。この場合は3次元のポリゴンを2次元に投影する必要はありません。http://www.ce.chalmers.se/old/staff/tomasm/raytri/また、研究されつくしているようないわゆる「枯れた」手法ですのでよく使われます。これは、レイの始点位置・レイの方向ベクトル(単位ベクトル済み)と三角形の3頂点が与えられたときの視点からの距離Tと交点情報U/Vを求めます。Origがレイの開始位置、dirがレイの方向ベクトル(単位ベクトルに正規化済み)、v0/v1/v2が三角形の頂点座標とし、結果をpRetT/pRetU/pRetVで示されるポインタに返す関数は以下のようになります。//hit!!}ちなみに、各関数は3次元のベクトル操作関数です。ベクトル操作関数は自前で用意しておくのがいいかと思います(よく使います)。aとbの外積を求め、結果はc(VECTOR3)結果、始点Origからの距離Tで交わります。交点情報U/Vが求まります。U/Vは、法線やテクスチャのUV(同じUVでややこしいですが別物です)を求める際に使用します。交点座標は以下の感じで求まります。これは、レイの方向ベクトルが単位ベクトル(長さ1.0)なんで単純ですね。n1/n2/n3とする)」が定義されているとして以下の感じです。n3;ここでのnが交点位置での法線ベクトルになります(正規化されたものです)。Arenbergの交差判定http://www.acm.org/tog/resources/RTNews/html/rtnews5b.html#art3上記の方法よりも、より計算処理を省略することができます。精度としては少し荒く感じます。0)の形に変換し、同時にレイの位置・方向ベクトルも変換(アフィン変換)します。計算処理が少なくて済むというのが一番のメリットです。これより、まずポリゴンの法線ベクトルを求めて正規化します。0)の空間に変換するための変換行列を求めます。z2)]の「逆行列(Q'とします)」が求める変換行列になります。z2;以上が前処理です。4をバッファに蓄えておく)。三角形の頂点座標は不要ですので破棄してOKです。それでは交差判定を行います。dz)が渡されたときにこのレイ情報をアフィン変換する必要があります。C)で座標位置PをP'に変換します。oz2)がレイの開始位置の変換後の座標になります。ベクトルは以下の式で変換します。VVが方向ベクトルになりV'に変換します。dz2)がレイの方向ベクトルになります。注意点としてここで、「単位ベクトルに正規化しないでください」。0)の空間にレイを変換しているからです。この状態で変換前の距離Tを算出するのでそのままにしておく必要があるわけです。dz2)のdx2が0.0の場合は三角形と交わらないことになりますので「交差なし」でスキップできます。0;距離Tを求めます。0;交点情報のU/Vを求めます。Mollerの交差判定」のときと同じ結果です。tがレイの始点からの距離でu/vが交点情報になります。同様にU/Vより交点位置と法線ベクトルなどを計算することができます。逆行列を求めてから後はアフィン変換とT/U/Vの算出だけ、ということで非常に低コストですね。精度は多少粗が見えます(微妙に一定周期のノイズが乗っています)。リアルタイムでレイトレを行うなどの場合には大変有効なアルゴリズムであると思います(オフラインレンダラでは品質優先の場合は厳しいかな)。http://www.saarcor.de/」があります。これはZバッファベースのOpenGL/DirectXの手法ではなく、レイトレーシングを行う方法でハードウェア(FPGA)にて交差判定を含むレイシューティングを行っています。サンプルを見る限りは比較的大きなポリゴンが多いですので違和感がないですが、細かいオフラインレンダラのシーン(極小ポリゴンが密集しているシーンなど)は品質として厳しくなるかもしれないですね。(後、仮数部16bitの24ビット浮動小数点を使っているとすると結構厳しいかなと。Moller」の交差判定手法をお勧めします。独り言日記(2016/01)独り言日記(2015/12)独り言日記(2015/09)独り言日記(2015/08)独り言日記(2015/07)独り言日記(2015/06)独り言日記(2015/05)独り言日記(2015/04)独り言日記(2015/03)独り言日記(2015/02)独り言日記(2015/01)独り言日記(2014/12)独り言日記(2014/11)独り言日記(2014/10)独り言日記(2014/09)独り言日記(2014/08)独り言日記(2014/07)独り言日記(2014/06)独り言日記(2014/05)独り言日記(2014/04)独り言日記(2014/03)独り言日記(2014/02)独り言日記(2014/01)独り言日記(2013/12)独り言日記(2013/11)独り言日記(2013/09)独り言日記(2013/07)独り言日記(2013/06)独り言日記(2013/05)独り言日記(2013/01)独り言日記(2012/12)独り言日記(2012/10)独り言日記(2012/09)独り言日記(2012/08)独り言日記(2012/07)独り言日記(2012/06)独り言日記(2012/05)独り言日記(2012/04)独り言日記(2012/03)独り言日記(2012/02)独り言日記(2012/01)独り言日記(2011年)独り言日記(2010年)独り言日記(2009年)独り言日記(2008年)独り言日記(2007年)独り言日記(2006年)独り言日記(2005年)独り言日記(2004年)変更履歴2016/1/2独り言日記(2016/01)Menu2015/12/31独り言日記(2015/12)2015/9/4独り言日記(2015/09)2015/8/31独り言日記(2015/08)2015/7/25独り言日記(2015/07)2015/6/24独り言日記(2015/06)2015/6/23FrontPage2015/5/30独り言日記(2015/05)2015/4/29独り言日記(2015/04)2015/3/29独り言日記(2015/03)2015/2/28独り言日記(2015/02)2015/2/1独り言日記(2015/01)2014/12/31独り言日記(2014/12)2014/11/29独り言日記(2014/11)。