| 
				
				ДеЦЦкий сад "ПандЁнок"
				 | 
 | 
| 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.
 |  
|   | 
 |    |