Отрисовка трехмерного объекта, имеющегося на карте, производится функцией m3dPaintObject (m3dapi.h).
Отрисовка пользовательского объекта, которого нет на карте и он создается программно, выполняется функцией m3dPaintUserObject.
Вызов отрисовки отдельных объектов производится после вызова функции рисования всей модели, между вызовами функций начала рисования 3D сцены и окончания.
Например:[CODE] m3dBeginPaint(Context3D);
m3dPaintModel(Map3D, &ModelParm);
m3dPaintUserObject(&Ident3d, CursorParm, 0, 0, 0);
m3dEndPaint(Context3D);
[/CODE]Для отрисовки отдельного объекта необходимо единожды подготовить параметры его рисования.
Например: [CODE] // Создаем объект для отображения курсора
if (HCursorObj == 0)
{
// Cоздать пустой объект с трехмерной метрикой на первом листе карты
HCursorObj = mapCreateObject(HMap, 1, IDDOUBLE3, 0);
if (HCursorObj == 0)
return;
// Создаем первую точку в объекте для ее последующей замены на текущее положение курсора
mapAppendPointPlane3D(HCursorObj, 0.0, 0.0, 0.0, 0);
}
// Открываем сервисный классификатор служебных объектов и его 3D-библиотеку
mapGetPathShellUn(path, sizeof(path));
::SplitThePath(path, dir, drive, NULL, NULL);
::MakeThePath(pathUN, dir, drive, WTEXT("service"), WTEXT("rsc"));
HServiceRsc = mapOpenRscUn(pathUN);
if (HServiceRsc == 0)
return;
if (mapIsActive3DLibrary(HServiceRsc) == 0)
return;
if (mapInitRsc3D(HServiceRsc) == 0)
return;
// Получаем идентификатор описания для загрузки текстур в контекст OpenGL
// из service.rsc и одиночных служебных текстур
if (BindUserTex == 0)
BindUserTex = t3dIniBindTex(Context3D);
if (BindUserTex == 0)
return;
// Находим внутренний код объекта
int incode = mapGetRscObjectCodeByKey(HServiceRsc, "TYPECURSOR1");
if (incode == 0)
return;
// Ищем параметры изображения обычного курсора
F3DTREE* ftree = (F3DTREE*)mapGetRsc3DParam(HServiceRsc, incode, 0);
if (ftree == 0)
return;
// Сохраняем параметры для их последующего изменения под измененную текстуру
CursorParm = ::AllocateTheMemory(ftree->Length + sizeof(IMG3DTRANSFORM));
if (CursorParm == 0)
return;
memcpy((void*)CursorParm, (void*)ftree, ftree->Length);
// Заполняем структуру описания характеристик объекта 3D-сцены V3D_IDENT
Ident3d.Map = HMap;
Ident3d.Map3d = Map3D;
Ident3d.Obj = HCursorObj;
Ident3d.Rsc = HServiceRsc;
Ident3d.BindTex = BindUserTex;
// Получение кода библиотеки 3D-параметров
Ident3d.CodeLib = mapGetRsc3dObjectLibraryCode(ident.Rsc, incode, 0);
[/CODE]Обращаю внимание, что если какой-то параметр не инициализирован, то 3D-объект не будет рисоваться и всё нужно аккуратно закрывать и освобождать.
Для объекта, меняющего свое местоположение (курсор или подвижный объект), перед рисованием нужно изменить метрику объекта с помощью функции mapUpdatePointPlane3D. Обязательно учитывайте, что в данную
функцию координаты нужно подавать в метрах на местности (в системе координат карты).
Могут понадобиться функции пересчета из оконных координат (пикселов) в метры на местности m3dWindowToPlane и обратно m3dPlaneToWindow.
Отрисовка пользовательского объекта, которого нет на карте и он создается программно, выполняется функцией m3dPaintUserObject.
Вызов отрисовки отдельных объектов производится после вызова функции рисования всей модели, между вызовами функций начала рисования 3D сцены и окончания.
Например:[CODE] m3dBeginPaint(Context3D);
m3dPaintModel(Map3D, &ModelParm);
m3dPaintUserObject(&Ident3d, CursorParm, 0, 0, 0);
m3dEndPaint(Context3D);
[/CODE]Для отрисовки отдельного объекта необходимо единожды подготовить параметры его рисования.
Например: [CODE] // Создаем объект для отображения курсора
if (HCursorObj == 0)
{
// Cоздать пустой объект с трехмерной метрикой на первом листе карты
HCursorObj = mapCreateObject(HMap, 1, IDDOUBLE3, 0);
if (HCursorObj == 0)
return;
// Создаем первую точку в объекте для ее последующей замены на текущее положение курсора
mapAppendPointPlane3D(HCursorObj, 0.0, 0.0, 0.0, 0);
}
// Открываем сервисный классификатор служебных объектов и его 3D-библиотеку
mapGetPathShellUn(path, sizeof(path));
::SplitThePath(path, dir, drive, NULL, NULL);
::MakeThePath(pathUN, dir, drive, WTEXT("service"), WTEXT("rsc"));
HServiceRsc = mapOpenRscUn(pathUN);
if (HServiceRsc == 0)
return;
if (mapIsActive3DLibrary(HServiceRsc) == 0)
return;
if (mapInitRsc3D(HServiceRsc) == 0)
return;
// Получаем идентификатор описания для загрузки текстур в контекст OpenGL
// из service.rsc и одиночных служебных текстур
if (BindUserTex == 0)
BindUserTex = t3dIniBindTex(Context3D);
if (BindUserTex == 0)
return;
// Находим внутренний код объекта
int incode = mapGetRscObjectCodeByKey(HServiceRsc, "TYPECURSOR1");
if (incode == 0)
return;
// Ищем параметры изображения обычного курсора
F3DTREE* ftree = (F3DTREE*)mapGetRsc3DParam(HServiceRsc, incode, 0);
if (ftree == 0)
return;
// Сохраняем параметры для их последующего изменения под измененную текстуру
CursorParm = ::AllocateTheMemory(ftree->Length + sizeof(IMG3DTRANSFORM));
if (CursorParm == 0)
return;
memcpy((void*)CursorParm, (void*)ftree, ftree->Length);
// Заполняем структуру описания характеристик объекта 3D-сцены V3D_IDENT
Ident3d.Map = HMap;
Ident3d.Map3d = Map3D;
Ident3d.Obj = HCursorObj;
Ident3d.Rsc = HServiceRsc;
Ident3d.BindTex = BindUserTex;
// Получение кода библиотеки 3D-параметров
Ident3d.CodeLib = mapGetRsc3dObjectLibraryCode(ident.Rsc, incode, 0);
[/CODE]Обращаю внимание, что если какой-то параметр не инициализирован, то 3D-объект не будет рисоваться и всё нужно аккуратно закрывать и освобождать.
Для объекта, меняющего свое местоположение (курсор или подвижный объект), перед рисованием нужно изменить метрику объекта с помощью функции mapUpdatePointPlane3D. Обязательно учитывайте, что в данную
функцию координаты нужно подавать в метрах на местности (в системе координат карты).
Могут понадобиться функции пересчета из оконных координат (пикселов) в метры на местности m3dWindowToPlane и обратно m3dPlaneToWindow.