![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
3д мир и клики мышью. (OpenGL) [Delphi, Windows]
darkangel © (2006-12-10 16:07:00)Доброго времени суток всем :)
может, кто-то сталкивался с реализацией такого взаимодействия при создании игры на 3д движке?
как сделать просто перемещение персонажа я знаю (перевод экранных координат курсора в координаты точки мира на плоскости "земли"), а вот если там закрытое пространство? к примеру там стоит дерево и при клике на его полигон перс должен его рубить, а не перемещаться за него..
kumbr (2007-03-21 18:17:00) [1]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д
darkangel (2007-01-04 18:35:00) [2]Всем спасибо за советы :) Буду думать.
@!!ex (2007-01-03 21:57:00) [3]Лично я с помощью этой точки очень много делаю.
Незаменимый помошник, так сказать....
А вы не умеете ею пользоваться? Сочувствую. ;)
Fosgen (2007-01-03 16:28:00) [4]>@!!ex © (02.01.07 20:19) [7]
Ну и имейте свою точку на здоровье... Вопрос что-нибудь вы с ней путного сделали или только имеете в свое удовольствие?
@!!ex (2007-01-02 20:19:00) [5]
> Fosgen (02.01.07 19:12) [6]
Z-Buffer - rullezzzz forever. Насколько мне известно.
И имеем мы именно точку.
Fosgen (2007-01-02 19:12:00) [6]>@!!ex © (26.12.06 13:55) [5]
С которой именно точкой надо сравнивать - можно уточнить?
Если мы проверяем клик мыши в плоскости экрана, то как результат в сцене, мы имеем только вектор условно неопределенной длины. А не какую-то точку.
Откуда точка-то возьмется? Или Вы за точку принимаете координаты вектора? Так, извините, от "пейзажа" или иных объектов в сцене сии координаты никак не зависят, насколько мне известно. А точка появится только тогда когда Вы уважаемый, своими ручками найдете ЕЕ как пересечение с каким-нибудь полигоном. А за Вас никто этого делать не будет... Так что все опять-таки сводится к Collision Detection...
А в случае буфера выбора - тоже не всегда корректно отработает - многое зависит от построения и организации сцены. Так что и тут о каких-то точках говорить вообще не имеет смысла...
@!!ex (2006-12-26 13:55:00) [7]
> Fosgen (25.12.06 23:46) [3]
Ба. С чего это? Точка будет вне бокса дерева. Она будет на земле.
P.S.
В данном случае надо сравнивать не с вектором, а именно с точкой.
Тогда все кул. и не нужны тут полигоны.
Вот когда проверяеш пересечение каких то движущихся объектов, например пули с телом, тогда конечно. Нужна проверка пересечения с полигонами. и то не всегда.
Vga (2006-12-26 00:43:00) [8]> [3] Fosgen (25.12.06 23:46)
В любом случае по сути все сводится либо к Collision Detection, либо к возможностям OpenGL типа буфера выбора.
Fosgen (2006-12-25 23:46:00) [9]боксом конешно самое простое и быстрое, но не всегда самое точное... Например игрок кликнет на пейзаже за деревом, а получится что клик придется на дереве... Так что не всегда получается обходиться одними боксами... Кое-где приходится и полигональные пересечения искать.
@!!ex (2006-12-24 12:29:00) [10]Каждый объект задается боксом.
Проверяеш, если точка куда кликнул юзер - в боксе, значит он кликнул по соответствующему объекту.
На gamedev.ru есть несколько отличных статей по Intersection.
а на delphigl - примеры.
Fosgen (2006-12-24 11:49:00) [11]НУ по-хорошему надо определять на что игрок кликнул, а после - передавать управление соответствующему обработчику...
А уж по какому признаку ты будешь один меш от другого отличать и как искать пересечения луча от точки клика с мешами сцены - это исключительно твой выбор...