Итак, это смущает, похоже, что все мои математические навыки в старшей школе испортились.
Я кропотливо собрал некоторый код, который, кажется, работает, но, глядя на него, я чувствую, что либо делаю это окольным путем, либо иначе не понимаю математику, стоящую за ним.
glm::vec3 cameraDirection = glm::normalize(camera->lookat - camera->position);
glm::vec3 cameraViewAxis = camera->position + (cameraDirection * (camera->farPlaneDistance) );
for(const auto & obj : scene->objects){
glm::vec3 point = obj.position;
glm::vec3 objDirection = glm::normalize(point - camera->position);
float cosAlpha = glm::dot(objDirection, cameraDirection);
float distance = glm::distance(camera->position, point);
float distanceOnViewAxis = distance * cosAlpha;
glm::vec3 pointOnViewAxis = camera->position + (cameraDirection * distanceOnViewAxis);
float distanceFromViewAxis = glm::distance(pointOnViewAxis, point);
float viewRadius = getViewRadius(distanceOnViewAxis); // based on FOV/aspect ratio
if(distanceFromViewAxis < viewRadius){
// might be visible
}
}
У меня появляется ноющее чувство, что есть лучший способ сделать это, мне нужны только distanceOnViewAxis
и distanceFromViewAxis
, которые в тригонометрических терминах - это смежные и противоположные стороны прямоугольного треугольника, я знаю углы и гипотенузу.
Я посмотрел несколько похожих вопросов, но они мне не очень помогли.