Привет, ребята, я работаю с wpf 3d, в настоящее время я пишу программу, которая будет создавать 3D-плитки на экране слева направо, но мне нужно знать, каковы мои границы по X, Y, т.е. (-x-0) (0- x+), поэтому я знаю, когда начинать следующий ряд плиток. Мои первоначальные мысли пытаются выяснить сложный алгоритм перехода от пикселей к координатам экрана, однако кажется, что должен быть более простой способ.
Координаты области просмотра Wpf
Ответы:
Если я вас правильно понял, вы хотите узнать, какой диапазон 3D-координат виден через ваш Viewport3DVisual.
Этот вопрос не имеет единого ответа. Чтобы понять почему, представьте, что вы сидите за кухонным столом и завтракаете, а случайно смотрите в окно. Какой горизонтальный диапазон вы видите? Ну, вы можете видеть около пяти миль тех голубых гор вдалеке, но только в тридцати футах от вашего заднего забора. Другими словами, видимая область представляет собой не прямоугольную призму, а скорее пирамиду.
Суть в том, что вам нужно будет указать необходимое расстояние, прежде чем станет понятным, какой горизонтальный и вертикальный диапазон виден через окно просмотра.
После того, как вы указали расстояние, вот как сопоставить ваш видовой экран с 3D-точками на заданной плоскости, не выполняя все расчеты самостоятельно:
- Создайте модель в отдельном Viewport3dVisual, используя те же настройки камеры, но с моделью, состоящей исключительно из одного большого прямоугольника на нужном расстоянии.
- Используйте проверку попадания для проверки каждого угла области просмотра, получая обратный вызов результата проверки попадания.
- Извлеките координаты прямоугольника из результатов теста попадания и используйте их для своих расчетов.
Преимущество этого метода заключается в том, что он надежно работает, куда бы ни была направлена камера, и даже работает с анимированными камерами и т. Д.
Примечание. Если я неправильно понял вопрос, и вы просто спрашиваете о размещении рядов плиток в 2D, которые будут содержать 3D-контент, то вы можете получить описанный вами эффект, просто используя WrapPanel. Если вы хотите выполнить привязку данных, используйте ItemsControl или ListBox с ItemPanelTemplate WrapPanel.