[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Panda3D - по русски » Panda3D » Примеры кода » Упрвление+камера по типу TPS
Упрвление+камера по типу TPS
ninthДата: Четверг, 05.02.2009, 10:17 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
a,d - поворот
w,s - вперёд, назад

Code
# -*- coding: utf_8 -*-
import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.task import Task
from direct.actor import Actor
from direct.interval.IntervalGlobal import *
from CameraHandler import CameraHandler
from direct.showbase import DirectObject    

#загрузка модели окружения
environ = loader.loadModel("models/environment")
environ.reparentTo(render)
environ.setScale(0.25,0.25,0.25)
environ.setPos(-8,42,0)

#загрузка моддели и анимации
pandaActor = Actor.Actor("models/panda-model",{"walk":"models/panda-walk4"})
pandaActor.setScale(0.005,0.005,0.005)
pandaActor.reparentTo(render)
#----------------------------------------------------     
#здесь мы используем простой приём для закрепления камеры
#по типу шутеров от третьего лица - назначим родителем камеры узел,    
#который имеет ту же позицию и ориентацию, что и наш актёр. Не во    
#всех случаях такой приём является лучшим решением. Однако для    
#нашего примера он оптимален.
#----------------------------------------------------
#отключаем дефолтную мышь
base.disableMouse()
#создаём нод для камеры
#можно было бы прикрепить камеру прямо к актёру,
#но у нас на актёре висит модификатор масштабирования
#поэтому будут глюки
camCenter = render.attachNewNode('camCenter')    
base.camera.reparentTo(camCenter)
#устанавливаем позицию камеры
#и заствляем смотреть в нужном направлении
base.camera.setPos(0,20,8)
base.camera.lookAt(camCenter)

#наш класс для управления актёром
class KeyHandler(DirectObject.DirectObject):
       def __init__(self):
           #переменные скорости перемещения и поворота
           self.speed=0
           self.turnspeed=0
           #регистрируем события реагирующие на клавиатуру
           #Замечание: модификатор масштаба, применённый к ноду    
           #так же действует и на перемещения, поэтому скорость    
           #ставим довольно большую
           self.accept('w',lambda: self.walk(-15))
           self.accept('s',lambda: self.walk(15))
           self.accept('d',lambda: self.turn(-1))
           self.accept('a',lambda: self.turn(1))
           self.accept('w-up',lambda: self.walk(0))
           self.accept('s-up',lambda: self.walk(0))
           self.accept('d-up',lambda: self.turn(0))
           self.accept('a-up',lambda: self.turn(0))    
           #регистрируем задачу перемещения актёра          
           taskMgr.add(self.moveTask,"moveTask")
       #процедура, устанавливающая скорость перемещения
       #и запускающая анимацию, если нужно       
       def walk(self,speed):
           self.speed=speed
           if speed==0:
               pandaActor.stop()       
           else:
               pandaActor.loop("walk")       
               pandaActor.getAnimCo ntrol("walk").setPlayRate(self.speed*0.15)           
       #процедура, устанавливающая скорость поворота           
       def turn(self,turnspeed):
           self.turnspeed=turnspeed
       #собственно процедура обработки перемещения нашего актёра
       def moveTask(self,task):
           #смещаем актёра относительно самого себя на скорость
           pandaActor.setPos(pandaActor,0,self.speed,0)
           #поворачиваем на скорость поворота вокруг вертикальной оси
           pandaActor.setH(pandaActor.getH()+self.turnspeed)
           #ставим центр камеры немного выше актёра - так что б направление взгляда
           #не упиралось в него, а проходило выше
           camCenter.setPos(pandaActor.getX(),pandaActor.getY(),pandaActor.getZ()+5)
           #и ставим для узла центра камеры тот же поворот, что и для актёра
           camCenter.setHpr(pandaActor.getHpr())
           return task.cont

#создаём класс, отвечающий за управление
KeyHandler()
#и запускаем основной цикл
run()    
 
3dmaxДата: Пятница, 06.02.2009, 12:12 | Сообщение # 2
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Я так понял что от Scale персонажа зависит его скорость, Это не есть хорошо. а если у меня модель другого размера ?
Я вот не угодал с размером. Он у меня летает как ракета. А если Уменьшаю (Scale) до размеров муравья, тогда скорость белее менее приемлема.

Еще Вопрос Скок нужно изучать питон, чтобы писать такие скрипты ? Я вот не могу разобрать все в подробностях. Откуда ты (да и другие) знаете название тех или иных функций.

 
ninthДата: Пятница, 06.02.2009, 12:36 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Да, Масштаб влияет, в том числе на смещения, т.к. каждый узел сцены имеет собственную локальную систему координат. В данном случае получается, что pandaActor.setPos(pandaActor,0,self.speed,0) смещается относительно самого себя, т.е. относительно своей системы координат, которая по масштабу не совпадает с корневой системой координат. Если смещать его без указания первого параметра - pandaActor.setPos(0,self.speed,0) то смещение будет относительно корневой системы, однако тогда и направление смещения не будет совпадать с направлением актёра.
Для решения проблемы можно делать так - основной актёр - пустой узел - думмик, к нему привязывается камера и его же чайлдом делается модель персонажа, тогда масштаб модели не будет влиять на всё остальное ибо перемещать мы будем не её, а наш пустой узел-нод.

Т.е. что-то вроде этого

Code
avatar = render.attachNewNode('avatar')  
pandaActor.reparentTo(avatar)

а дальше уже работаем не с pandaActor, а с avatar

Прикрепления: 7164693.gif(3Kb)
 
ninthДата: Пятница, 06.02.2009, 13:00 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
По поводу питона - если честно, то я его фактически знаю не очень хорошо, и целенаправленно не изучал. Однако, я знаю несколько других языков высокого уровня, а принцип у них один и тот же, поэтому мне достаточно было полистать учебник по питону и посмотреть примеры чужого кода что б понять семантику и синтаксис.
Дальше дело проще - фактически перед тем как написать кусок кода, я представляю его в мыслях на некотором условно-усреднённом языке - логическую структуру, требующиеся функции и переменные. После чего начинаю писать, а нужные функции, если не знаю как она выглядит в данном языке - ищу по ходу дела в справочниках и интернете, если нужная функция не находится, то по обстоятельствам - либо пишу её сам, либо ищу другой способ решения проблемы.
Вообще, после накопления некоторого критического объёма знаний это всё делается на автомате. Для большинства часто используемых функций есть аналоги во всех языках программирования.
 
3dmaxДата: Суббота, 07.02.2009, 03:48 | Сообщение # 5
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
ОО Получилось smile . Я еще сделал скорость анимации =1 чтобы не зависила от скорости перемещения.
Да но, блин ,мне надо учить питон, я что-то теряюсь. По блокам понимаю что за что отвечает, а о многом не понимаю. Ладно, буду дальше учебник читать wink , а то так программа выростет и я ваще потеряюсь в ней wacko
 
ninthДата: Суббота, 07.02.2009, 23:28 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Вообще, по хорошему, если планируется изменение скорости перемещения (ускорители какие-нить или наоборот тормозилки), то скорость анимации лучше привязать к скорости перемещения. Просто нужно правильно подобрать коэффициент, и не забывать, что этот коэффициент является множителем - т.е 0.9 - анимация медленнее, а 1.1 - быстрее
 
3dmaxДата: Суббота, 07.02.2009, 23:48 | Сообщение # 7
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Ну я так и понял, просто когда делаешь анимацию персонажу, то расчитуешь что он будет бегать именно с этой скоростью, быстрее или медленнее будет смотреться уродски, особенно если анимация белее менее реально выглядит.
 
ninthДата: Воскресенье, 08.02.2009, 02:17 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Ну в принципе да, но опять же смотря как сделано - а то ели у персонажа скорость уменьшится, а анимация останется с той же скоростью, то получится как будто ноги проскальзывают по земле.
 
3dmaxДата: Воскресенье, 08.02.2009, 04:49 | Сообщение # 9
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Тоже правильно wink
 
HunterSKДата: Среда, 11.02.2009, 21:25 | Сообщение # 10
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 0
Статус: Offline
код не робит, даж ничё не запускается cry

Рэп прёт и не е";?:"т.....Рэперам Респект
 
3dmaxДата: Среда, 11.02.2009, 21:56 | Сообщение # 11
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Даже у меня работает. Ты чет не так делаешь.

Добавлено (11.02.2009, 21:56)
---------------------------------------------
Че там в output пишеться ?

 
HunterSKДата: Среда, 11.02.2009, 21:59 | Сообщение # 12
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 0
Статус: Offline
командная строка открывается и тут же закрывается, я пробовал на чисты код, который тут написан ввести, тажа проблема.....

Рэп прёт и не е";?:"т.....Рэперам Респект
 
3dmaxДата: Среда, 11.02.2009, 22:03 | Сообщение # 13
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Как ты его запускаешь surprised ???
ты это читал ? http://panda3d.org.ru/publ/1-1-0-1
 
HunterSKДата: Среда, 11.02.2009, 22:06 | Сообщение # 14
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 0
Статус: Offline
Пишу в NotePad++, а за пускаю так ТЫК

Рэп прёт и не е";?:"т.....Рэперам Респект

Сообщение отредактировал HunterSK - Среда, 11.02.2009, 22:06
 
3dmaxДата: Среда, 11.02.2009, 23:08 | Сообщение # 15
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
но тут ссылка на звук. я раньше запускал батником в нем писал:
@ppython new_1.py

new_1 - это название скрипта.
А ваще лучше поставь SPE намного удобнее чем NotePad++(этот я тож пробовал)

 
Форум Panda3D - по русски » Panda3D » Примеры кода » Упрвление+камера по типу TPS
Страница 1 из 212»
Поиск: