sdcapsule
https://gyazo.com/3186e0b4ab7de79d936484d9f43e86a9
code:glsl
float sdcapsule(vec3 p, vec3 tail) {
float t = clamp(dot(p, tail) / dot(tail, tail), 0.0, 1.0);
return length(p - (tail * t));
}
こいつ自体には太さはないので、太さが欲しい場合は自分で引き算してね
考え方
t は即ち、 p が tail の方向にどのくらい向かっているか
dot() / dot() によって、 tail と同じ長さ分だけ進んだたらちょうど 1.0 で、変化が線形になるように帳尻が合う
saturate しないと線分じゃなくて直線になるよ
t が求まったら、 tail * t が線分と点 p の距離が最短の線分上の1点になる