[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
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 - время. Это я на всякий случай напоминаю wink

 
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
не вижу )
Прикрепления: test_agk.avi (866.0 Kb)
 
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.
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: