如何确定某个Point3D是否在摄像机视图范围内?

Tim*_*sov 6 .net c# directx 3d wpf

就是这样了.我有一个Point3D.我有一台相机.我知道相机的视角是45度; 我知道相机位置和LookDirection矢量.现在我想要一些方法来确定相机是否可以看到该点.

所以p1应该可见,p2不应该 感谢那些已经回答并评论过的人,但是:

  1. 这对我来说不是一个简单的问题.这可能看起来很简单,但我没有找到任何特殊的方法或帮助类来解决问题.我自己尝试用纯粹的数学方法解决它,但解决方案不稳定并且无法预测:

    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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我知道Helix3D,我正在使用它.我的视口和相机来自螺旋框架.

我认为如果我解释为什么需要这种测试的原因会更容易理解这个问题.我正在构建一个地球科学可视化应用程序,我需要能够深入缩放纹理以查看细节.问题是我不能使用太大的纹理,因为它们会占用太多的内存,并且绘制时间太长.然后我决定将我的飞机分成几个子矩形,每个子矩阵应分开处理.所以我的想法是,当用户放大到飞机的某个部分时,我只会渲染那个部分.它工作正常,除了代码仍然重新绘制了相机不可见的子矩形的纹理.现在我想优化它.我试着寻找任何能让我这么做的特殊功能,但没有成功.所以现在解决方案只是数学的而且不稳定,它的工作是错误的.这就是我在这里问这个问题的原因.

Gov*_*ert 1

漂亮的图片!

我认为如果 Viewport3D 中没有相机,那就不太容易了。您需要通过 Visual3D 转换与相机转换进行组合。

最简单的方法是将这些内容放入 Viewport3D 中。那么你的问题类似于这个:Projecting a 3D point to a 2D screen convention和这个:3D Projection information

请注意,一些答案是在 .NET 3.5 之前编写的,它添加了辅助函数 Visual3D.TransformToAncestor,这可能正是您所需要的。有关 TransformToAncestor 的更多信息,请访问:http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspx

如果您使用 WPF 3D 做任何事情,您需要了解很棒的Helix Toolkit,它是 3DTools 的替代品,包含视图控件和各种帮助程序,并且正在积极开发中。