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

Вниз

координаты мышки в пространстве   Найти похожие ветки 

 
k8   (2007-01-24 15:32) [0]

подскажите: как найти проэкцию оконных координат мышы на плоскость хоz в пространстве и вообще как происходит выделение 3д обьектов? буду весьма благодарен


 
$00FF00   (2007-01-24 16:04) [1]

Выделение напр так: берёшь объекты сцены и красишь их в разные цвета (без освещения, без текстурирования, без всего! Монотонным цветом!!!). Воспроизводишь (без SwapBuffers, чтоб наблюдателю было не заметно). Читаешь ReadPixels"ом пиксель под мышой (ну типа Getcursorpos). Анализируешь цвет, какому объекту он принадлежит, тот и выбран! Потом затираешь буферы цвета и глубины (и ещё какие у тебя там включены) и рисуешь ту же сцену но уже со всеми графическими наворотами. Вуаля!


 
$00FF00   (2007-01-24 16:13) [2]

А вот по координатам мышки - попробуй GluUnProject, посмотри в справке (F1 на всякий пожарный) как его реализовать.


 
rts111 ©   (2007-01-24 18:46) [3]

А мне надо проекцию оконных координат на плоскость хоy,
точнее координаты точек пересечения углов окна с плоскостью xoy.
Вобщем, я сам сделал, но получилось как-то уж очень сложно,
смотри, возможно тебе пригодится:

...
OGLV :record
 Camera     :TA3d;
 TL         :TA3d; // Top Left
  TC        :TA3d; // Top Center
   TR       :TA3d; // ...
 CL         :TA3d;
  CC        :TA3d;
   CR       :TA3d;
 BL         :TA3d;
  BC        :TA3d;
   BR       :TA3d;
 Distance   :GLFloat;
end;

procedure OGLGetVariables;
var
Wx,Wy,WzT,WzB,WzC :GLdouble;
v                 :TVector3f;
r2                :GLdouble;
h                 :GLdouble;
b,c               :GLdouble;
kT,kB             :GLdouble;
k                 :GLdouble;
begin

glGetIntegerv(GL_VIEWPORT,@vp);
glGetDoublev( GL_PROJECTION_MATRIX , @mpd );
glGetDoublev( GL_MODELVIEW_MATRIX  , @mvd );

with OGLV do
begin
 // CameraPos
 gluUnProject( vp[2]*0.5 , vp[3]*0.5 , -1000000 ,@mvd,@mpd,@vp,Camera[0],Camera[1],Camera[2]);

 // CenterPos
  k:=Camera[2]/mvd[2,2];
 CC[0]:=Camera[0]-mvd[0,2]*k;
 CC[1]:=Camera[1]-mvd[1,2]*k;
 CC[2]:=0;

 // Distance
  v.x:=CC[0]-Camera[0];
  v.y:=CC[1]-Camera[1];
  v.z:=CC[2]-Camera[2];
 Distance:=v.VectorLength;

 //
  gluProject(CC[0],CC[1],CC[2] ,@mvd,@mpd,@vp, Wx , Wy , WzC );
 gluUnProject( 0       , vp[3]*0.5 , WzC ,@mvd,@mpd,@vp,CL[0],CL[1],CL[2]);
 gluUnProject( vp[2]-1 , vp[3]*0.5 , WzC ,@mvd,@mpd,@vp,CR[0],CR[1],CR[2]);

 //
  r2:=v.ProjectionLengthXY; // sqrt(sqr(Distance)-sqr(Camera[2]));
  b:=qArcTan2(r2,Camera[2]);

  v.x:=CL[0]-CC[0];
  v.y:=CL[1]-CC[1];
  v.z:=0;
  h:=v.VectorLength*vp[3]/vp[2];
  c:=qArcTan2(h,Distance);

  kT:=_tan(b+c)*Camera[2]-r2;
  kB:=r2-_tan(b-c)*Camera[2];

  v.x:=-mvd[0,1];
  v.y:=-mvd[1,1];
  v.z:=0;
  v.Normalize;

  gluProject( CC[0]-v.x*kT , CC[1]-v.y*kT , 0 ,@mvd,@mpd,@vp, Wx , Wy , WzT );
  gluProject( CC[0]+v.x*kB , CC[1]+v.y*kB , 0 ,@mvd,@mpd,@vp, Wx , Wy , WzB );

  if WzT>=1 then WzT:=1; //?
  if WzB>=1 then WzB:=1;

 gluUnProject( 0         , vp[3]-1 , WzT ,@mvd,@mpd,@vp, TL[0] , TL[1] , TL[2] );
 gluUnProject( vp[2]*0.5 , vp[3]-1 , WzT ,@mvd,@mpd,@vp, TC[0] , TC[1] , TC[2] );
 gluUnProject( vp[2]-1   , vp[3]-1 , WzT ,@mvd,@mpd,@vp, TR[0] , TR[1] , TR[2] );

 gluUnProject( 0         , 0       , WzB ,@mvd,@mpd,@vp, BL[0] , BL[1] , BL[2] );
 gluUnProject( vp[2]*0.5 , 0       , WzB ,@mvd,@mpd,@vp, BC[0] , BC[1] , BC[2] );
 gluUnProject( vp[2]-1   , 0       , WzB ,@mvd,@mpd,@vp, BR[0] , BR[1] , BR[2] );

 TL[2]:=0; TC[2]:=0; TR[2]:=0;
 CL[2]:=0; CC[2]:=0; CR[2]:=0;
 BL[2]:=0; BC[2]:=0; BR[2]:=0;

