交差判定で衝突点のアトリビュートを取得する

ベクトルとプリミティブの交差判定について

線分とプリミティブ

衝突座標を取得する

// 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を取得する。

int index;
vector uv;
xyzdist(1, pos, index, uv);

//printf('index:' + sprintf('%g', index) + '\n');

プリミティブ番号を指定し、パラメトリックUVだけを知りたい場合はitoa関数で文字列に変換したインデックスを入力する。

int index;
vector uv;
xyzdist(1, itoa(k), pos, index, uv);

プリミティブからアトリビュートを取得

primuv関数で、パラメトリックUVとプリミティブ番号からアトリビュートを取得できる。

@up = primuv(1, "N", 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);
}

座標から一番近いアトリビュートを取得する

// input1は対象のプリミティブ

int index;
vector uv;
xyzdist(1, pos, index, uv);
@up = primuv(1, "N", index, uv);
タイトルとURLをコピーしました