Управление камерой
|
|
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
| Вот теперь думаю куда ее впихнуть
|
|
| |
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 . Кароч я не знаю Заранее извиняюсь за ламерские вопросы .
Сообщение отредактировал 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
| Да ты был прав камера тоже поворачивается, надо что-то придумать Добавлено (12.02.2009, 02:54) --------------------------------------------- А что за ерунда, Когда только что запустил SPE после окончания запуска скрипта окно графа (ну там де сама игра) быстро закрывается. А если раз 6 запускал скрипт то вся эта ерунда закрывается долго как будто тормозит. Если перезапускаю SPE все нормально но после нескольких запусков скрипта тоже самое Добавлено (12.02.2009, 03:32) --------------------------------------------- Камеру сделал вот просто прибавляю это смещение там где надо и все 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. Ну, я пытался сделать относительно универсальную функцию, потому и были нюансы 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
| Скоро буду над этим работать. Щас перец уже бегает по холмистой местности. Но вот с колизиями деревьев случаются баги. Вот займусь.
|
|
| |
3dmax | Дата: Вторник, 17.02.2009, 01:02 | Сообщение # 26 |
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
| Кокой функцией можно определить длину расстояние от персонажа до места колизии камеры с любой поверхностью ? если не понятно на рисунке пояснил.
|
|
| |
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) --------------------------------------------- или надо сортировать ?
|
|
| |