Объекты просвечиваются сквозь стены
|
|
Фаер | Дата: Пятница, 02.09.2016, 19:46 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Награды: 1
Репутация: 2
Статус: Offline
| Здорово, джентльмены.
Возникла у меня проблема: после обновления движка объекты стали мерцать сквозь стены. По координатам насквозь они не проходят, на самом деле, даже расстояние от стен приличное. Но, чем дальше от стены отходишь, тем сильнее объекты с обратной стороны этой стены просвечиваются с мерцанием. Где-то что-то видел в документации по этому поводу, типа отключение рендеринга того, что за стеной, но сейчас найти не могу.
На скрине из стены торчит кусок деревянного ящика, который стоит за стеной.
Сообщение отредактировал Фаер - Пятница, 02.09.2016, 19:47 |
|
| |
serg-kkz | Дата: Суббота, 03.09.2016, 19:54 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Кстати в новых версиях движка появились отсечения порталов и окружения, в демо примерах в папке culling. Правильнее будет их использовать.
ООП -
Сообщение отредактировал serg-kkz - Суббота, 03.09.2016, 19:54 |
|
| |
Фаер | Дата: Суббота, 03.09.2016, 20:21 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Награды: 1
Репутация: 2
Статус: Offline
| serg-kkz, а-а, вот culling я и видел. Посмотрю на досуге. Я только так и не понял, Occluder'ы можно срисовывать с видимой геометрии или нет?Добавлено (03.09.2016, 20:21) --------------------------------------------- И есть ещё вопрос на будущее: если у меня есть модели, привязанные к лодам, как мне сгруппировать их через RigidBodyCombiner?
|
|
| |
serg-kkz | Дата: Суббота, 03.09.2016, 20:29 | Сообщение # 4 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Occluder'ы сам не юзал, думаю их поковырять как время будет. Еще чтоб избежать мерцания можно поиграть сортировкой.
Код model.setBin("fixed", 40) model.setDepthTest(False) model.setDepthWrite(False)
Дополнительно можно глянуть здесь https://www.panda3d.org/manual/index.php/How_to_Control_Render_Order
А вот про лоды нужно опять почесать голову самому или сходить на оф форум.
ООП -
Сообщение отредактировал serg-kkz - Суббота, 03.09.2016, 20:30 |
|
| |
serg-kkz | Дата: Понедельник, 05.09.2016, 02:02 | Сообщение # 5 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Пример с сортировкой:
Код box = loader.loadModel('box.egg') box.setBin('background', 1) box.setDepthWrite(0) box.reparentTo(render)
Должен работать для твоего ящика. По поводу culling, думаю доработать свой экспортер(Hatcher) чтоб он экспортировал зоны отсечения из блендера, но для этого мне нужно их принцип работы понять.
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 05.09.2016, 09:40 |
|
| |
ninth | Дата: Понедельник, 05.09.2016, 08:13 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Был у меня ещё подобный прикол на старой встроенной интеловской карточке. Не хватало ей разрешающей способности буффера глубины. Попробуй поиграть с near / far камеры. Особенно near
|
|
| |
serg-kkz | Дата: Понедельник, 05.09.2016, 10:06 | Сообщение # 7 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Я на ноуте повторил эту проблему.
Код тестовой сцены, ресурсы в прикрепленном архиве.
Код # -*- coding: utf-8 -*- import direct.directbase.DirectStart
# Загружаем текстуры для куба, черная и белая black = loader.loadTexture('black.png') white = loader.loadTexture('white.png')
# Черный бокс box_black = loader.loadModel('box.egg') box_black.reparentTo(render) box_black.setScale(10.5) # Черный бокс будет меньше белого. box_black.setTexture(black, 1)
# Фикс для черного, который в нутри белого. box_black.setBin('background', 1) box_black.setDepthWrite(False)
# Белый бокс box_white = loader.loadModel('box.egg') box_white.reparentTo(render) box_white.setScale(11) # Белый бокс будет больше черного. box_white.setTexture(white, 1)
base.run() До фикса:
После фикса:
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 05.09.2016, 10:12 |
|
| |
Фаер | Дата: Понедельник, 05.09.2016, 21:39 | Сообщение # 8 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Награды: 1
Репутация: 2
Статус: Offline
| serg-kkz, о, помогло! :like: Правда, я немного по-другому сделал, но суть в setBin(). Спасибо.
Осталось разобраться, почему анимация периодически проигрывается не до конца. В параллелях ведь все интервалы доигрываются до конца, а не так, что самый короткий интервал закончился и все остальные остановились на середине?
|
|
| |
serg-kkz | Дата: Понедельник, 05.09.2016, 23:14 | Сообщение # 9 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Цитата Фаер ( ) serg-kkz, о, помогло! :like: Правда, я немного по-другому сделал, но суть в setBin(). Спасибо. Но не стоит забывать что это костыль, проблемы могут возникнуть если ящик вынести на улицу или зайти в казарму Приоритетный способ юзать зоны отсечения и порталы. Или так заморочиться с пространственным порядком в цене.
Про анимацию подробней изложи, и код выложи.
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 05.09.2016, 23:15 |
|
| |
Фаер | Дата: Вторник, 06.09.2016, 16:12 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Награды: 1
Репутация: 2
Статус: Offline
| serg-kkz, не-не. Я вызвал setBin('background',0) на каждой "казарме", а те объекты, что внутри, вообще не трогал. Логически это, наверно, неправильно, но сквозь стены объекты мерцать перестали и при входе в помещение стоят они на своих законных местах. Так что не такой уж и костыль.
С анимацией такая ситуация: есть луч(взгляд игрока), который, когда пересекает контур уступа, появляется событие на 'space' - прыжок. Во время прыжка запускается параллель, в которой играют интервал перемещения игрока вверх-вперёд и интервал анимации ухватывания уступа руками. Плюс, отдельно запускается task опускания взгляда. Так вот, перемещение игрока срабатывает, как надо, опускание взгляда тоже, но анимация через раз останавливается на середине (то есть руками персонаж до уступа не достаёт).
Опускание взгляда сделал через задачу, потому что при повороте камеры через нулевой градус в интервале происходит разворот камеры по другой оси на 180 градусов. В общем, камера поворачивается не только вниз, но и назад, упираясь в лицо персонажа.
Коды:
Параллель:
Код self.jumpupm=self.hero.posInterval(0.4,Vec3(0,-35,50)) #перемещение игрока вверх и вперёд self.jumpuph=self.hero.actorInterval('Jump', playRate=4) #анимация ухватывания за уступ self.jumpup=Parallel(self.jumpupm,self.jumpuph,name='jumpuppar')
Метод прыжка:
Код def jump(self): self.ignore('space') self.taskMgr.remove('move') #блокировка ходьбы self.taskMgr.remove('movemouse') #блокировка поворота камеры мышью self.ignore('playercv-into-Vist') #игнорирование пересечения луча взгляда с уступом self.taskMgr.add(self.cameradown,'cameradown') LerpAnimInterval(self.hero,0.1,self.hero.getCurrentAnim(),'Jump').start() self.jumpup.start() #запуск параллели Опускание взгляда:
Код def cameradown(self,task): self.camera.setP(self.camera.getP()-3) if self.camera.getP()>-40: return task.cont else: return task.done
Добавлено (06.09.2016, 16:12) --------------------------------------------- Ага, брешу, не только анимация не доигрывается до конца. Я увеличил длительность и дальность интервала перемещения игрока вверх-вперёд и обнаружил, что вся параллель останавливается на середине. Через раз.
Сообщение отредактировал Фаер - Вторник, 06.09.2016, 16:12 |
|
| |
serg-kkz | Дата: Вторник, 06.09.2016, 23:11 | Сообщение # 11 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Только одно не понятно как ты прерываешь проигрывание анимации... или останавливаешь параллель.
Бегло могу сказать что ты запускаешь несколько событий на самотек и хочешь что они были синхронно в некой степени друг другу. Первое что нужно сделать привязаться к интервалу перемещения. Где должно быть четко определенно начало, текущие положение(что то вроде процента выполнения) и конец, кадры анимации следует привязать через соотношение к текущему положению интервала перемещения. Также камеру привязать к началу и концу или через другой коэффициент соотношения для того чтоб добиться нужно угла поворота. В данный момент у тебя она крутиться без ограничения, пока выполняется задача.
ООП -
Сообщение отредактировал serg-kkz - Среда, 07.09.2016, 00:31 |
|
| |
Фаер | Дата: Четверг, 08.09.2016, 21:26 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Награды: 1
Репутация: 2
Статус: Offline
| serg-kkz, немного сложнее, чем я ожидал. Но всё-ё, я нашёл проблему.
Дело было так. В функции передвижения участвует шесть анимаций: одна стояния, четыре ходьбы (в разные стороны) и одна - бег. Переключаются между собой они, разумеется, через Lerp'ы. Так вот, получалось, что, когда игрок останавливался и нажимал прыжок, запускались параллельно два Lerp'а: один - переход между ходьбой и стоянием, и второй - переход от текущей анимации к прыжку. И вот, первый Lerp перетягивал ControlEffect на другую анимацию(обычно, стояния), забивая прыжок. Анимация, как оказалось, не останавливалась, а проигрывалась, но со слабым ControlEffect. Поэтому анимация прыжка и срабатывала через раз: первый Lerp временами заканчивался до того, как начинался второй, и ControlEffect полностью отдавался прыжку.
В общем, я установил отслеживание последнего Lerp'а переходов между анимациями ходьбы и сделал остановку его перед запуском Lerp'а перехода с текущей анимации на прыжок. Теперь всё работает безотказно.
Сообщение отредактировал Фаер - Четверг, 08.09.2016, 21:27 |
|
| |