Графическая библиотека высокого уровня .NET - PullRequest
6 голосов
/ 03 февраля 2011

Я программирую различные инструменты моделирования в C # /. NET

Я ищу библиотеку визуализации высокого уровня; создайте сцену с камерой с некоторыми стандартными элементами управления и визуализируйте несколько сотен тысяч сфер или несколько каркасов. Такого рода вещи. Если для инициализации контекста требуется более одной строки, это отклоняется от моего идеала.

Я смотрел на slimDX, но его уровень ниже, чем я ищу (по крайней мере, документированные детали, но я не особо беспокоюсь о других). Перспектива WPF выглядела круто, но, похоже, она нацелена на статические сцены, определенные в XAML, и это мне тоже не подходит.

По сути, я ищу те функции, которые использовались в таких языках, как blitzbasic. Это вообще существует?

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Перспектива WPF выглядела круто, но, похоже, она нацелена на статические сцены, определенные в XAML

Посмотрите еще раз, WPF может быть настолько динамичным, насколько вам когда-либо потребуется.

Вы можете написать любую программу WPF, включая 3D, полностью без XAML.

3 голосов
/ 03 февраля 2011

Я также заинтересован в этом (так как я также разрабатываю инструменты моделирования) и закончил хакингом некоторых вещей в XNA. Однако это определенно намного больше работы, чем вы описали. Обратите внимание, что все, что вы можете сделать в WPF с помощью XAML, также можно сделать с помощью кода, поскольку XAML - это просто представление иерархии объектов и их отношений. Я думаю, что это может быть вашим лучшим выбором, хотя у меня нет метрик того, какую производительность вы могли бы ожидать с несколькими сотнями тысяч сфер (в этом случае вам обязательно понадобится отбраковка, и сама отбраковка может быть дорого, если вы не используете оптимизации, такие как разбиение сетки.)


РЕДАКТИРОВАТЬ: Если вам действительно нужно поддерживать 100К сущностей, и все они могут быть отображены как сферы, я бы порекомендовал вам полностью обойти 3d-движок и использовать только XNA для математики. Я хотел бы представить такой подход, как следующий:

  • Используйте XNA для настройки матрицы камеры (вид) и перспективы. Он имеет несколько удобных статических функций Matrix, которые облегчают эту задачу.

  • Вычислите матрицу проекции и спроецируйте все исходные точки вашей сферы на область просмотра. Это даст вам координаты экрана X, Y и глубину Z в усеченной зоне. Вы можете выразить это как умножение отдельных матриц по 100 КБ или умножение матрицы проекции на одну матрицу элементов размером 3 x 100 КБ. В первом случае это отличный кандидат на параллелизм с использованием новой функциональности .NET 4 Parallel.

  • Если вы обнаружите, что умножения матрицы 100K представляют собой проблему, вы можете значительно уменьшить это, выполнив выборку точек перед преобразованием, если вы знаете, что в данный момент времени будет видно только небольшое их подмножество. Например, вы можете инвертировать матрицу проекции, чтобы найти границы вашего усеченного стержня в исходном пространстве и создать ограничивающий прямоугольник с осями для усеченного стержня. Затем вы можете исключить все точки за пределами этого поля (простые тесты сравнения в X, Y и Z.) Этот ограничивающий прямоугольник необходимо заново вычислять только при изменении матрицы проекции, поэтому, если она меняется нечасто, это может быть разумной оптимизацией.

  • После того, как у вас есть трансформированные точки, обрежьте любую за пределами усеченного конуса (Z <0, Z> maxDist, X <0, Y <0, X> ширина, Y> высота). Теперь вы можете визуализировать каждую точку, нарисовав закрашенный круг с радиусом, пропорциональным Z (Z = 0 будет иметь наибольший радиус, а Z = maxDist, вероятно, исчезнет до одной точки.) Если вы хотите обеспечить ощущение затенения / глубины Вы можете сделать рендеринг с затененной кистью, чтобы очень слабо имитировать освещение на сферах. Это работает, потому что все в вашей сцене является сферой, и вы, вероятно, не беспокоитесь о таких вещах, как тени. Все это будет довольно легко сделать в WPF (включая Shaded Brush), но обязательно используйте классы DrawingVisual , а не элементы фреймворка. Кроме того, вам нужно убедиться, что вы рисуете в правильном Z-порядке, так что это помогает, если вы сохраняете преобразованные точки в структуре данных, которая сортируется по мере добавления.

  • Если у вас все еще есть проблемы с производительностью, вы можете продолжить оптимизацию. Например, если вы знаете, что движется только подмножество ваших точек, вы можете кэшировать преобразованные местоположения для неподвижных точек. Это действительно зависит от природы вашего набора данных и от того, как он развивается.

  • Поскольку ваш набор данных очень большой, вы можете изменить способ его визуализации.Вместо рендеринга 100K точек, разделите ваше рабочее пространство на объемную сетку и запишите количество (плотность) точек внутри каждого куба сетки.Вы можете проецировать только центр сетки и визуализировать его как «сферу» с некоторой дополнительной обратной связью (например, цвет, прозрачность или текстура кисти), чтобы указать плотность точек.Вы можете комбинировать эту технику с традиционным подходом рендеринга, визуализируя близкие точки как «сферы» и дальние точки как «кластерные» объекты с некоторой кистью для соответствия плотности.Один простой алгоритм - рассмотреть ограничивающую сферу вокруг камеры;все точки внутри сферы будут преобразованы нормально;за пределами сферы вы будете рендерить только с использованием сетки плотности.

3 голосов
/ 03 февраля 2011

Может быть, XNA Game studio - это то, что вы ищете.

Также взгляните на DirectX .

0 голосов
/ 03 февраля 2011

Вам нужно использовать C # /. Net или MonoDevelop будет достаточно хорош? Я могу порекомендовать http://unity3d.com/, если вам нужен мощный 3D-движок.

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