In 3D I have been given a ray and a disc: $$Ray=\mathbf{r_o}+t*\mathbf{\hat{r_d}}$$ $$Disc=\mathbf{\hat{d_n}} \cdot \langle x\;y\;z \rangle=0, ||\mathbf{d_o}-\langle x\;y\;z \rangle||<d_r$$
where
- $\mathbf{r_o}$ is the ray origin
- $\mathbf{\hat{r_d}}$ is the ray unit direction vector
- $t>0$
- $\mathbf{d_o}$ is the disc center
- $\mathbf{\hat{d_n}}$ is the disc unit normal vector
- $d_r$ is the disc radius
I'm trying to find
$$Ray'=\mathbf{r_o} + t*\mathbf{\hat{r_d}'}$$
that intersects the disc and minimizes the angle between $\mathbf{r_d}$ and $\mathbf{\hat{r_d}'}$ (in other words maximizes $\mathbf{\hat{r_d}} \cdot \mathbf{\hat{r_d}'}$). If $\mathbf{\hat{r_d}}$ intersects the disc then naturally $\mathbf{\hat{r_d}'}=\mathbf{\hat{r_d}}$ and otherwise $\mathbf{\hat{r_d}'}$ points towards the disc edge.
This is similar problem as finding the vector for ray-rectangle I posted about earlier, but with different primitive:
Finding ray direction with smallest angle from a ray to a rectangle in 3D
However, I can't use the same approach of constructing supporting planes for the disc since that would require infinite number of planes.
I tried to calculate intersection $\mathbf{r_i}$ of the ray with the plane of the disc and calculated $\mathbf{v}=\frac{\mathbf{r_i}-\mathbf{d_o}}{||\mathbf{r_i}-\mathbf{d_o}||}*d_r$ and $\mathbf{\hat{r_d}'}=\frac{\mathbf{d_o}-\mathbf{r_o}+\mathbf{v}}{||\mathbf{d_o}-\mathbf{r_o}+\mathbf{v}||}$ when the ray doesn't intersect the disc. This however doesn't give correct result, and the error is particularly large when the ray gets more parallel to the disc plane. I was thinking that maybe following the ray-rectangle analogy by defining oblique cone with the disc and $\mathbf{r_o}$ would help and then performing some kind of operation with the cone and $\mathbf{\hat{r_d}}$, but I don't know if this is a proper approach or what this operation should be.