Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Выделение объектов мышкой...   Найти похожие ветки 

 
Signate ©   (2005-09-27 23:29) [0]

Подскажите как лучше организовать выделение тайлов карты мышкой?

Пытался сделать через функцию gluUnproject, но почему то поворот по оси X как будто игнорируеться и под разными угламы выделяеться совсем не то что надо...

вот код функции unProject

function unProject(x,y:Integer) : TVectorD;
var
Viewport : Array [0..3] of GLInt;
mvMatrix, ProjMatrix : Array [0..15] of GLDouble;
RealY : GLint ;
Zval : GLfloat;
RetVal : TVectorD;
begin
glGetIntegerv (GL_VIEWPORT, @Viewport);
glGetDoublev (GL_MODELVIEW_MATRIX, @mvMatrix);
glGetDoublev (GL_PROJECTION_MATRIX, @ProjMatrix);

RealY := viewport[3] - Y ;

glReadPixels(X, RealY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Zval);

gluUnProject(X, RealY, Zval, @mvMatrix, @ProjMatrix, @Viewport, RetVal.x, RetVal.y, RetVal.z);
 Result := Retval;
end;


 
_111_   (2005-09-28 00:35) [1]

А когда ты вызываеш функцию Unproject ты учитываешь трансформации МСК
т.е. если осуществляешь перенос или вращении камеры,то перед вызовом unProject надобно повторить изменения МСК. У меня:

//где-то в рендеренге
glRotatef(cam.uglX,1,0,0); glRotatef(cam.uglZ,0,0,1);//повороты камеры
glTranslatef(-cam.x,-cam.y,-cam.z);//перенос карты(типа движение камеры)
//отрисовка карты


а на OnMouseDown (или где там UnProject) надо
if LmausDown then
  begin
  glPushMatrix;
  glRotatef(cam.uglX,1,0,0); glRotatef(cam.uglZ,0,0,1);
  glTranslatef(-cam.x,-cam.y,-cam.z);
  getKoor(mpos.x,mpos.y);    //твой unProject
  glPopMatrix;
  end;

и все будет Ок. У меня все работает


 
Signate ©   (2005-09-28 10:11) [2]

я для проверки вообще все в рендер засунул... вот как у меня это выглядит


  glPushMatrix;

     CameraPosition := GetCameraPosition;
     CameraAngle := GetCameraAngle;

     glRotatef(CameraAngle.X,1,0,0);                                    
     glRotatef(CameraAngle.Y,0,1,0);
     glRotatef(CameraAngle.Z,0,0,1);
     glTranslatef(CameraPosition.X,CameraPosition.Y,CameraPosition.Z);

    v := unProject(Mouse.x,Mouse.y);
    TileX := trunc((-CameraPosition.x+v.x) / MAP_SCALE);
    TileZ := trunc((-CameraPosition.z+v.z) / MAP_SCALE);

  glPopMatrix;



 
_111_   (2005-09-30 00:39) [3]

тогда хз, такая же проблема была, как исправил не помню (давно было)
может где оси перепутал или еще что нибудь...
кстати, у меня:
RealY:=viewport[3]-Y-1;
может в этом дело


 
Signate ©   (2005-09-30 01:12) [4]


> RealY:=viewport[3]-Y-1;


Делал так :) (как раз по примеру Краснова)


 
Ricks ©   (2005-09-30 12:44) [5]

Такая же проблемма, только я использую gluLookAt.

function GetMousePos(P:TPoint):TVector;
var mm : TMatrix4d;
   pm : TMatrix4d;
   vp : TVector4i;
   c  : TVectorD;
   zd : Double;
begin
glPushMatrix;
glLoadIdentity;
gluLookAt( ViewPos.X, ViewPos.Y, ViewPos.Z, TargetPos.X, TargetPos.Y, TargetPos.Z, 0, 1, 0 );

glGetIntegerv(GL_VIEWPORT, @vp);
glGetDoublev(GL_MODELVIEW_MATRIX, @mm);
glGetDoublev(GL_PROJECTION_MATRIX, @pm);
glReadPixels(P.x, P.y, 1, 1, GL_DEPTH_COMPONENT, GL_DOUBLE, @zd);
gluUnProject(p.X, vp[3] - p.y - 1, zd, mm, pm, vp, @C.X, @C.Y, @C.Z);
Result:=Vector( C.X, C.Y, C.Z );

glLoadIdentity;
end;

ВСЕ РАВНО НИЧЕГО НЕ ПОЛУЧАЕТСЯ! Оно выдает какие-то левые координаты (похоже на то, что надо, но все-таки НЕ ТО)
Как быть в таком случае??


 
Ricks ©   (2005-09-30 12:52) [6]

Извините, веренее вот так:

function GetMousePos(P:TPoint):TVector;
var mm : TMatrix4d;
   pm : TMatrix4d;
   vp : TVector4i;
   c  : TVectorD;
   zd : single;
