Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2016, 11:35   #1
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
Печаль Отрисовка полигонов OpenGL

Народ, помогите, плз!
Рисую карту полигонами OpenGL, полигоны в массе своей невыпуклые, тесселирую, часть островов рисуется, часть нет, не понимаю - почему. порядок отрисовки выполняется железно: они предварительно отсортированы - сначала море, потом острова.
Вот тесселяция, на входе номер полигона для генерации списка и список вершин:

Код:
procedure TGLForm.Tesselation(MapObjectKey: integer; Points: TList);
var TessObj: GLUTesselator;
    I: integer;
    A: ArrayOfVector; //array of TVector, a TVector = array[0..2] of GLDouble;
    P: TMyPoint;
begin
     TessObj := gluNewTess;
     gluTessCallback(TessObj, GLU_TESS_VERTEX, @glVertex3dv);
     gluTessCallback(TessObj, GLU_TESS_BEGIN, @glBegin);
     gluTessCallback(TessObj, GLU_TESS_END, @glEnd);
     gluTessCallback(TessObj, GLU_TESS_ERROR, @errorCallback);
     gluTessCallback(TessObj, GLU_TESS_COMBINE, @combineCallback);
     gluTessNormal(TessObj,0,0,1);
     gluTessProperty(TessObj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
    //
     SetLength(A, Points.Count);
     for I := 0 to Points.Count-1 do
     begin
         P:= Points.Items[I];
         A[I,0]:= (P.Lon-StartLon)/Un;
         A[I,1]:= (P.Lat-StartLat)/Un;
         A[I,2]:= 0;
     end;
    glGenLists(1);
     glNewList(MapObjectKey, GL_COMPILE);
     glShadeModel(GL_FLAT);
      gluTessBeginPolygon (TessObj, nil);
       gluTessBeginContour(TessObj);   //начали контур
        for I := 0 to Length(A)-1 do
         gluTessVertex(TessObj, @A[I], @A[I]);
       gluTessEndContour(TessObj);     //закончили контур
      gluTessEndPolygon(TessObj);
     glEndList;
     gluDeleteTess(TessObj);
end;

вот проверка на пересечения:
//  TData = Array [0..4, 0..5] of GLdouble;
//PTVector = ^TVector
// TArray4F = Array [0..3] of GLfloat;
//TVector2 = array[0..6] of GLDouble

procedure combineCallback(coords : PTVector; data : TData;
          weight : TArray4F; var dataout : Pointer); stdcall;
var
   vertex : ^TVector2;  
   i : 3..6;                  
begin
   GetMem (vertex, SizeOf (TVector2));
   vertex^[0] := coords[0];
   vertex^[1] := coords[1];
   vertex^[2] := coords[2];
   For i := 3 to 6 do
      vertex[i] := weight[0] * data[0][i]
                  + weight[1] * data[1][i]
                  + weight[2] * data[2][i]
                  + weight[3] * data[3][i];
   dataOut := vertex;
end;
а включаешь - работает, но не все...

Последний раз редактировалось Аватар; 12.05.2016 в 12:12.
mnj вне форума Ответить с цитированием
Старый 12.05.2016, 12:08   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...в OpenGL отрисовка возможна только выпуклыми полигонами. Если конечная фигура образует контур с вогнутыми плоскостями, то вам придется ее разбить на несколько выпуклых полигонов и состыковать геометрически в один объект, как вы уже и делаете, вызывая его через GlCallList() при отрисовке.
kutani вне форума Ответить с цитированием
Старый 12.05.2016, 12:30   #3
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
По умолчанию

Цитата:
...в OpenGL отрисовка возможна только выпуклыми полигонами. Если конечная фигура образует контур с вогнутыми плоскостями, то вам придется ее разбить на несколько выпуклых полигонов и состыковать геометрически в один объект, как вы уже и делаете, вызывая его через GlCallList() при отрисовке.
Это я знаю, только почему-то одни нормально заливаются, другие никак. Я ведь не дырки вырезаю, где направление обхода вершин имеет значение, просто рисую одни полигоны поверх другого. errorCallback не сообщает ничего, поэтому я и в ауте.
mnj вне форума Ответить с цитированием
Старый 12.05.2016, 13:27   #4
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Заливаться будут нормально только - выпуклые замкнутые фигуры. Направление обхода для выпуклых полигонов имеет значение: точка с которой начали обход, полигон должен ею же и заканчиваться, т.е. таких точек будет +1.

Последний раз редактировалось kutani; 12.05.2016 в 13:30.
kutani вне форума Ответить с цитированием
Старый 12.05.2016, 13:53   #5
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
Заливаться будут нормально только - выпуклые замкнутые фигуры. Направление обхода для выпуклых полигонов имеет значение: точка с которой начали обход, полигон должен ею же и заканчиваться, т.е. таких точек будет +1.
Именно так и есть - последняя точка в списке координат всегда совпадает с первой. Так выдает при экспорте ГИС Панорама любые площадные объекты, проверено неоднократно. Но по прежнему не рисует (контур для контроля рисуется отдельно из того же списка координат):
Изображения
Тип файла: jpg скрин.jpg (30.9 Кб, 153 просмотров)
mnj вне форума Ответить с цитированием
Старый 12.05.2016, 14:48   #6
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от mnj Посмотреть сообщение
Именно так и есть - последняя точка в списке координат всегда совпадает с первой. Так выдает при экспорте ГИС Панорама любые площадные объекты, проверено неоднократно. Но по прежнему не рисует (контур для контроля рисуется отдельно из того же списка координат):
А чем Вас GIS ToolKit не устраивает? Платностью?
netpolice вне форума Ответить с цитированием
Старый 12.05.2016, 15:21   #7
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от netpolice Посмотреть сообщение
А чем Вас GIS ToolKit не устраивает? Платностью?
Увы, моя задача не решается в GIS ToolKit, я просто использую халявные карты от Панорамы, поскольку формат открытый.
mnj вне форума Ответить с цитированием
Старый 13.05.2016, 17:57   #8
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
По умолчанию

Нашел ошибку, все работает
Изображения
Тип файла: jpg скрин2.jpg (25.1 Кб, 142 просмотров)
mnj вне форума Ответить с цитированием
Старый 13.05.2016, 20:30   #9
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

В чем смысл данного репорта? )
kutani вне форума Ответить с цитированием
Старый 14.05.2016, 10:02   #10
mnj
 
Регистрация: 12.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
В чем смысл данного репорта? )
Вопрос решен, его можно закрыть
mnj вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрисовка масива пикселей opengl Nikk[UA] Мультимедиа в Delphi 21 12.06.2012 20:23
Отрисовка ребер в OpenGL Xcopy Помощь студентам 0 14.05.2011 13:02
Пересечение полигонов в OpenGL drvictorius Помощь студентам 0 19.04.2011 13:20
Отрисовка метафайла средствами OpenGL -=CHIP=- Мультимедиа в Delphi 3 20.09.2009 13:12
Отрисовка круга в OpenGl Oburec Мультимедиа в Delphi 1 04.07.2009 15:22