На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Елена Кружкова (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Елена Кружкова
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 71 След.
Рисование 3d объекта с помощью функций из m3dapi
 
Добрый день!
Функция m3dPaintUserObjectEx при задании последних двух параметров действительно выделяет объект или его части каркасной отрисовкой.  Если, например, задать количество выделенных частей 1 и select.Function = 0, то выделиться весь объект. Этот способ выделения в основном предназначен для выделения частей знака при его редактировании. Параметры в SELECTPART для выделения отдельных частей задаются вот так: [CODE]SELECTPART select;
               select.Function = F3D_MARK; // тип функции или ноль для выделения всего объекта
               select.Node = 2;            // номер узла в параметрах функции или ноль для выделения всей части по функции
               select.Description = 1;     // номер описания в параметрах узла или ноль
               select.Element = 3;         // номер элемента в параметрах описания или ноль[/CODE]У нас на трехмерной модели объект выделяется с помощью функции m3dSelectObject. Он становится прозрачным и основание, если это не одна точка, обводится красной линией.
У данной функции есть еще возможность выделения объекта каркасной отрисовкой красным цветом. Для этого необходимо в параметре типа V3D_IDENT передать флаг способа рисования объекта FlagPaintObj равным 4 (см. m3dtype.h).
Описания использования функционала апи-функций трехмерного отображения пока нет, к сожалению.
Рисование 3d объекта с помощью функций из m3dapi
 
[QUOTE]Максим написал:
И вопрос по базам данных. Вы сказали что они занимают место. Я попробовал сохранить БД карты Ногинска на сохраняемом уровне 17, размер БД составлял по расчетам 179Гб. Попробовал на 13 уровне, по расчетам программа написала чуть больше 800 Мб, но по факту сохранилось почти 50Гб. Не уж то базы данных настолько большие, и на что влияют эти самые сохраняемые уровни?[/QUOTE]
Добрый день, Максим!
Да, базы действительно получаются большие. В них записываются тайлы трехмерной модели рельефа и объектов. Возможны уровни от 10 (наименее подробный по масштабу около 1:500 000) до 24 (наиболее подробный по масштабу около 1:30). Чем подробнее уровень, тем больше тайлов, точнее модель местности. Менее точные уровни нужны для ускорения отображения модели в мелком масштабе. Если Вы сталкивались с трехмерными моделями, сделанными в сторонних редакторах, то знаете, что это обычно немаленькие объемы. А представьте, что сделано лазерное сканирование целого района, например, с шагом 10 или даже 1 метр. У нас фактически автоматом формируется такая модель по картографическим данным.
Можно изначально попробовать сделать модель, например, от 12 до 15 уровня. Посмотреть. Если подробности не хватит, то можно  дополнить эту же базу следующими уровнями, выбрав ее для сохранения.
Рисование 3d объекта с помощью функций из m3dapi
 
[QUOTE]Максим написал:
[QUOTE]
[/QUOTE]
Спасибо за наводку. Получилось решить проблему. Вся суть проблемы заключалась в том, что я пытался вызвать эту функцию в методе mousePressEvent, а нужно было в методе paintGL после вызова функции m3dEndPaint.[/QUOTE]
ЗдОрово, что получилось разобраться =) .
Рисование 3d объекта с помощью функций из m3dapi
 
Рассмотрели присланные Вами логи.
Они показывают, что внутри выполнения функции m3dWindowToPlane с подачей ненулевых значений х и y, после вызова OpenGL функции glReadPixels происходит ошибка 1282 (0x502 - GL_INVALID_OPERATION)[CODE] 09:08:40 6343ad80 Navigator3D: WindowToPlaneCore - BEGIN
    09:08:40    6343ad80 Navigator3D: window coord - x = 1182 y = 416
    09:08:40    6343ad80 Navigator3D: while_begin - error = 0
    09:08:40    6343ad80 Navigator3D: while_end - error = 0
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - glGetIntegerv
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - mvMatrix
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - projMatrix
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - glReadPixels
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - z = 0.000000
    09:08:40    6343ad80 Navigator3D: glReadPixels - error = 1282
    09:08:40    6343ad80 Navigator3D: WindowToPlaneCore - gluUnProject
    09:08:40    6343ad80 Navigator3D: point->X = 1066.954894 point->Y = -5355.438443 point->H = 0.000000
    09:08:40    6343ad80 Navigator3D: xModel = -289.999889 yModel = -0.000047 zModel = 199.999000 point->H = 0.000000
