Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.053 c
2-1217517743
altatr
2008-07-31 19:22
2008.09.14
Использование процедур


3-1205932798
elserpiente
2008-03-19 16:19
2008.09.14
Malformed string


15-1216662309
Вася
2008-07-21 21:45
2008.09.14
Не могу запустить Делфи


15-1216798715
axis_of_evil
2008-07-23 11:38
2008.09.14
на моей памяти этот вопрос задавали раз 5, но ..


15-1216779181
Slider007
2008-07-23 06:13
2008.09.14
С днем рождения ! 23 июля 2008 среда





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