кривые, представляемые в OpenGL

Я новичок в разработке САПР и хочу узнать кое-что об OpenGL. Моя основная цель - представить коники, циклоиды, эпициклоиды, гипоциклоиды, эвольвенты и т. д. Могу ли я напрямую представить их, используя некоторые тригонометрия, или мне нужно преобразовать эти кривые в B-сплайн? На самом деле в настоящее время я разрабатываю ядро ​​и хочу разработать ядро, чтобы я не мог отображать вышеупомянутые кривые (нет смысла поддерживать эти кривые в ядре, если я не могу представить их графически!) Я мало знаю об OpenGL, поэтому пожалуйста, извините меня, если мой вопрос действительно глупый! Я попытался выполнить поиск по здесь, но не нашел ничего полезного.


person Cool_Coder    schedule 31.10.2011    source источник


Ответы (2)


OpenGL может напрямую визуализировать кривые Безье и поверхности с помощью оценщиков и даже NURBS с помощью API GLU. Дополнительные сведения см. в Руководстве по программированию OpenGL. Таким образом, вы можете преобразовать эти кривые и поверхности в эту форму.

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

Вместо этого вам следует реализовать свои собственные процедуры оценки для таких кривых и поверхностей, которые оценивают соответствующие уравнения с заданной частотой дискретизации и генерируют простой массив вершин (и, возможно, и массив индексов). Таким образом, вы готовы к будущему, поскольку их можно визуализировать как стандартные линейные полосы или треугольные сетки с использованием VBO (единственный способ визуализировать что-либо в современном OpenGL).

И вы даже остаетесь независимым от API, поскольку общий массив вершин также может быть отрисован с использованием Direct3D или чего-то еще. Таким образом, вы не засоряете ядро ​​САПР вызовами отрисовки. Все, что ему нужно, — это функция для преобразования параметрических кривых и поверхностей в массивы вершин (и, возможно, индексов), а клиент/пользователь ядра отвечает за их рисование с помощью любого API, который ему нравится.

person Christian Rau    schedule 31.10.2011

Если я не ошибаюсь, OpenGL работает только с плоскими полигонами. Тем не менее, вы можете проверить, есть ли в библиотеках GLUT какой-либо метод рисования вышеупомянутых фигур, или найти в Google .obj этих фигур, а также масштабировать, вращать и переводить их в нужное положение.

person Josep Rodríguez López    schedule 31.10.2011
comment
Вы можете легко использовать opengl и direct3d для рендеринга линий, точек или полигонов, т.е. вы не ограничены полигонами. Единственная проблема заключается в том, что вам нужно разбить линию на вершины и указать графическому API, чтобы они рисовали линии между ними. - person edvaldig; 31.10.2011
comment
Вот для чего предназначен .obj. Он содержит вершины и грани объекта, и вы можете выполнять масштабирование, перемещение и вращение, поэтому вы можете повторно использовать один объект .obj для создания любого количества различных фигур. - person Josep Rodríguez López; 31.10.2011
comment
@JosepRodríguezLópez Но вам не обязательно нужен .obj или любой другой файл. Если у вас есть параметрическое представление, вы можете просто оценить его на дискретных выборках. Это, вероятно, будет работать лучше в программе САПР, чем загрузка фиксированных моделей, по крайней мере, если кривые/поверхности станут более сложными, например NURBS. - person Christian Rau; 31.10.2011
comment
@ChristianRau, так что, если мне нужно нарисовать дугу с центром в начале координат и от оси X до оси Y в первом квадранте, сколько дискретных отсчетов мне нужно предоставить, чтобы дуга выглядела как дуга, а не полилиния ??? - person Cool_Coder; 31.10.2011
comment
@JosepRodríguezLópez Вы, очевидно, неправильно понимаете проблему, поскольку .obj — это формат файла для хранения данных 3D-модели (вершины, грани, материалы, uv и т. д.). Если вы по какой-то причине хотите разбить 2D- или 3D-функцию на список вершин и сохранить ее в файл для последующей загрузки, то, конечно, вы можете сохранить ее в файле .obj, но зачем возиться с накладными расходами? я знаю... - person edvaldig; 31.10.2011
comment
@CAD_coding Обычно вы должны включать параметр, например. #steps, который контролирует плавность линии. Я думаю, вы можете найти соответствующий параметр в некоторых пакетах программного обеспечения для 3D при работе с линиями. В вашем случае это будет просто контролировать, сколько образцов на заданном интервале вы берете. - person edvaldig; 31.10.2011
comment
Я указал файл .obj на тот случай, если GLUT не предоставляет никакой функции для рисования этих рисунков, но в случае, если их предоставляет библиотека, очевидно, что это может быть быстрее, чем чтение файлов. Если вы не найдете метод GLUT, возможно, вы могли бы создать функцию самостоятельно. - person Josep Rodríguez López; 31.10.2011