end;

end;

Есть ли способ проще?


 
@!!ex ©   (2007-01-24 19:56) [4]


> $00FF00   (24.01.07 16:04) [1]

Медленно жуть, особенно если сцена сложная.
ИМХО такой вариант и буффер выбора - не вариант.
Проще получать координаты мыши в пространстве и сравнивать с координатами объектов, например по сфере тупо.
Если координаты мыши находятся меньше чем на расстоянии R от центра объекта, значит выбран этот объект.
Можно более точные способы использовать или комбинировать.


> rts111 ©   (24.01.07 18:46) [3]


Жуть.. ничего не понял в коде...
Это ты так отсечение по пирамиде видимочти делаеш? :)


 
rts111 ©   (2007-01-24 20:29) [5]

> @!!ex ©   (24.01.07 19:56) [4]
...
> Жуть.. ничего не понял в коде...
> Это ты так отсечение по пирамиде видимочти делаеш? :)

Да, это для отсечения.
Так я нахожу точки пересечения углов окна с плоскостью xoy.  :)

Как жэ проще?


 
@!!ex ©   (2007-01-24 22:46) [6]

Ну вообще тупо есть матрица глобальных преобразований.
Преобразуем уравнение плоскости xoy по этой матрице.
Координаты углов экрана - (-1 -1 0) (1 1 0) тоже преобразуем по этой матрице. Имеем вектора из углов экрана - (-1 -1 1) (1 1 1) - их тоже преобразуем.
По полученным векторам формируем уравнение 4 прямых в пространстве.
Ищем пересечение прямых с плоскостью.

Этр на вскидку решение, наверно есть и получше.
Но даже это, на коленке придуманное, будет работать быстрее.
Так как нет жутко медленных Project/Unproject.
Правда довольно прилично кода получится.


 
rts111 ©   (2007-01-24 23:04) [7]

...
> Правда довольно прилично кода получится.

Мне бы уже готовый код. :)
А так, вобщем, то что у меня сейчас есть, меня вполне удовлетворяет.


 
k8   (2007-01-25 15:17) [8]


> $00FF00

идею понял. только почему-то не работает.


var
   mpd,mvd:array[0..15] of GLdouble;
   vp:array[0..3] of GLint;
...
 with Camera do begin
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(a, Win.Width/Win.Height, zNear, zFar);
   gluLookAt(eye.x,eye.y,eye.z,target.x,target.y,target.z,up.x,up.y,up.z);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

 glGetIntegerv(GL_VIEWPORT,@vp);
 glGetDoublev( GL_PROJECTION_MATRIX , @mpd );
 glGetDoublev( GL_MODELVIEW_MATRIX  , @mvd );
 gluUnProject( Input.MouseX , Input.MouseY , 0 ,
               @mvd,@mpd,@vp,
               curx,cury,curz);
                                     
end;
...
 glTranslatef(curx,0,curz);
 DrawModel(mCur1,0);


что не так?



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

Форум: "Игры";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
2-1207687256
иван8511
2008-04-09 00:40
2008.05.04
Разрешить в Edit ввод только определенных символов


15-1206227132
Petr V. Abramov
2008-03-23 02:05
2008.05.04
Вакансия Delphi программист


2-1206987505
dizZy
2008-03-31 22:18
2008.05.04
ячейка в таблице


3-1196670098
Натуля
2007-12-03 11:21
2008.05.04
SQL Server - ADO Connection - Delphi


3-1196447499
wipr
2007-11-30 21:31
2008.05.04
нет стабильной работы в InterBase по Wi-Fi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский