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 について知っていて、それを使用しています。私のビューポートとカメラはらせんフレームワークからのものです。

この種のテストが必要な理由を説明すると、問題が理解しやすくなると思います。地球科学の視覚化アプリケーションを構築していますが、詳細を表示するにはテクスチャを深くズームできる必要があります。問題は、大きすぎるテクスチャを使用できないことでした。メモリを大量に消費し、描画に時間がかかりすぎるからです。次に、平面をいくつかのサブ長方形に分割し、それぞれを個別に処理することにしました。つまり、ユーザーが平面の特定の部分にズームインすると、その部分のみをレンダリングするという考え方です。カメラには見えなかったサブ長方形のテクスチャをコードが再描画したことを除けば、問題なく動作しました。これを最適化したいと思います。それを可能にする特別な機能を探してみましたが、成功しませんでした。したがって、今のところ、解決策は数​​学的なものにすぎません。は不安定で、正しく動作していません。そのため、ここでこの質問をしました。

4

1 に答える 1

1

素敵な写真!

Viewport3Dにカメラがなければ、それほど簡単ではないと思います。カメラトランスフォーメーションを使用して、Visual3Dトランスフォーメーションを介して作成する必要があります。

最も簡単なのは、それらをViewport3Dに入れることです。次に、あなたの質問はこれに似ています:3Dポイントを2Dスクリーン座標に投影することとこれは:3D投影情報です。

一部の回答は.NET3.5より前に記述されており、ヘルパー関数Visual3D.TransformToAncestorが追加されていることに注意してください。これはおそらく必要なものです。TransformToAncestorの詳細については、http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspxを参照してください。

また、WPF 3Dで何かをしている場合は、ビューコントロールとさまざまなヘルパーを含む3DToolsの代替であり、積極的に取り組んでいる素晴らしいHelixToolkitについて知る必要があります。

于 2012-05-14T12:28:45.657 に答える