Wpf Viewport Координаты - PullRequest
       18

Wpf Viewport Координаты

2 голосов
/ 26 декабря 2009

Привет, ребята, я работаю с wpf 3d, сейчас я пишу программу, которая будет создавать 3d плитки по экрану слева направо, но мне нужно знать, какие у меня границы на X, Y, т.е. (-x-0) (0-х +), поэтому я знаю, когда начинать еще один ряд плиток. Мои первоначальные мысли пытаются выяснить сложный алгоритм перехода от пикселей к координатам экрана, однако кажется, что должен быть более простой способ.

1 Ответ

3 голосов
/ 27 декабря 2009

Если я вас правильно понимаю, вы хотите узнать, какой диапазон 3D-координат видим в вашем Viewport3DVisual.

На этот вопрос нет единого ответа. Чтобы понять почему, представьте, что вы сидите за своим кухонным столом и завтракаете и случайно смотрите в окно. Какой горизонтальный диапазон вы видите? Ну, вы можете увидеть около пяти миль от этих голубых гор на расстоянии, но только тридцать футов вашего заднего забора. Другими словами, видимая область - это не прямоугольная призма, а пирамида.

Суть в том, что вам нужно будет указать необходимое расстояние, прежде чем оно станет значимым, какой горизонтальный и вертикальный диапазон видны через окно просмотра.

После того, как вы определили расстояние, вот как отобразить свое окно просмотра на 3D-точки на данной плоскости, не выполняя все вычисления самостоятельно:

  1. Создание модели в отдельном Viewport3dVisual с использованием тех же настроек камеры, но с моделью, состоящей исключительно из одного большого прямоугольника на желаемом расстоянии.
  2. Используйте тестирование на попадание, чтобы проверить каждый угол области просмотра, получив обратный вызов результата теста на попадание.
  3. Извлеките координаты прямоугольника из результата теста попадания и используйте их для своих расчетов.

Преимущество этого метода в том, что он надежно работает в любом месте камеры и работает даже с анимированными камерами и т. Д.

Примечание. Если я неправильно понял вопрос, а вы просто спрашиваете о размещении рядов плиток в 2D, которые будут содержать 3D-контент, то вы можете получить описанный эффект, просто используя WrapPanel. Если вы хотите связать данные, используйте ItemsControl или ListBox с ItemPanelTemplate WrapPanel.

...