[/CODE]Функция glReadPixels вызывается с параметром GL_DEPTH_COMPONENT для получения значения буфера глубины. Ошибка GL_INVALID_OPERATION возникает в следующих случаях: [CODE]GL_INVALID_OPERATION формат был GL_COLOR_INDEX, а в буферах цвета хранились компоненты цвета RGBA или BGRA.
GL_INVALID_OPERATION формат был GL_STENCIL_INDEX, и буфер трафарета не существует.
GL_INVALID_OPERATION формат был GL_DEPTH_COMPONENT, и буфер глубины не существует.
GL_INVALID_OPERATION Функция была вызвана между вызовом glBegin и соответствующим вызовом glEnd.[/CODE]Для нас актуальны два последних случая. Либо проблемы с буфером глубины, либо вызов функции m3dWindowToPlane у Вас поставлен между вызовом glBegin и соответствующим вызовом glEnd при отрисовке чего-либо.
Рисование 3d объекта с помощью функций из m3dapi
 
Спасибо! Будем смотреть.
Рисование 3d объекта с помощью функций из m3dapi
 
[QUOTE]Максим написал:
И еще вопрос. У меня есть движущиеся объекты, за которыми я могу следовать. При выходе этих объектов, а следовательно и при выходе центрального указателя за область созданной точной модели поверхности, происходит ее пересоздание, что занимает определённое время. Можно ли сгладить этот переход (например заранее рассчитывать новую область, или в отдельном потоке рисовать новую область), или хотя бы отследить процесс создания модели поверхности, чтобы выдавать на экран информацию о ходе и прогрессе создания новой области?[/QUOTE]
Если по трехмерной модели района уже "походили", то информация о поверхности уже создана и записана во временный файлы типа *.3ta, *.3t1 и *.3va, *.3t1. Но всё равно требуется время на ее загрузку. А построение трехмерных объектов идет на лету.
Всю трехмерную карту можно сохранить в модели поверхности рельефа и объектов типа баз данных *.db3d ("Сохранить как" есть в Windows версии задачи "Навигатор 3D") и открывать их при открытии трехмерной модели карты, отключив видимость рельефа и объектов, чтобы не создавались на лету. Базы данных с моделями требуют места, но при перемещении по карте время будет уходить только на подгрузку трехмерных тайлов. Добавление  баз осуществляются с использованием функций m3dOpenDataBase и m3dCloseDataBase и других.
Вывести информацию о прогрессе построения новой области можно, если в функцию m3dCreate(HMESSAGE hWnd) передать идентификатор окна вывода сообщений и в инициализации модели m3dInitPaintModel в структуре типа M3D_PAINTPARM параметр FlagMess установить в 0. В окно с переданным идентификатором в ходе процесса построения будут отправляться сообщения типа WM_PROGRESSBAR со строкой названия процесса в LPARAM и процентом выполнения процесса в WPARAM. Соответственно, окно должно перехватить сообщение и выдать на экран в нужном виде.
Рисование 3d объекта с помощью функций из m3dapi
 
Добрый день!
[QUOTE]Максим написал:
Здравствуйте. Как я уже писал ранее, проблема с пересчетом экранных координат в координаты на местности в метрах (функция m3dWindowToPlane) для ОС Astra Linux 1.6 осталась открытой. Тестирование проводилось на версиях OpenGL 3.1 и 4.6.
Данная функция возвращает 1, но координаты не пересчитываются. [/QUOTE]
После после предыдущего обсуждения этого вопроса нами, как и обещали, была добавлена дополнительная диагностика по этой функции. Я прошу Вас на новой версии инструментария включить в ваших текстах создание диагностического журнала, как Вы уже делали, и прислать полученный журнал нам. Будем надеяться, что это поможет разобраться с вопросом.
Рисование 3d объекта с помощью функций из m3dapi
 
