ベクトルとプリミティブの交差判定について
線分とプリミティブ
衝突座標を取得する
// input1は対象のプリミティブ
vector max;
vector min;
getbbox(1, min, max);
vector cross;
vector uv;
vector origin = @P + (max.y-@P.y) * set(0, 1, 0);
vector dir = set(0, -1, 0) * (max.y-min.y);
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 max;
vector min;
getbbox(1, min, max);
vector cross;
vector uv;
vector origin = @P + (max.y-@P.y) * set(0, 1, 0);
vector dir = set(0, -1, 0) * (max.y-min.y);
int hitId = intersect(1, origin, dir, cross, uv);
if(hitId >= 0)
{
@up = primuv(1, "N", index, uv);
}