ДеЦЦкий сад "ПандЁнок"
|
|
ninth | Дата: Пятница, 11.03.2011, 21:03 | Сообщение # 76 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Попробую на пальцах пояснить. У нас есть некоторый объект myNodePath. Есть переменная speed, допустим speed = 2. Написав myNodePath.setX(myNodePath, speed) мы переместим объект на расстояние speed (в нашем случае 2) по оси X относительно самого себя. На первый взгляд всё здорово - объект переместился на заданное расстояние, но есть проблема - для достижения плавного движения мы перемещаем объект в каждом кадре а не один раз. Помимо этого, кадров в секунду (пресловутые FPS - frame per second) у нас на разных компах может быть разное количество - на одном 100 кадров в секунду, на другом - 40, на третьем - 25, а может и так что на одном и том же компе количество FPS разнится в зависимости от сложности отрисовываемой сцены. И получается что за секунду объект будет проходить соответственно 200, 80 и 50 единиц. Но нам-то нужно чтобы он переместился на 2 единицы за одну секунду и независимо от того на каком компе это происходит. Для этого мы с помощью globalClock.getDt() получаем значение времени, прошедшего между последними двумя кадрами. К примеру для 40 FPS это будет 1/40 = 0,025. Умножив нашу speed на это значение мы получим то расстояние на которое должен переместиться объект за один кадр так чтобы в итоге за секунду он прошёл заданную speed. з.ы. формула длины пути для равномерного прямолинейного движения s = v*t, где v - скорость, а t - время. Это я на всякий случай напоминаю
|
|
| |
pihto | Дата: Суббота, 12.03.2011, 05:02 | Сообщение # 77 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| ninth доходчиво поясняеш.. все понял.. ещё раз спасибо =) Добавлено (11.03.2011, 23:35) --------------------------------------------- уже стыдно за спасибо чтото спрашивать ))) Добавлено (12.03.2011, 05:02) --------------------------------------------- все никак не пойму почему в классе character в функции update когда происходит присвоени вектору v параметра Z v.setZ(self.root.getZ()) то в self.waypoints Z тоже изменяется.. это какие то возможности функции setZ() ? и вот ещё вопросик.. если вычитать от координат вейпоинта координаты гнома то я получаю расстояние между гномом и вейпоинтом, записываю в переменную(оно мне нужно для определения времени за которое гном пройдётэто расстояние).. но тут не учитаваются ямы и холмы.. как тут быть? ибо через буираки гном будет дольше идти чем на прямую(как и высчитывается)
|
|
| |
ninth | Дата: Суббота, 12.03.2011, 13:28 | Сообщение # 78 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Quote (pihto) уже стыдно за спасибо чтото спрашивать ))) Open Source - Open Mind ) Quote (pihto) self.waypoints Z тоже изменяется.. это какие то возможности функции setZ() ? Не совсем. Это особенность самого питона - ссылочная структура данных. В данном случае в этой строке act,v = self.waypoints[0] переменной v передаётся ссылка на нужные данные, а не копируются эти данные. Вот пример для наглядности: Code >>> a = [1,0] >>> b = a >>> b[1] = 10 >>> print a [1, 10] Quote (pihto) если вычитать от координат вейпоинта координаты гнома то я получаю расстояние между гномом и вейпоинтом Ты получаешь вектор, направленный от гнома к вейпойнту, а расстояние можно получить как длину этого вектора. Причём Z надо будет предварительно привести к 0 - о причине этого см. ниже. Quote (pihto) но тут не учитаваются ямы и холмы.. И верно и не верно одновременно ). Дело в том, что неровности действительно не учитываются... совсем. По факту движение идёт в плоскости (вот для чего служит v.setZ(self.root.getZ())) и лишь после перемещения персонажа он ставится на высоту, соответствующую высоте местности self.root.setZ(self.collsys.GroundHandler.getEntry(0).getSurfacePoint(render).getZ()) так что неровности никак не влияют на линейное перемещение. Поэтому рассчитывать время в данном случае нужно приводя координату Z к нулю. Это конечно не совсем реалистично, т.к. по склону скорость движения будет тем больше, чем круче склон независимо от того вверх или вниз он идёт но в данном случае задачей было просто показать дин из вариантов реализации движения. Исправить эту ситуацию можно несколькими путями, но это дополнительный код )
|
|
| |
pihto | Дата: Суббота, 12.03.2011, 14:17 | Сообщение # 79 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| Ну да, точно! скорость гнома относительно оси Х не меняется.. меняется только относительно оси Z.. а зачем предварительно приравнивать Z вейпоинта к нулю если она приравнивается к Z гнома? Quote (ninth) Исправить эту ситуацию можно несколькими путями, но это дополнительный код ) я вообще пока что боюсь таких слов )
|
|
| |
ninth | Дата: Суббота, 12.03.2011, 14:23 | Сообщение # 80 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Quote (pihto) а зачем предварительно приравнивать Z вейпоинта к нулю если она приравнивается к Z гнома? В данном случае скорее подразумевался полученный вектор направления. Если Z вейпойнта = Z гнома, то всё верно - в полученном векторе Z и так будет 0, а если нет, тогда придётся нулить вручную.
|
|
| |
pihto | Дата: Воскресенье, 13.03.2011, 18:20 | Сообщение # 81 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| ну да.. но в коде идёт две строки вподряд v.setZ(self.root.getZ()) v=Vec3(v-self.root.getPos()) то есть в результате в полученном векторе v Z будет равна 0.. думаю тут никак не может быть что Z вейпойнта != Z гномаДобавлено (13.03.2011, 18:20) --------------------------------------------- ninth, после того как сделал чтоб гном перемещался вот так - self.root.setY(self.root,globalClock.getDt()*self.speed) гнома начало типать , дёргать (вроде вперёд) мримерно раз в секунду.. это связано с обновлением цифры фпс?
|
|
| |
ninth | Дата: Понедельник, 14.03.2011, 08:30 | Сообщение # 82 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Проверь для начала - скорее всего он у тебя где-то ещё пытается перемещаться.
|
|
| |
pihto | Дата: Понедельник, 14.03.2011, 20:35 | Сообщение # 83 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| даже в скачаный урок 6 вместо self.root.setPos(self.root,0,0.045,0) втсавить self.root.setPos(self.root,0,globalClock.getDt()*4,0) тоже типает
|
|
| |
ninth | Дата: Вторник, 15.03.2011, 09:21 | Сообщение # 84 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Попробовал - никаких проблем не наблюдаю. Точно ничего не менялось кроме этой строки? Для уверенности скачай заново и попробуй на чистом. Если нет, то попробуй в globals.py заменить taskMgr.add(player.update,'char_update') на taskMgr.add(player.update,'char_update', priority = 30)
|
|
| |
pihto | Дата: Вторник, 15.03.2011, 15:56 | Сообщение # 85 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| Этого типания просто почни не заметно.. но оно есть.. попробуй globalClock.getDt() умножить на 20 отведи камеру повыше и побегай туда сюда на приличные расстояния(в пределах раскрытого окна панды) - увидиш точно
|
|
| |
ninth | Дата: Вторник, 15.03.2011, 16:49 | Сообщение # 86 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| не вижу )
|
|
| |
ninth | Дата: Вторник, 15.03.2011, 16:52 | Сообщение # 87 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Возможно у тебя низкие fps - тогда это может быть заметно на быстро движущихся объектах.
|
|
| |
pihto | Дата: Вторник, 15.03.2011, 17:45 | Сообщение # 88 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| хм... 75 фпс - это нормально? Добавлено (15.03.2011, 17:45) --------------------------------------------- ухты. хотел тоже фрапсом записать эту аномалию и заметил парадокс.. при нажатии ф9 (запуск записи в фрапсе) - гнома перестаёт типать и фпс 30.. выключаю запись - фпс 75 и снова начинает типать...
Сообщение отредактировал pihto - Вторник, 15.03.2011, 17:46 |
|
| |
ninth | Дата: Среда, 16.03.2011, 08:18 | Сообщение # 89 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Ничего не пойму. Попробуй вертикальную синхронизацию включить. Приоритет задаче пробовал поставить? Какая видео-карточка и дрова?
|
|
| |
pihto | Дата: Среда, 16.03.2011, 15:37 | Сообщение # 90 |
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
| синхронизация не помогла, приоритет стоит, карта Asus EAH4550 Video Adapter, дата драйвера 16.03.2009 (старый?), версия 8.600.0.0, поставщик ATI Technologies Inc.
|
|
| |