Я работал в индустрии видеоигр и могу сказать, что выполнение триггерных функций, таких как arccos, в каждом кадре не является идеальным. Вместо этого вы предварительно вычисляете косинус угла для конуса:
float cos_angle = cos(PI/4); // 45 degrees, for example
Затем в каждом кадре можно быстро проверить, попадает ли точка в этот конус, сравнив его с точечным произведением конуса и.
vector test_point_vector = normalize(test_point_loc - cone_origin);
float dot_product = dot(normalized_cone_vector, text_point_vector);
bool inside_code = dot_product > cos_angle;
Нет тригонометрических функций, только умножение, деление и сложение. Большинство игровых движков имеют оптимизированную функцию normalize () для векторов.
Это работает из-за этого уравнения:
A · B = |A| * |B| * cos(Θ)
Если вы нормализуете векторы (A -> An), уравнение упрощается:
An · Bn = cos(Θ)