6

就是这样了。我有一定的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;
    }
    
  2. 我确实知道 Helix3D,并且正在使用它。我的 Viewport 和 Camera 来自 helix 框架。

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

4

1 回答 1

1

漂亮的图片!

我认为如果您在 Viewport3D 中没有相机,这并不容易。您需要使用相机转换通过 Visual3D 转换进行组合。

最简单的方法是将这些东西放入 Viewport3D 中。然后你的问题类似于这个问题:将 3D 点投影到 2D 屏幕坐标和这个问题:3D 投影信息

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

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

于 2012-05-14T12:28:45.657 回答