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

Рисование 3d объекта с помощью функций из m3dapi

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 5 ... 8 След.
RSS
Рисование 3d объекта с помощью функций из m3dapi
 
Здравствуйте. Функция m3dWindowToPlane возвращает 1.
Вот код:
Код
void MapOpenGlWidget::mousePressEvent(QMouseEvent* event)
{
    QString str = "/home/vxuser/Conv_Map3D/logo.log";
    mapOpenDiagnostics(str.utf16());
    XYHDOUBLE pointMAP;
    qDebug()<<event->pos().x()<<event->pos().y();
    qDebug()<<m3dWindowToPlane(Context3D,Map3D,event->pos().x(),this->height() - event->pos().y() - 1,&pointMAP);
    qDebug()<<(long)pointMAP.X<<(long)pointMAP.Y<<(long)pointMAP.H;
}

Вывод:

Код
debug: 431 228
debug: 1
debug: 6153615 7420564 0
debug: 820 174
debug: 1
debug: 6153615 7420564 0
debug: 294 108
debug: 1
debug: 6153615 7420564 0
debug: 991 338
debug: 1
debug: 6153615 7420564 0

Файл диагностики: logo.log
 
Добрый день, Максим!

К сожалению, понять, в чем проблема, не удалось. В соответствии с присланным log-файлом функция m3dWindowToPlane полностью выполняется, проверки всех критических границ проходят. Есть сомнения, что может быть в вашей версии OpenGL "шалит" получение значения буфера глубины или видовых матриц. Уточнить это будет возможно после добавления дополнительной диагностики в новую версию библиотек инструментария. Постараемся это сделать в ближайшее время.
 
Спасибо большое за помощь. Буду ждать.
Еще вопрос появился. При рисовании цилиндра или сферы функциями m3dPaintCylinder и m3dPaintPoint пытаюсь сделать их полупрозрачными меняя значение альфа-канала в структуре IMG3DRGBA. При любом значении и цилиндр и сфера рисуется полностью непрозрачными. Подскажите, в чем может быть проблема?
 
Добрый день, Максим!

В этих функциях не подключено смешивание цветов. Мы эти объекты используем как служебные и нам их прозрачность была не нужна. К сожалению, не написали об этом в описании к функции.
Добавим возможность прозрачной отрисовки в этих функциях также в новую версию инструментария.
 
Елена, спасибо большое за ответы!
А можно ли в созданном контексте (после m3dSetParamContext) рисовать с помощью функций OpenGL? Или созданный контекст каким-то образом это блокирует?
 
Да, можно. Контекст создается стандартными средствами, ничего не блокируется, поэтому можно рисовать стандартными функциями OpenGL.
 
Здравствуйте. Не могли бы Вы объяснить как правильно получить дальнейшее описание функций (F3DHEAD, IMG3DNODE и т.д.) после вызова F3DTREE *tree = (F3DTREE*)mapGetRsc3DParam(rsc,incode,0).
Выполнив такую процедуру: F3DHEAD *head = (F3DHEAD*)(mapGetRsc3DParam(rsc,incode,0) + sizeof(F3DTREE)); смог получить описание заголовка (по всей видимости). В нем значение Ident и Number = 2. MaxIdent в F3DTREE = 3.
Но на этом этапе IMG3DNODE*img= (IMG3DNODE*)(mapGetRsc3DParam(rsc,incode,0) + sizeof(F3DTREE) + sizeof(F3DHEAD)) получаю не те значения(пытаюсь получить значение по ширине, длине и высоте 3D модельки из шаблона).
 
Максим, добрый день!
После заголовка функции F3DHEAD идет структура с параметрами функции рисования (не IMG3DNODE). Тип структуры параметров определяется по номеру функции (head->Number). В Вашем случае вызывается функция рисования знака (head->Number = 2). Параметры 3D модели знака хранятся в структуре F3DMARK, объявленной в файле m3dgdi.h. Она и следует после заголовка.
Все доступные функции рисования перечислены в виде макросов в файле m3dgdi.h.
Код
#define F3D_NULL               0  // Пустая функция - ничего не рисует
#define F3D_EMPTY              1  // Пустая функция - рисует отсутствие объекта
#define F3D_MARK               2  // Знак
#define F3D_MARKBYLINE         3  // Знак по линии
#define F3D_MARKBYPOINT        4  // Знак по точкам    (F3D_MARK)
#define F3D_MARKBYSQUARE       5  // Знак по площади
#define F3D_VERTBYLINE         6  // Вертикальная плоскость по линии
#define F3D_HORIZONTBYLINE     7  // Горизонтальная плоскость по линии
#define F3D_HORIZONT           8  // Горизонтальная плоскость
...
Пример для разбора параметров рисования 3D модели приведен ниже. В примере показано, как найти размер знака по оси X. Для определения размера по оси Z необходимо обратиться к полю SizeZ структуры F3DMARK, по оси Y - к полю Height.
Код
F3DTREE* ftree = (F3DTREE*)mapGetRsc3DParam(rsc, incode, 0);                       
F3DHEAD* fhead = (F3DHEAD*)((char*)ftree + sizeof(F3DTREE));

// Идем по списку функций рисования
for (int k = 0; k < ftree->Count; k++)
  {
    if (fhead->Number == F3D_MARK)
      {
        // Векторный знак
        F3DMARK* mark = (F3DMARK*)(fhead + 1);
      
        // Находим размер знака по X 
        double sizeMarkX = mark->SizeX.Value;
        if (mark->SizeX.Type > 0)
          {
         sizeMarkX = mapSemanticCodeDoubleValue(hObj, mark->SizeX.Type, 1);
            if (sizeMarkX < DOUBLENULL)
          sizeMarkX = mark->SizeX.Value;
         else
          sizeMarkX = sizeMarkX * mark->SizeX.Factor + mark->SizeX.Offset;
          }

      }
    else if (fhead->Number == F3D_MARKBYLINE)
      {
        // Знак по линии
        F3DMARKBYLINE* mark = (F3DMARKBYLINE*)(fhead + 1);
      
        // Обработка 
      }
   else if (fhead->Number == F3D_MARKBYSQUARE)
      {
        // Знак по площади
        F3DMARKBYSQUARE* mark = (F3DMARKBYSQUARE*)(fhead + 1);
      
        // Обработка
      }
    
    // Переходим на заголовок следующей функции
    fhead = (F3DHEAD*)((char*)fhead + fhead->Length);
  }
Изменено: Петр Сотников - 10.04.2023 17:48:33
 
Спасибо большое! Буду пробовать)
 
А можете еще подсказать, почему по некоторым моделям получаю правильные размеры (из классификатора), по некоторым нет. Во всех моделях на которых я пробовал head->Number = 2.
Страницы: Пред. 1 2 3 4 5 ... 8 След.
Читают тему (гостей: 1)



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

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