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