Добрый день!
В данном случае используется определенный коэффициент от исходного масштаба главной карты. Если знаменатель масштаба отображения трехмерной модели становится в 2.5 раза больше знаменателя исходного масштаба карты, то отрисовка точной модели поверхности и 3D-моделей объектов не производится. Отследить это можно, проверив текущее значение коэффициента масштабирования модели:[CODE]typedef struct M3D_PAINTPARM // 512 байт
{
 ...
 double   ModelScale;     // Текущий коэффициент масштабирования модели
                          // относительно начального (kScaleMatrixBeg)
 ...
}
 M3D_PAINTPARM;
[/CODE]
Если этот коэффициент меньше 0.4, точная модель не рисуется.
Получить текущее значение этого коэффициента и других параметров рисования модели можно функцией m3dGetParams.
Рисование 3d объекта с помощью функций из m3dapi
 
Добрый день!
Устанавливаем в контекст обычные атрибуты и смещаемся в нужную точку для рисования. Вот текст функции m3dPaintPoint. Посмотрите сами, чего не хватает. Думаю, так будет проще[CODE] // Запоминаем текущий цвет и флаг GL_COLOR_MATERIAL
 glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT);
 // Запрещаем размытость
 glDisable(GL_POLYGON_SMOOTH);
 glDisable(GL_ALPHA_TEST);
 glEnable(GL_COLOR_MATERIAL);
 glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
 glColor4f(0.0, 0.0, 0.0, 1.0);
 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
 // Задаем цвет точки
 if (pointColor == 0)
   glColor4f(1.0, 0.0, 0.0, 0.5);
 else
 {
   glColor4f(pointColor->R, pointColor->G, pointColor->B, pointColor->A);
   // Задаем смешивание для отрисовки прозрачным цветов, при необходимости
   if (pointColor->A < 1.0)
   {
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   }
 }

 if (point != 0)
 {
   glMatrixMode(GL_MODELVIEW);
   // Сохраняем матрицу(систему координат)
   glPushMatrix();

   // Переносим начало координат в точку начала координат знака
   glTranslated(point->X, point->Y, point->Z);
 }

 // Создаем квадрик-объект для рисования сферы
 GLUquadricObj* quadObj = gluNewQuadric();

 // Задаем
 //  закрашенную сферу
 gluQuadricDrawStyle(quadObj, GLU_FILL);
 //  нормали строятся для каждой грани
 gluQuadricNormals(quadObj, GLU_FLAT);
 // Рисуем точку-сферу
 double radius = pointSize / 2.0;
 if (radius > 1.0)
   gluSphere(quadObj, radius, (20.0 * radius), (20.0 * radius));
 else
   gluSphere(quadObj, radius, 20.0, 20.0);

 // Удаляем квадрик-объект
 gluDeleteQuadric(quadObj);

 if (point != 0)
 {
   // Возвращаем систему координат
   glPopMatrix();
 }

 glEnable(GL_ALPHA_TEST);
 glAlphaFunc(GL_GREATER, 0.01);
 glDisable(GL_BLEND);

 // Восстанавливаем атрибуты
 glPopAttrib();
[/CODE]
Рисование 3d объекта с помощью функций из m3dapi
 
Уточнение по отрисовке карты с подвижными объектами.
Указанная карта должна открываться и добавляться к основной карте после построения трехмерной модели местности hMap3d, чтобы ее объекты не попали в стационарный вид трехмерной модели. Функция с кодом отрисовки подвижных объектов, которая дана в предыдущем ответе, вызывается между открытием m3dBeginPaint и закрытием m3dEndPaint рисования, после функции отрисовки построенной трехмерной модели  m3dPaintModel.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 71 След.



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности