ベクトルとプリミティブの交差判定について
線分とプリミティブ
衝突座標を取得する
// input1は対象のプリミティブ
vector cross; // 交差座標
vector uv; // パラメトリックUV
vector origin = @P + set(0, 1, 0) * 5000; // ベクトルの始点
vector dir = set(0, -1, 0) * 10000; // ベクトルの方向と長さ
int hitId = intersect(1, origin, dir, cross, uv);
if(hitId >= 0)
@P = cross;
intersect関数で交差点の座標crossと交差するプリミティブのパラメトリック位置(uv)が取得できる。hitIdには交差するプリミティブのインデックス番号が入る。
座標とプリミティブ
最短位置を取得し、特定のアトリビュートを取得する
xyzdist()関数を使い、座標から一番近いプリミティブ番号とパラメトリックUVを取得し、primuv()関数でパラメトリックUVとプリミティブ番号からアトリビュートを取得できる。
int index;
vector uv;
xyzdist(1, pos, index, uv);
@up = primuv(1, "N", index, uv);
//printf('index:' + sprintf('%g', index) + '\n');
プリミティブ番号を指定し、パラメトリックUVだけを知りたい場合はitoa関数で文字列に変換したインデックスを入力する。
int index;
vector uv;
xyzdist(1, itoa(k), pos, index, uv);
まとめ
交差位置から特定のアトリビュートを取得する
// input1は対象のプリミティブ
vector cross;
vector uv;
vector origin = @P + set(0, 1, 0) * 5000;
vector dir = set(0, -1, 0) * 10000;
int hitId = intersect(1, origin, dir, cross, uv);
if(hitId >= 0)
{
@up = primuv(1, "N", index, uv);
}