, , , P_ray0 Dir_ray, , P_centerS radius_S.
, P_ray0 , Dir_ray .
, , , .
, .
, .
, .
P_ray = dist * Dir_ray + P_ray0
dot( P_plane - P_plane0, NV_plane ) == 0:
P_isect = P_ray0 + Dir_ray * dist;
dist = dot( P_plane0 - P_ray0, NV_plane ) / dot( Dir_ray, NV_plane )
NV_plane , wt , .
, dot( Dir_ray, NV_plane ) == 1:
P_isect = P_ray0 + Dir_ray * dot( P_plane0 - P_ray0, NV_plane );
++ :
#include <math.h>
bool isectRraySphere(
const vec3 &P_ray0,
const vec3 &Dir_ray,
const vec3 &P_centerS,
float radius_S )
{
vec3 NV = normalize( Dir_ray );
vec3 P_isect = P_ray0 + NV * dot( P_centerS - P_ray0, NV );
float isect_dist = length( P_isect - P_centerS );
bool isect = isect_dist < radius_S;
return isect;
}
, , . , sqrt:
vec3 dv = P_isect - P_centerS;
bool isect = (dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]) < (radius_S * radius_S);
. : glm.
using vec3 = std::array<float, 3>;
vec3 operator + (vec3 a, vec3 b) { return {a[0]+b[0], a[1]+b[1], a[2]+b[2]}; }
vec3 operator - (vec3 a, vec3 b) { return {a[0]-b[0], a[1]-b[1], a[2]-b[2]}; }
vec3 operator * (vec3 v, float d) { return {v[0]*d, v[1]*d, v[2]*d}; }
vec3 length(vec3 v) { return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ); }
vec3 normalize(vec3 v) { float len = length(v); return {v[0]/len, v[1]/len, v[2]/len}; }
float dot(vec3 a, T_B b) { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }