Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 2.331 c
2-1143606526
romychk
2006-03-29 08:28
2006.04.16
Аналог TQuery без BDE


3-1140441008
Mishenka
2006-02-20 16:10
2006.04.16
Можно ли узнать значение ключевого поля до добавления записи в та


2-1144134211
вопросник
2006-04-04 11:03
2006.04.16
DrawText


1-1142237710
DelphiLexx
2006-03-13 11:15
2006.04.16
Окно свойств подобное Delphi


1-1142228039
Glex
2006-03-13 08:33
2006.04.16
Браузер на основе TWebBrowser.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский