2012-05-14 2 views
6

Вот и все. У меня есть определенный Point3D. У меня есть камера. Я знаю угол обзора камеры, который равен 45 градусов; Я знаю положение камеры и вектор LookDirection. Теперь я хочу, чтобы узнать, будет ли точка видимой для камеры или нет.Как определить, находится ли определенный Point3D внутри границ обзора камеры?

So p1 Should be visible, p2 should not Спасибо за тех, кто ответил и комментировал, но:

  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, и я использую его. Мой видовой экран и камера выполнены из структуры спирали.

Я думаю, что будет легче понять проблему, если я объясню причину, по которой мне нужен такой тест. Я создаю приложение визуализации геофизических данных, и мне нужно иметь возможность приближать глубину к текстуре, чтобы увидеть детали. Проблема заключалась в том, что я не мог использовать слишком большие текстуры, так как они занимали слишком много памяти и слишком долго рисовали. Затем я решил разделить мой самолет на несколько подправок, каждый из которых должен обрабатываться отдельно. Таким образом, идея состоит в том, что когда пользователь приближается к определенной части плоскости, я бы сделал только эту часть. Он работал нормально, за исключением того, что код по-прежнему перерисовывал текстуры для тех субпрайклингов, которые были невидимы для камеры. Теперь я хочу оптимизировать это. Я попытался найти любую специальную функцию, которая позволила бы мне это сделать, но не удалась. Так что пока решение является только математическим, и оно неустойчиво, оно работает неправильно. Вот почему я задал этот вопрос здесь.

+0

Это, вероятно, более актуально на http://math.stackexchange.com/ –

+0

Что вы уже пробовали? Это довольно простая проблема, было бы неплохо увидеть, что вы приложили немного усилий ... –

ответ

1

Nice picture!

Я думаю, что это не так просто, если у вас нет камеры в Viewport3D. Вам нужно будет создать преобразования Visual3D с помощью преобразования камеры.

Проще всего было бы помещать материал в Viewport3D. Тогда ваш вопрос похож на этот вопрос: Projecting a 3D point to a 2D screen coordinate и этот: 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, содержащего элементы управления представлением и различные помощники, и активно обрабатывается.

Смежные вопросы