Вот и все. У меня есть определенный Point3D. У меня есть камера. Я знаю угол обзора камеры, который равен 45 градусов; Я знаю положение камеры и вектор LookDirection. Теперь я хочу, чтобы узнать, будет ли точка видимой для камеры или нет.Как определить, находится ли определенный Point3D внутри границ обзора камеры?
Спасибо за тех, кто ответил и комментировал, но:
Это не простая задача для меня. Это может показаться простой вещью, но я не нашел специального метода или вспомогательного класса для решения проблемы. Я попытался решить это сам, в чисто математическом пути, но решение неустойчиво и работает непредсказуемо:
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, и я использую его. Мой видовой экран и камера выполнены из структуры спирали.
Я думаю, что будет легче понять проблему, если я объясню причину, по которой мне нужен такой тест. Я создаю приложение визуализации геофизических данных, и мне нужно иметь возможность приближать глубину к текстуре, чтобы увидеть детали. Проблема заключалась в том, что я не мог использовать слишком большие текстуры, так как они занимали слишком много памяти и слишком долго рисовали. Затем я решил разделить мой самолет на несколько подправок, каждый из которых должен обрабатываться отдельно. Таким образом, идея состоит в том, что когда пользователь приближается к определенной части плоскости, я бы сделал только эту часть. Он работал нормально, за исключением того, что код по-прежнему перерисовывал текстуры для тех субпрайклингов, которые были невидимы для камеры. Теперь я хочу оптимизировать это. Я попытался найти любую специальную функцию, которая позволила бы мне это сделать, но не удалась. Так что пока решение является только математическим, и оно неустойчиво, оно работает неправильно. Вот почему я задал этот вопрос здесь.
Это, вероятно, более актуально на http://math.stackexchange.com/ –
Что вы уже пробовали? Это довольно простая проблема, было бы неплохо увидеть, что вы приложили немного усилий ... –