[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Общие вопросы » Объекты просвечиваются сквозь стены
Объекты просвечиваются сквозь стены
ФаерДата: Пятница, 02.09.2016, 19:46 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 39
Награды: 1
Репутация: 2
Статус: Offline
Здорово, джентльмены.

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

На скрине из стены торчит кусок деревянного ящика, который стоит за стеной.
Прикрепления: 5380492.jpg(154Kb)


Сообщение отредактировал Фаер - Пятница, 02.09.2016, 19:47
 
serg-kkzДата: Суббота, 03.09.2016, 19:54 | Сообщение # 2
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Кстати  в новых версиях движка появились отсечения порталов и окружения, в демо примерах в папке culling. Правильнее будет их использовать.

ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 03.09.2016, 19:54
 
ФаерДата: Суббота, 03.09.2016, 20:21 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 39
Награды: 1
Репутация: 2
Статус: Offline
serg-kkz, а-а, вот culling я и видел. Посмотрю на досуге.
Я только так и не понял, Occluder'ы можно срисовывать с видимой геометрии или нет?

Добавлено (03.09.2016, 20:21)
---------------------------------------------
И есть ещё вопрос на будущее: если у меня есть модели, привязанные к лодам, как мне сгруппировать их через RigidBodyCombiner?

 
serg-kkzДата: Суббота, 03.09.2016, 20:29 | Сообщение # 4
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: 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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: 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
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Был у меня ещё подобный прикол на старой встроенной интеловской карточке. Не хватало ей разрешающей способности буффера глубины. Попробуй поиграть с near / far камеры. Особенно near
 
serg-kkzДата: Понедельник, 05.09.2016, 10:06 | Сообщение # 7
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: 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()

До фикса:


После фикса:

Прикрепления: demo.zip(2Kb) · 4797997.png(2017Kb) · 5985936.png(2013Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 05.09.2016, 10:12
 
ФаерДата: Понедельник, 05.09.2016, 21:39 | Сообщение # 8
Сержант
Группа: Пользователи
Сообщений: 39
Награды: 1
Репутация: 2
Статус: Offline
serg-kkz, о, помогло! :like: Правда, я немного по-другому сделал, но суть в setBin(). Спасибо.

Осталось разобраться, почему анимация периодически проигрывается не до конца. В параллелях ведь все интервалы доигрываются до конца, а не так, что самый короткий интервал закончился и все остальные остановились на середине?
 
serg-kkzДата: Понедельник, 05.09.2016, 23:14 | Сообщение # 9
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Цитата Фаер ()
serg-kkz, о, помогло! :like: Правда, я немного по-другому сделал, но суть в setBin(). Спасибо.

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

Про анимацию подробней изложи, и код выложи.


ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 05.09.2016, 23:15
 
ФаерДата: Вторник, 06.09.2016, 16:12 | Сообщение # 10
Сержант
Группа: Пользователи
Сообщений: 39
Награды: 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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Только одно не понятно как ты прерываешь проигрывание анимации... или останавливаешь параллель.

Бегло могу сказать что ты запускаешь несколько событий на самотек и хочешь что они были синхронно в некой степени друг другу.
Первое что нужно сделать привязаться к интервалу перемещения. Где должно быть четко определенно начало, текущие положение(что то вроде процента выполнения) и конец, кадры анимации следует привязать через соотношение к текущему положению интервала перемещения. Также камеру привязать к началу и концу или через другой коэффициент соотношения для того чтоб добиться нужно угла поворота. В данный момент у тебя она крутиться без ограничения, пока выполняется задача.


ООП  -  

Сообщение отредактировал serg-kkz - Среда, 07.09.2016, 00:31
 
ФаерДата: Четверг, 08.09.2016, 21:26 | Сообщение # 12
Сержант
Группа: Пользователи
Сообщений: 39
Награды: 1
Репутация: 2
Статус: Offline
serg-kkz, немного сложнее, чем я ожидал. smile  Но всё-ё, я нашёл проблему.

Дело было так. В функции передвижения участвует шесть анимаций: одна стояния, четыре ходьбы (в разные стороны) и одна - бег. Переключаются между собой они, разумеется, через Lerp'ы. Так вот, получалось, что, когда игрок останавливался и нажимал прыжок, запускались параллельно два Lerp'а: один - переход между ходьбой и стоянием, и второй - переход от текущей анимации к прыжку. И вот, первый Lerp перетягивал ControlEffect на другую анимацию(обычно, стояния), забивая прыжок. Анимация, как оказалось, не останавливалась, а проигрывалась, но со слабым ControlEffect. Поэтому анимация прыжка и срабатывала через раз: первый Lerp временами заканчивался до того, как начинался второй, и ControlEffect полностью отдавался прыжку.

В общем, я установил отслеживание последнего Lerp'а переходов между анимациями ходьбы и сделал остановку его перед запуском Lerp'а перехода с текущей анимации на прыжок. Теперь всё работает безотказно.


Сообщение отредактировал Фаер - Четверг, 08.09.2016, 21:27
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Объекты просвечиваются сквозь стены
Страница 1 из 11
Поиск: