![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте дорогие форумчане, сейчас учусь совмещать делфи и OpenGL хотя до сих пор я был знаком только с Delphi.
Я делаю учебную программу(учебную для себя) в которой вам нужно передвигаться стрелочками клавиатуры. Дело в том, что я не знаю, как сделать так, что бы появилась некая непроходимость стен. Стену рисую обычным GL_QUADS. вот сам код: Код:
Возможно я делаю даже не правильными методами, помогите, пожалуйста, разобраться. p.s. так же прикрепляю сам проект |
#2
|
||||
|
||||
![]() Если посмотреть сверху, то у тебя куб образует квадрат, квадрат состоит из 4 отрезков (x1,z1)(x2,z1) .....
Ты двигаешься тоже вдоль какой-то линии от старых координат к новым В общем вся задача сводится к тому, чтобы проверить пересечение линии движения с линиями препятствия См. рис. ![]() |
#3
|
||||
|
||||
![]() как сделать это логически я понимаю, а вот как представить это в коде-нет.
Я пришел к такому выводу пока, я описал квадрат проверками, т.е. если я нахожусь в шаге от того квадрата, то просто прекратить движение. т.е. я завел переменную типа boolean и если я в шаге от квадрата я присваиваю ей "ложь" что в переделанном коде значит, что я не могу двигаться... Мой вариант мне не очень подходит, так как в таком случае я не могу двигаться вообше, а мне надо что бы только в сторону куба |
#4
|
||||
|
||||
![]() Стоит завести переменную не Boolean, а перечисляемого типа (Step = (sLeft, sRight, sTop, sDown)). И запрещать только одно направление.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
![]() Лучше разбить куб на треугольники и искать точку пересечения отрезка (как на рисунке Pilot_Red) с этими треугольниками. В случае пересечения присваивать "игроку" координаты точки пересечения. Тогда "игрок" будет как-бы "скользить" вдоль стены (если направление не вдоль нормали к стене).
И обрабатывать передвижение лучше не сразу при нажатии клавиш, а завести отдельные переменные (типа bool movleft, movright, movforv, movback), при нажатии/отпускании соответствующей клавиши давать им true/false, а в процедуре отрисовки (или отдельном таймере) "перемещать" игрока соответственно их значению. |
#6
|
||||
|
||||
![]() а как вот можно проверить столкновение вообще с чем-либо, без использования координат, т.е. сравнения координаты персонажа и координат обьектов?
|
#7
|
|||
|
|||
![]() Используй физические движки.
|
#8
|
||||
|
||||
![]() поподробнее и в коде пожалуйста
|
#9
|
||||
|
||||
![]() Как бы физический движок это компонент который устанавливается допустим в делфи, или идет в комплекте с каким нибудь 3д движком..
Лично сам делал без сторонних физических движков. Алгоритм следующий, создается массив из элеметов (целочисленных переменных допустим) допустим 15х15, то есть в 224 элемента. Это будет карта, суть следующая: при значении 0 мы данный квадрат проезжаем, при 1 - нет. Для начала нужно разделить этот массив в плоскость. Делаем это следующими функциями Код:
Но это мы просто работаем с массивом, для связи координат того же OpenGL и нашей карты нужны следующие функции: Код:
P.S. Видел эту программу в исходниках на сайте.. ![]() P.S.S. И по моему для рисования каждой грани объекта нужно заново объявлять glBegin(GL_QUADS); .. glEnd; там достаточно 1 раз указать цвет. Т.к. скорее всего будут проблемы с нормалями, а они нужны для правильного освещения. Последний раз редактировалось Anklav, 24.06.2012 в 16:38. |
#10
|
|||
|
|||
![]() на gamedev.ru должны быть разжеванные статьи про это, на крайний случай можно на английском найти
|
#11
|
||||
|
||||
![]() Anklav
Не могли бы вы, встроить этот код что вы написали в мое приложение?? У меня не получается...=( |
#12
|
|||
|
|||
![]() Как встроить? Чему вы научитесь, если за вас все будут делать?
P.S. http://dump.ru/file/5778289 Танчики написанные мной на чистом OpenGL без ботов, но с разрушаемыми препятствиями. P.S.S. Да и кстати, тонкий намек, проверка проходимость должна быть, как бы, до движения... а не после... Я бы посоветовал бы вам, начать не с 3д редакторов, а хотя бы 2д, что бы уловить суть, надо начинать с малого. А на счет того кода который должен работать, по мне так он работает, только вы как то странно его написали. Последний раз редактировалось Anklav, 24.06.2012 в 20:54. |
#13
|
||||
|
||||
![]() Вот например, как я писал, проверка по треугольникам. Но добавлены 2 модуля, большинство ф-ций из них не используется, можешь юзать, разрешаю (сам "одолжил" с чужого проекта, немного доработав). Проверка не пересечения линии движения, а границ обьекта, так недежней. Надеюсь разберешся. Это только пример, начинать обучение с него нельзя.
|
#14
|
||||
|
||||
![]() YVitaliy
Спасибо большое, но не могли бы вы обьяснять, куда надо что добавить, что бы заработало и с другими стенами, вот нарисовать я их нарисовал, а дальше что?=) Заранее еще раз спасибо |
#15
|
||||
|
||||
![]() Из модуля l_math.pas я использую класс TVector - точка с координатами X, Y, Z. Соответственно стену я рисую по 4м точкам - векторам v1, v2, v3..., которые задаю при создании формы
Код:
Код:
|