Форум: "Игры";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизВыделение объектов мышкой... Найти похожие ветки
← →
Signate © (2005-09-27 23:29) [0]Подскажите как лучше организовать выделение тайлов карты мышкой?
Пытался сделать через функцию gluUnproject, но почему то поворот по оси X как будто игнорируеться и под разными угламы выделяеться совсем не то что надо...
вот код функции unProjectfunction 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
Время: 0.046 c