begin
glPushMatrix;
glLoadIdentity;
gluLookAt( ViewPos.X, ViewPos.Y, ViewPos.Z, TargetPos.X, TargetPos.Y, TargetPos.Z, 0, 1, 0 );

zd:=0;
FillChar(c, sizeOf(c), 0);

glGetIntegerv(GL_VIEWPORT, @vp);
glGetDoublev(GL_MODELVIEW_MATRIX, @mm);
glGetDoublev(GL_PROJECTION_MATRIX, @pm);
glReadPixels(P.x, vp[3] - p.y - 1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @zd);
gluUnProject(p.X, vp[3] - p.y - 1, zd, mm, pm, vp, @C.X, @C.Y, @C.Z);
Result:=Vector( C.X, C.Y, C.Z );

glPopMatrix;
end;


а то скажете - "Шо попало пишешь, а еще спрашиваешь" :)


 
Кефир87 ©   (2005-09-30 23:20) [7]

Ниужели в XTrooper"е этого нет?!


 
Signate ©   (2005-10-01 03:04) [8]


> Кефир87 ©   (30.09.05 23:20) [7]
>
> Ниужели в XTrooper"е этого нет?!


А зачем в XTrooper"e выделение объектов мышкой!? :)

...

Хотя чего там только нет :-)


 
Ricks ©   (2005-10-01 23:19) [9]

Нет, в чудесном XTrooper"е этого нет!


 
Кефир87 ©   (2005-10-01 23:32) [10]

Ну вот уже легенды про XTrooper пойдут... А давай-те еще анекдоты придумывать... Чтонить в духе: Звонит юзер в службу поддержки...


 
_111_   (2005-10-03 00:51) [11]

gluLookAt - в контексте Ricks`a не прокатит (gluLookAt использует другие матрицы трансформации)

даю полностью рабочий пример (может что найдете у себя другое, или что-то подскажет, как всегда - метод научного тыка):

//глобальные переменные
wx,wy,wz:GLDouble; //координаты мыши в МСК
Viewport:array[0..3] of GLInt;
mvMatrix, ProjMatrix:Array[0..15] of Double;
RealY:GLint;
Zval:GLFloat;

procedure glDrawScene;
begin
  glpushMatrix;
  PutCamOnMap;  // установку камеры уже описывал 2 rot 1 trnsl
  Setlight;          // раскрывать их излишне
  DrawM;           //но в каждом есть push и popmatrix
  DrawWater;
  DrawObjects;
  Animation.drawAnimate;
  if MaxMission>0 then DrawAllMission;
  if enBiganim then DrawAllBigAnimate;
  drawSky;
  if (ensprites) and (timeofday=1) then DrawAllSprait;
  glpopmatrix;
end;

procedure GetKoor(var Xo,Yo:integer);
begin
glGetIntegerv(GL_VIEWPORT,@Viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,@mvMatrix);
glGetDoublev(GL_PROJECTION_MATRIX,@ProjMatrix);
RealY:=viewport[3]-Yo-1;
glReadPixels(Xo,RealY,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@Zval);
gluUnProject(Xo,RealY,Zval,@mvMatrix,@ProjMatrix,@ViewPort,wx,wy,wz);
end;

// в обработке сообщений
WM_LBUTTONDOWN:
       begin
           glPushMatrix;
              glRotatef(cam.uglX,1,0,0);
              glRotatef(cam.uglz,0,0,1);
              glTranslatef(-cam.x,-cam.y,-cam.z);
           GetCursorPos(mpos);
           getKoor(mpos.x,mpos.y);
           glPopMatrix;
       end;


вроде все тоже самое, но у меня работает.
Еще советы, если позволите:
-проверьте не трансформируете ли вы матрицы до рендера (при создании окна, изменении разрешения и т.д.)
-попробуйте в обработке "клика" мышки перед трансформациями матриц обнулить их (с помощью последовательности команд:
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glMatrixMode(GL_MODELVIEW);)
-проверьте равенство: колво glpushMatrix = колву glpopmatrix

или опишите получше что не работает (перенос не влеяет на координаты или, может, вообще не реальные координаты выдает или что там вообще?)


 
Ricks ©   (2005-10-03 01:18) [12]


> gluLookAt - в контексте Ricks`a не прокатит (gluLookAt использует
> другие матрицы трансформации)

Так что же мне делать? Пролетел я...? :(


 
_111_   (2005-10-03 02:20) [13]

переделай rotate и translate.
по-моему на много проще и понятней, хотя вычислений столько же



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
1-1142417495
КиТаЯц
2006-03-15 13:11
2006.04.16
OpenOffice вместо MSExcel


2-1143885475
EXILE
2006-04-01 13:57
2006.04.16
Как открыть в Delphi .exe файл


2-1144070025
Ded22
2006-04-03 17:13
2006.04.16
как добавить запись ?


15-1142857467
nisa01
2006-03-20 15:24
2006.04.16
требуется программист Delphi,


3-1140501583
dreamse
2006-02-21 08:59
2006.04.16
проблема с хранимой процедурой