3d 什么';s检查点是否在三维圆锥体内的正确方法

3d 什么';s检查点是否在三维圆锥体内的正确方法,3d,geometry,glm-math,3d,Geometry,Glm Math,所以,这很尴尬,看起来我所有的高中数学技能都生锈了 我费劲地拼凑了一些似乎有效的代码,但看着它,我觉得我要么是在迂回地做这件事,要么就是不理解它背后的数学原理 glm::vec3-camerradirection=glm::normalize(摄像机->注视-摄像机->位置); glm::vec3 cameraViewAxis=摄像机->位置+(摄像机方向*(摄像机->远平面距离)); 用于(常量自动和对象:场景->对象){ glm::vec3点=目标位置; glm::vec3 OBJDDire

所以,这很尴尬,看起来我所有的高中数学技能都生锈了

我费劲地拼凑了一些似乎有效的代码,但看着它,我觉得我要么是在迂回地做这件事,要么就是不理解它背后的数学原理

glm::vec3-camerradirection=glm::normalize(摄像机->注视-摄像机->位置);
glm::vec3 cameraViewAxis=摄像机->位置+(摄像机方向*(摄像机->远平面距离));
用于(常量自动和对象:场景->对象){
glm::vec3点=目标位置;
glm::vec3 OBJDDirection=glm::规格化(点-相机->位置);
float cosAlpha=glm::dot(objDirection,CameradDirection);
浮动距离=glm::距离(相机->位置,点);
浮动距离视轴=距离*余角;
glm::vec3 pointOnViewAxis=摄像机->位置+(摄像机方向*距离ONVIEWAxis);
浮动距离fromViewAxis=glm::距离(ViewAxis上的点,点);
浮动viewRadius=getViewRadius(distanceOnViewAxis);//基于视场/纵横比
if(与视图轴的距离<视图半径){
//可能看得见
}
}
我觉得有更好的方法可以做到这一点,我只需要
distanceOnViewAxis
distanceFromViewAxis
,它们在三角函数中是直角三角形的相邻边和相对边,我知道角度和斜边


我看了一些类似的问题,但它们并没有真正帮助我。

这里有一个更简洁的解决方案,使用点积和叉积

bool在圆锥体中(常量glm::vec3和摄影机位置,常量glm::vec3和摄影机方向,常量glm::vec3和对象位置){
自动规格化方向=glm::规格化(摄影机方向);
自动对象向量=对象位置-摄像机位置;
视图轴上的自动显示=glm::dot(对象向量,标准化方向);
如果(视图上的显示轴<0.0f)返回false;
返回glm::length(glm::cross(obj_向量,normalized_dir))请参见