【发布时间】:2019-06-17 00:35:27
【问题描述】:
所以,这很尴尬,看起来我所有的高中数学技能都已经生锈了。
我费力地整理了一些似乎可以工作的代码,但看着它,我觉得我要么在绕道而行,要么不理解其背后的数学原理。
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,在三角函数中它们是相邻和相反 em> 直角三角形的边,我知道角和斜边。
我查看了一些类似的问题,但它们并没有真正帮助我。
【问题讨论】: