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

Вниз

3д мир и клики мышью. (OpenGL)   Найти похожие ветки 

 
darkangel   (2006-12-10 16:07) [0]

Доброго времени суток всем :)

может, кто-то сталкивался с реализацией такого взаимодействия при создании игры на 3д движке?

как сделать просто перемещение персонажа я знаю (перевод экранных координат курсора в координаты точки мира на плоскости "земли"), а вот если там закрытое пространство? к примеру там стоит дерево и при клике на его полигон перс должен его рубить, а не перемещаться за него..


 
Fosgen   (2006-12-24 11:49) [1]

НУ по-хорошему надо определять на что игрок кликнул, а после - передавать управление соответствующему обработчику...
А уж по какому признаку ты будешь один меш от другого отличать и как искать пересечения луча от точки клика с мешами сцены - это исключительно твой выбор...


 
@!!ex ©   (2006-12-24 12:29) [2]

Каждый объект задается боксом.
Проверяеш, если точка куда кликнул юзер - в боксе, значит он кликнул по соответствующему объекту.
На gamedev.ru есть несколько отличных статей по Intersection.
а на delphigl - примеры.


 
Fosgen   (2006-12-25 23:46) [3]

боксом конешно самое простое и быстрое, но не всегда самое точное... Например игрок кликнет на пейзаже за деревом, а получится что клик придется на дереве... Так что не всегда получается обходиться одними боксами... Кое-где приходится и полигональные пересечения искать.


 
Vga ©   (2006-12-26 00:43) [4]

> [3] Fosgen   (25.12.06 23:46)

В любом случае по сути все сводится либо к Collision Detection, либо к возможностям OpenGL типа буфера выбора.


 
@!!ex ©   (2006-12-26 13:55) [5]


> Fosgen   (25.12.06 23:46) [3]

Ба. С чего это? Точка будет вне бокса дерева. Она будет на земле.

P.S.
В данном случае надо сравнивать не с вектором, а именно с точкой.
Тогда все кул. и не нужны тут полигоны.
Вот когда проверяеш пересечение каких то движущихся объектов, например пули с телом, тогда конечно. Нужна проверка пересечения с полигонами. и то не всегда.


 
Fosgen   (2007-01-02 19:12) [6]

>@!!ex ©   (26.12.06 13:55) [5]

С которой именно точкой надо сравнивать - можно уточнить?
Если мы проверяем клик мыши в плоскости экрана, то как результат в сцене, мы имеем только вектор условно неопределенной длины. А не какую-то точку.
Откуда точка-то возьмется? Или Вы за точку принимаете координаты вектора? Так, извините, от "пейзажа" или иных объектов в сцене сии координаты никак не зависят, насколько мне известно. А точка появится только тогда когда Вы уважаемый, своими ручками найдете ЕЕ как пересечение с каким-нибудь полигоном. А за Вас никто этого делать не будет... Так что все опять-таки сводится к Collision Detection...
А в случае буфера выбора - тоже не всегда корректно отработает - многое зависит от построения и организации сцены. Так что и тут о каких-то точках говорить вообще не имеет смысла...


 
@!!ex ©   (2007-01-02 20:19) [7]


> Fosgen   (02.01.07 19:12) [6]

Z-Buffer - rullezzzz forever. Насколько мне известно.
И имеем мы именно точку.


 
Fosgen   (2007-01-03 16:28) [8]

>@!!ex ©   (02.01.07 20:19) [7]

Ну и имейте свою точку на здоровье... Вопрос что-нибудь вы с ней путного сделали или только имеете в свое удовольствие?


 
@!!ex ©   (2007-01-03 21:57) [9]

Лично я с помощью этой точки очень много делаю.
Незаменимый помошник, так сказать....
А вы не умеете ею пользоваться? Сочувствую. ;)


 
darkangel   (2007-01-04 18:35) [10]

Всем спасибо за советы :) Буду думать.


 
kumbr   (2007-03-21 18:17) [11]

procedure TfrmGL.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
Viewport : Array [0..3] of GLInt;
mvMatrix, ProjMatrix : Array [0..15] of GLDouble;
RealY : GLint ;          // позиция OpenGL y - координаты
wx, wy, wz : GLdouble ;  // возвращаемые мировые x, y, z координаты
Zval : GLfloat;
begin
glGetIntegerv (GL_VIEWPORT, @Viewport);
glGetDoublev (GL_MODELVIEW_MATRIX, @mvMatrix);
glGetDoublev (GL_PROJECTION_MATRIX, @ProjMatrix);
// viewport[3] - высота окна в пикселях
RealY := viewport[3] - Y - 1;
glReadPixels(X, RealY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Zval);

gluUnProject (X, RealY, Zval,
               @mvMatrix, @ProjMatrix, @Viewport, wx, wy, wz);

ShowMessage ("Мировые координаты для z=" + FloatToStr(Zval)
             + " : " + chr (13) + "(" + FloatToStr(wx)
             + "; " + FloatToStr(wy)
             + "; " + FloatToStr(wz) + ")");
end;

При щелчке мышкой на форме выводит сообщение с координатами данной точки в 3д



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

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

Наверх




Память: 0.5 MB
Время: 0.023 c
3-1204532945
Ega23
2008-03-03 11:29
2008.09.14
Добавить разом много записей.


15-1216662669
Пробегал2....
2008-07-21 21:51
2008.09.14
HTML-элемент "checkbox"


2-1217337692
Kolan
2008-07-29 17:21
2008.09.14
Работа с веб-сервисом.


15-1216318636
@!!ex
2008-07-17 22:17
2008.09.14
Дизайн детей


2-1217770915
mokmoc
2008-08-03 17:41
2008.09.14
TLabel + Paint + Align