Вопросы применения 3D-графики - PullRequest
0 голосов
/ 15 марта 2019

Для одного из моих классов я создал приложение для трехмерной графики (с использованием Visual Basic). Он принимает строку (z = f (x, y)) в качестве входных данных, анализирует ее в нотации RPN, затем оценивает и отображает на графике уравнение. В то время как это работало, потребовалось приблизительно 20 секунд, чтобы построить график. Я хотел бы добавить ползунки, чтобы повернуть график по вертикали и горизонтали, но это было определенно слишком медленно, чтобы допустить это.

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

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

Наконец, мне нужен лучший способ отображения графика. В настоящее время (используя VB с визуальной студией) я строю 200 000 точек на графике, но это никак не выглядит великолепно. В конце концов, я хотел бы иметь возможность изменять цвет в зависимости от высоты и других графических манипуляций, чтобы он выглядел лучше.

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

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Итак, я объясню, как мне поступить, используя C ++ и OpenGL.Это не означает, что это инструменты, которые вы должны использовать, это просто стандартные графические инструменты.

Поверхность вашей функции - это, по сути, двумерный манифольд, который обладает приятным свойством иметь интуитивно понятное отображение на 2Dпространство.То, что обычно называют UV-отображением.

Что вам нужно сделать, это выбрать диапазоны для области прямоугольника, которую вы хотите отобразить (минимум x, максимум x, минимум y, максимум y) и сделать 2 вложенными для цикловв форме:

// Pseudocode
for (x=minimum; x<maximum; x++)
    for (y=minimum; y=maximum; y++)
       3D point = (x,y, f(x,y))

Сохраните все эти точки в контейнере (вектор std для c ++ отлично работает), и это будет ваша "сетка".

Это делается один раз, додля рендеринга.Затем вы визуализируете эти точки, используя, например, GL_POINTS, и вращаете сетку графика, используя вращения на графическом процессоре.

Это покажет только рассеянные точки, а не поверхность.

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

Сгруппируйте каждые 4 смежные вершины (то есть вершины с индексами <x,y>, <x+1,y>, <x+1,y>, <x+1,y+1>) и создайте 2 треугольника:

(<x,y>, <x+1,y>, <x,y+1>), (<x+1,y>, <x+1,y+1>, <x,y+1>)

Это заполняет триангуляцию поверхности вашей сетки.

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

0 голосов
/ 15 марта 2019

Язык программирования в основном не актуален, поэтому сам VB, вероятно, не является проблемой.У вас могут быть те же проблемы в Python, C #, C ++ и т. Д. Конечно, вы должны освоить выбранный вами язык программирования.

Одним из ключевых аспектов является использование правильных алгоритмов и структур данных.Правильное использование распределения памяти и расположение памяти для максимизации кэша процессора (и графического процессора) также являются ключевыми.Затем вы должны воспользоваться возможностями платформы и аппаратного обеспечения (графического процессора и многопоточности).Для последнего пункта вам обязательно нужно использовать графическую библиотеку, такую ​​как OpenGL или Vulkan.

...