Форум: "Игры";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.057 c