Окно Qt3D и два слоя, окна просмотра, фильтры слоев и т. Д. - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу закодировать Qt3DWindow, где у меня будет два QLayer -s, QLayerFilter -s, QViewport -s и т. Д. Мне это нужно, потому что я хочу визуализировать объекты в QViewport 1 обычным образом, а объекты в QViewport 2 всегда видны (даже если они на самом деле находятся за объектами 1).

Вот мой код:

class Window(Qt3DExtras.Qt3DWindow):
    def __init__(self):
        super().__init__()
        self.root_entity = Qt3DCore.QEntity()
        self.entity_1 = Qt3DCore.QEntity(self.root_entity)
        self.entity_2 = Qt3DCore.QEntity(self.root_entity)
        self.setRootEntity(self.root_entity)

        # some other code

        self.surselector = Qt3DRender.QRenderSurfaceSelector()
        self.surselector.setSurface(self)

        # Viewport 1
        self.viewport_1 = Qt3DRender.QViewport(self.surselector)
        self.layerfilter_1 = Qt3DRender.QLayerFilter(self.viewport_1)
        self.layer_1 = Qt3DRender.QLayer(self.entity_1)
        self.entity_1.addComponent(self.layer_1)
        self.layer_1.setRecursive(True)
        self.layerfilter_1.addLayer(self.layer_1)
        self.cameraSelector_1 = Qt3DRender.QCameraSelector(self.layerfilter_1)
        self.clearBuffers_1 = Qt3DRender.QClearBuffers(self.cameraSelector_1)
        self.cameraSelector_1.setCamera(self.camera())
        self.clearBuffers_1.setBuffers(Qt3DRender.QClearBuffers.AllBuffers)

        # Viewport 2
        self.viewport_2 = Qt3DRender.QViewport(self.surselector)
        self.layerfilter_2 = Qt3DRender.QLayerFilter(self.viewport_2)
        self.layer_2 = Qt3DRender.QLayer(self.entity_2)
        self.entity_2.addComponent(self.layer_2)
        self.layer_2.setRecursive(True)
        self.layerfilter_2.addLayer(self.layer_2)
        self.cameraSelector_2 = Qt3DRender.QCameraSelector(self.layerfilter_2)
        self.clearBuffers_2 = Qt3DRender.QClearBuffers(self.cameraSelector_2)
        self.cameraSelector_2.setCamera(self.camera())

        # The line below causes that no entity appears
        self.clearBuffers_2.setBuffers(Qt3DRender.QClearBuffers.AllBuffers)

        # The code below is what make viewport 2 / layer 2 / layerfilter 2 different from view port 1 / etc.
        self.rendstate_2 = Qt3DRender.QRenderStateSet(self.clearBuffers_2)
        self.rendstate_2.setParent(self.clearBuffers_2)
        depth = Qt3DRender.QDepthTest()
        depth.setDepthFunction(Qt3DRender.QDepthTest.LessOrEqual)
        self.rendstate_2.addRenderState(depth)

        self.setActiveFrameGraph(self.surselector)

1 Ответ

0 голосов
/ 04 октября 2018

Если я правильно понимаю, вы хотите, чтобы оба видовых экрана были нарисованы друг над другом (т.е. не в левой и правой половине), тогда как первый рисует все нормальные объекты, а второй - те, которые всегда видны.

Во-первых, я думаю, вам не нужны окна просмотра.Qt по умолчанию указывает на прямоугольник (0, 0, 1, 1), если его нет, но я не уверен в этом.

Фактическая проблема заключается в этой строке

self.clearBuffers_2.setBuffers(Qt3DRender.QClearBuffers.AllBuffers)

, потому что здесь вы удаляете цветбуфер, который удаляет все, что отображает первый видовой экран.Попробуйте установить его на Qt3DRender.QClearBuffers.DepthBuffer.Это только очищает ваш буфер глубины. Объекты второго видового экрана будут нарисованы поверх визуализации первого видового экрана.

...