[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Форум Panda3D - по русски » Panda3D » Примеры кода » Управление камерой
Управление камерой
3dmaxДата: Вторник, 10.02.2009, 12:09 | Сообщение # 16
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Ну я хочу чтобы камера продолжала вращаться когда курсор доходит до конца, чтобы он перепрыгивал на противоположную сторону.
Я думал что в этом куске скрипта нужно менять
def turnCameraAroundPoint(self,tx,ty,p,dist):
# props = WindowProperties()
# props.setCursorHidden(True)
# base.win.requestProperties(props)

newCamHpr=Vec3()
camHpr=base.camera.getHpr()
newCamHpr.setX(camHpr.getX()+tx) # ##
newCamHpr.setY(camHpr.getY()-ty)
newCamHpr.setZ(camHpr.getZ())
#print camHpr.getZ()
base.camera.setHpr(newCamHpr)
angleradiansX = newCamHpr.getX() * (math.pi / 180.0)
angleradiansY = newCamHpr.getY() * (math.pi / 180.0)
base.camera.setPos( dist*math.sin(angleradiansX)*math.cos(angleradiansY),
-dist*math.cos(angleradiansX)*math.cos(angleradiansY),
-dist*math.sin(angleradiansY) )
 
ninthДата: Вторник, 10.02.2009, 13:10 | Сообщение # 17
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
ну а чем функция base.win.movePointer(0, X, Y) не нравится?
 
3dmaxДата: Вторник, 10.02.2009, 13:13 | Сообщение # 18
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Вот теперь думаю куда ее впихнуть wacko
 
ninthДата: Вторник, 10.02.2009, 13:27 | Сообщение # 19
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
после вызова функции turnCameraAroundPoint делай проверку где у тебя сейчас мышь, и если около края, то перекидывай на другой край, только не забудь в этом случае сбросить начальные координаты, а то камера решит, что ты просто в другую сторону мышь сдвинул
 
3dmaxДата: Среда, 11.02.2009, 00:37 | Сообщение # 20
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
вот че я написал:
..........
# задал начальные значения
self.X = 1
self.Y = 1
.............
self.turnCameraAroundPoint(0,0,self.target,self.camDist)
...........
self.turnCursor(self.X,self.Y)
...........
def turnCursor(self,tCX,tCY):
X=tCX
Y=tCY
base.win.movePointer(0, X, Y) # Вот тут я не знаю как правильно

А что нужно но настоящему написать вместо X и Y в этой функции? Ведь нам как-то надо получить новые значения X и Y . wacko
Кароч я не знаю sad
Заранее извиняюсь за ламерские вопросы .

Сообщение отредактировал 3dmax - Среда, 11.02.2009, 00:39
 
ninthДата: Среда, 11.02.2009, 09:05 | Сообщение # 21
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
base.win.getXSize() и base.win.getXSize() - размеры текущего окна в пикселях.
base.win.getPointer(0).getY() и base.win.getPointer(0).getX() - положение курсора в окне в пикселях

base.win.movePointer(0, X, Y) - X и Y тоже в пикселях соответственно, исходя из этого можно рассчитать куда перекидывать курсор.

для этих функций левый верхний угол окна - 0:0, правый нижний - размер окна в пикселях - обрати внимание - в отличае, от base.mouseWatcherNode.getMouse() который считает относительное положение курсора в пределах от -1:-1 до 1:1

Но, ещё раз повторюсь - у тебя будет проблема при перекидывании курсора на другую сторону будет и камера поворачиваться на соответственный смещению угол, так что обычная практика - после каждого шага возвращать курсор в центр экрана и для поворота считать смещение от центра, как я приводил пример где-то ранее.

 
3dmaxДата: Четверг, 12.02.2009, 04:07 | Сообщение # 22
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Да ты был прав камера тоже поворачивается, надо что-то придумать wink

Добавлено (12.02.2009, 02:54)
---------------------------------------------
А что за ерунда, Когда только что запустил SPE после окончания запуска скрипта окно графа (ну там де сама игра) быстро закрывается.
А если раз 6 запускал скрипт то вся эта ерунда закрывается долго как будто тормозит. Если перезапускаю SPE все нормально но после нескольких запусков скрипта тоже самое wacko

Добавлено (12.02.2009, 03:32)
---------------------------------------------
Камеру сделал biggrin вот просто прибавляю это смещение там где надо и все biggrin

Code
def turnCameraAroundPoint(self,tx,ty,p,dist):
       #  props = WindowProperties()
       #  props.setCursorHidden(True)
       #  base.win.requestProperties(props)  
          
         Xc=base.win.getXSize()/2-base.win.getPointer(0).getX()
         Yc=base.win.getYSize()/2-base.win.getPointer(0).getY()
         base.win.movePointer(0,base.win.getXSize()/2,base.win.getYSize()/2)
          
         newCamHpr=Vec3()          
         camHpr=base.camera.getHpr()
         newCamHpr.setX(camHpr.getX()+Xc*0.3)  # вот тут прибавляю
         newCamHpr.setY(camHpr.getY()+Yc*0.3) # вот тут прибавляю
         newCamHpr.setZ(camHpr.getZ())
         base.camera.setHpr(newCamHpr)
         angleradiansX = newCamHpr.getX() * (math.pi / 180.0)
         angleradiansY = newCamHpr.getY() * (math.pi / 180.0)
         base.camera.setPos( dist*math.sin(angleradiansX)*math.cos(angleradiansY),
                            -dist*math.cos(angleradiansX)*math.cos(angleradiansY),
                            -dist*math.sin(angleradiansY) )

Добавлено (12.02.2009, 04:07)
---------------------------------------------
не совсем понимаю как работать с теми циклами которые возвращают значение например :

taskMgr.add(self.move,"moveTask")
def move(self,task):
......................
return Task.cont

я не могу передать внутрь какую-нибудь еще переменную все попытки дописать переменные туда типа:

taskMgr.add(self.move,"moveTask",self.camDist)
def move(self,task,dist):
выводят ошибку move() takes exactly 3 arguments (2 given)

 
ninthДата: Четверг, 12.02.2009, 05:23 | Сообщение # 23
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
1. Насчёт тормозов - х.з. не замечал, много объектов грузится? Может память не успевает освободиться?

2. Ну, я пытался сделать относительно универсальную функцию, потому и были нюансы smile

3. Ты не совсем правильно понял. Во-первых def это не циклы, а подпрограммы (циклы по-другому рисуются). Во-вторых - в данном конкретном случае подпрограмма должна иметь строго определённый список параметров, т.к. сама подпрограмма передаётся в качестве аргумента в диспетчер задач панды и это никак не связано с тем, возвращает она значение или нет. В нашем случае она должна возвращать значение, которое даёт понять менеджеру задач что делать дальше с этой задачей - остановить, продолжить, подождать - статья по менеджеру есть в каталоге.

 
ninthДата: Понедельник, 16.02.2009, 18:48 | Сообщение # 24
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Так же проверять камеру на коллизии со стенами как и игрока.
 
3dmaxДата: Понедельник, 16.02.2009, 19:32 | Сообщение # 25
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Скоро буду над этим работать. Щас перец уже бегает по холмистой местности. Но вот с колизиями деревьев случаются баги. cry Вот займусь.
 
3dmaxДата: Вторник, 17.02.2009, 01:02 | Сообщение # 26
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Кокой функцией можно определить длину расстояние от персонажа до места колизии камеры с любой поверхностью ? если не понятно на рисунке пояснил.
Прикрепления: 9817109.jpg (17.0 Kb)
 
ninthДата: Вторник, 17.02.2009, 01:16 | Сообщение # 27
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Это длина вектора, который является разницей векторов - точки коллизии и точки куда смотрит камера
v=v2-v1
dist=v.length()

так же можно использовать lengthsquared() - квадрат расстояния - вычисляется быстрее чем первая функция, т.к. не требуется извлечения корня.

 
3dmaxДата: Вторник, 17.02.2009, 02:39 | Сообщение # 28
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
хм. А как получить координаты точки колизии ?
 
ninthДата: Вторник, 17.02.2009, 08:33 | Сообщение # 29
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
getEntry(i).getSurfacePoint(nodePath)

getEntry - метод созданного ранее CollisionHandlerQueue

Смотри в демке с пинательными кубиками - там по щелчку получается точка пересечения collisionRay с поверхностью кубика

 
Dimon3DДата: Вторник, 17.02.2009, 08:39 | Сообщение # 30
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
Если для одного и того же CollisionHandlerQueue определены несколько лучей, то при выполнении цикла:
for i in range(self.nodeGroundHandler.getNumEntries()):
entry = self.nodeGroundHandler.getEntry(i)
point = entry.getSurfacePoint(render)

определится ближайшая точка ???

Добавлено (17.02.2009, 08:39)
---------------------------------------------
или надо сортировать ?

 
Форум Panda3D - по русски » Panda3D » Примеры кода » Управление камерой
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: