ラインビルボードの計算方法
現在でも一応ラインを引くことには成功していますが、カメラを操作するとペラペラの板であることがすぐに分かってしまいます。

この問題を解決するために、先ほど紹介した「ラインビルボード」の計算を行います。
計算を行うには以下の2つの情報が必要です。
- 視線ベクトル(視点から現在座標への方向)
- 進行ベクトル(現在の点が向いている方向)
視線ベクトル
視線ベクトル(カメラの方向)は、「normalize(カメラの座標 - 現在の頂点座標)」で求められます。
コード化するとこのようになります。
float3 EyeVec = normalize(CameraPosition-NowPos);
進行ベクトル
進行ベクトルは、"現在の座標"と"次の座標"を元に計算します。"次の座標"の取得には先ほどのlerp関数を利用します。
コード化するとこのようになります。
//現在座標から少しだけ先に進めた座標を取得 float3 NextPos = lerp(ZeroPos,TargetPos,Pos.z+0.01); //現在の座標から先の座標から正面方向のベクトルを得る float3 FrontVec = normalize(NextPos - NowPos);
現在の位置(Pos.z)に少し値を足すことにより、先の座標を取得しています。
ビルボード計算
視線ベクトルと進行ベクトル、2つのベクトルを利用してビルボード計算を行います。このような計算を行うには、外積(cross関数)を利用します。
こと3Dプログラミングにおける外積の主な使い方としては、「ベクトルAとベクトルBからなる平面に対して直角のベクトルを得る」ことに使われることがほとんどです。
これで視線に対して常に90度の角度のベクトルを得ることができました。
このベクトルを頂点座標に足してやることで、目的である、常にカメラの方向を向くための座標を得ることができます。
モデルの初期X座標は0.5、もしくは-0.5なので(当記事、モデルデータ構造参照)、それを参照して頂点を左右に振り分ければ、ラインビルボードの計算は終了です。
//現在処理している頂点を左右に割り振る
//すべての頂点のX座標は0.5もしくは-0.5
if(Pos.x > 0)
{
LastPos.xyz += SideVec;
}else{
LastPos.xyz -= SideVec;
}
