就是这样了。我有一定的Point3D。我有一个相机。我知道相机的视角,也就是45度;我知道相机位置和 LookDirection 向量。现在我想要一些方法来确定该点是否对相机可见。
感谢那些回答和评论的人,但是:
这对我来说不是一个简单的问题。这似乎是一件简单的事情,但我没有找到任何特殊的方法或帮助类来解决问题。我曾尝试以纯数学方式自己解决它,但解决方案不稳定且无法预测:
bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) { //first calculate Distance to the plane formed by normal vector LD and point P on it var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb //L is the distance to the plane. double L = Math.Abs( (LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D)) / Math.Sqrt(LD.X * LD.X + LD.Y * LD.Y+LD.Z * LD.Z); var BL = L * Math.Tan(CameraAngle); //length of bound part var PL = Math.Sqrt(((new Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // length of point part //test if point is out of bounds! return PL <= BL; }
我确实知道 Helix3D,并且正在使用它。我的 Viewport 和 Camera 来自 helix 框架。
我认为如果我解释我需要这种测试的原因会更容易理解问题。我正在构建一个地球科学可视化应用程序,我需要能够深入到纹理中以查看细节。问题是我不能使用太大的纹理,因为它们会占用太多内存,并且绘制时间太长。然后我决定把我的飞机分成几个子矩形,每个子矩形都应该分开处理。所以想法是,当用户放大平面的某个部分时,我只会渲染该部分。它工作正常,除了代码仍然为那些对相机不可见的子矩形重新绘制纹理。现在我想优化它。我尝试搜索任何可以让我这样做的特殊功能,但没有成功。所以现在解决方案只是数学上的,它' 不稳定,工作不正常。这就是我在这里问这个问题的原因。