Математические и механические задачи в GTA
|
|
Den_spb | Дата: Понедельник, 28.03.2011, 04:25 | Сообщение # 1 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Сообщения перенесены в отдельную тему
|
|
| |
DK22Pac | Дата: Понедельник, 28.03.2011, 04:25 | Сообщение # 2 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Денис, у тебя есть каие-то идеи по поводу того, как определить угол поверхности? Речь будет идти о наложении обьекта(плоскости) небольших размеров на динамический либо статистический обьект. Предполагается, что точка их соприкосновения уже найдена, и центр налаживаемой плоскости - эта точка. Остаётся толкьо развернуть эту плоскость относительно обьекта. У меня есть идея, но немного бредовая
Сообщение отредактировал DK22Pac - Понедельник, 28.03.2011, 03:25 |
|
| |
Den_spb | Дата: Понедельник, 28.03.2011, 04:25 | Сообщение # 3 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Чтобы построить касательную плоскость (я так понимаю, тебе нужно это), помимо точки касания надо знать направление нормали (прямая, которая будет перпендикулярна данной плоскости). Для объекта произвольной формы у меня есть только одна идея: 1.Прикрепить плоскость к объекту с произвольными углами 2. взять на плоскости несколько симметрично расположенных относительно центра касания точек (4 точки, расположенных по углам квадрата, центр которого - точка касания) 3. в цикле с помощью проверок no_obstacles вычислить расстояния от каждой из этих точек до объекта. 4. Если расстояние от одной из точек плоскости до объекта больше, чем от диаметрально противоположной (относительно точки касания) точки плоскости до объекта, то "доворачиеваем" плоскость в соответствующую сторону.
|
|
| |
DK22Pac | Дата: Суббота, 02.04.2011, 01:26 | Сообщение # 4 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо. У меня была идейка очень схожая. Вопрос: правилен ли такой способ вычесления рандомной точки в опр. радиусе? Code 0209: 3@ = random_int_in_ranges 15 40 for 4@ = 0 to 3@ car.StorePos(0@, 6@, 7@, 8@) 0209: 9@ = random_int_in_ranges 100 1000 0208: 13@ = random_float_in_ranges .0 360.0 0208: 16@ = random_float_in_ranges .0 4.0 02F6: 14@ = sine 13@ 02F7: 15@ = cosine 13@ mul(14@, 16@) mul(15@, 16@) inc(6@, 15@) inc(7@, 14@) inc(8@, 4.0) 02CE: 10@ = ground_z_at 6@ 7@ 8@ inc(10@, 0.5) 02E1: 5@ = create_cash_pickup 9@ at 6@ 7@ 10@ permanence_flag true end
Сообщение отредактировал DK22Pac - Суббота, 02.04.2011, 01:35 |
|
| |
Den_spb | Дата: Суббота, 02.04.2011, 03:53 | Сообщение # 5 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (DK22Pac) Вопрос: правилен ли такой способ вычесления рандомной точки в опр. радиусе? Да, способ правильный и самый быстрый. С теоремой Пифагора операций требуется больше:Code 0209: 3@ = random_int_in_ranges 15 40 for 4@ = 0 to 3@ car.StorePos(0@, 6@, 7@, 8@) 0209: 9@ = random_int_in_ranges 100 1000 0208: 13@ = random_float_in_ranges -4.0 4.0 0AEE: 14@ = 13@ exp 2.0 //all floats 14@ *= -1.0 14@ += 16.0 0AEE: 14@ = 14@ exp 0.5 //all floats 0087: 15@ = 14@ // (float) 15@ *= -1.0 0208: 15@ = random_float_in_ranges 15@ 14@ inc(6@, 15@) inc(7@, 13@) inc(8@, 4.0) 02CE: 10@ = ground_z_at 6@ 7@ 8@ inc(10@, 0.5) 02E1: 5@ = create_cash_pickup 9@ at 6@ 7@ 10@ permanence_flag true end
|
|
| |
DK22Pac | Дата: Суббота, 09.04.2011, 23:13 | Сообщение # 6 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Den_spb, вот такой простенький код для вычисления "координат пули" http://pastebin.com/wMQHUBiM Игра немного притормаживает. Хотелось бы это организовать так: У нас есть начальная точка и конечная. Находим между ними середину. Проверяем - есть ли преграды в первом отрезке. Если есть - делим уже этот отрезок на 2... И т.д. ... А если нет - то делим второй отрезок... Думаю, это намного сократит кол-во операций для более точного вычисления нужных координат. Вот только не могу придумать, как это всё записать.
Сообщение отредактировал DK22Pac - Суббота, 09.04.2011, 23:28 |
|
| |
Den_spb | Дата: Воскресенье, 10.04.2011, 01:10 | Сообщение # 7 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (DK22Pac) Думаю, это намного сократит кол-во операций для более точного вычисления нужных координат. Вот только не могу придумать, как это всё записать. Да, пожалуй, такой способ - самый оптимальный. Он уже рассматривался здесь: http://sannybuilder.com/forums/viewtopic.php?id=629
|
|
| |
DK22Pac | Дата: Воскресенье, 10.04.2011, 01:28 | Сообщение # 8 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо огромное! Я кстати тоже недавно смотрел этот скрипт, accessory.cs, там это реализовано приблизительно так: http://pastebin.com/9UvYa10b Жаль только, что формы автомобиля немного неправильными получаются (обьект создаётся в воздухе около автомобиля) Завтра попробую написать код для определения угла поверхности.
Сообщение отредактировал DK22Pac - Воскресенье, 10.04.2011, 01:28 |
|
| |
Den_spb | Дата: Воскресенье, 10.04.2011, 02:35 | Сообщение # 9 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (DK22Pac) Жаль только, что формы автомобиля немного неправильными получаются (обьект создаётся в воздухе около автомобиля) Наверно проверка no_obstacles работает с моделями коллизии.
|
|
| |
DK22Pac | Дата: Воскресенье, 10.04.2011, 17:00 | Сообщение # 10 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Quote (Den_spb) Наверно проверка no_obstacles работает с моделями коллизии. Да... Но ведь капли дождя, вроде бы, правильно "приземляются" на автомобиль... Ещё раз спасибо)
|
|
| |
Den_spb | Дата: Воскресенье, 10.04.2011, 17:08 | Сообщение # 11 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (DK22Pac) Но ведь капли дождя, вроде бы, правильно "приземляются" на автомобиль... Возможно. Я подробно данные вопросы не изучал. Quote (DK22Pac) Ещё раз спасибо) Незачто. Следы от пуль хорошо получились
|
|
| |
DK22Pac | Дата: Воскресенье, 10.04.2011, 23:47 | Сообщение # 12 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Попробовал такой код для вычисления угла поверхности. Суть такова - в цикле "рисуем" полукруг вокруг обьекта (обьект - квадрат, со стороной 0.06), всего должно быть 180 точек, проверяем, есть ли преграды между "поточной" и следующей" точкой. Почему-то не работает (угол каким был, таким и остался - вероятно, проверка сразу же срабатывает (пробовал начинать с 10 (for 0@ = 10 to 180), но не помогло). Code for 0@ = 0 to 180 0A8E: 16@ = 0@ + 1 // int 0093: 15@ = integer 0@ to_float 0093: 17@ = integer 16@ to_float 02F7: 13@ = cosine 15@ // (float) 02F6: 14@ = sine 15@ // (float) 02F7: 18@ = cosine 17@ // (float) 02F6: 19@ = sine 17@ // (float) mul(13@, 0.03) mul(14@, 0.03) mul(18@, 0.03) mul(19@, 0.03) 0400: store_coords_to 20@ 21@ 22@ from_object 30@ with_offset 13@ 14@ 0.0 0400: store_coords_to 23@ 24@ 25@ from_object 30@ with_offset 18@ 19@ 0.0 if 86BD: not no_obstacles_between 20@ 21@ 22@ and 23@ 24@ 25@ solid 1 car 0 actor 0 object 0 particle 0 then break end end //0400: store_coords_to 20@ 21@ 22@ from_object 30@ with_offset 17@ 18@ 19@ 0208: 29@ = random_float_in_ranges 0.0 360.0 0453: set_object 30@ XY_rotation 0.0 29@ angle 15@
|
|
| |
Den_spb | Дата: Понедельник, 11.04.2011, 00:33 | Сообщение # 13 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Не понял принцип действия, объясни подробнее. Почему берётся полукруг, если задача пространственная? Quote (DK22Pac) 0453: set_object 30@ XY_rotation 0.0 29@ angle 15@ Это что? Установка углов X, Y, Z? Quote (DK22Pac) 0208: 29@ = random_float_in_ranges 0.0 360.0 Это зачем? П.С. Счётчик цикла лучше сразу сделать дробным числом, чтобы не добавлять лишние команды.
|
|
| |
DK22Pac | Дата: Понедельник, 11.04.2011, 00:53 | Сообщение # 14 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Пока что мне надо найти только угол по оси Z. Для этого я беру точки от центра обьекта, на расстоянии 0.03. Сейчас открою ФШ постараюсь нарисовать. Quote Это что? Установка углов X, Y, Z? Да. Обьект в максе: Обьект "двусторонний".
Сообщение отредактировал DK22Pac - Понедельник, 11.04.2011, 01:40 |
|
| |
Den_spb | Дата: Понедельник, 11.04.2011, 01:40 | Сообщение # 15 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Теперь понятно. Но здесь тоже можно было бы использовать "метод деления на 2", а не проверять каждую пару точек.
|
|
| |