def __init__(self, args, parent=None): super().__init__(parent) ############################################################################## # UI初期化処理 self.ui = MainWindowUi.loader(os.path.join(os.getcwd(), 'ui/main.ui')) self.setWindowTitle('self.viewer test') self.setCentralWidget(self.ui.widgets) self.view = Qt3DExtras.Qt3DWindow() self.view.defaultFrameGraph().setClearColor(QtGui.QColor(0, 0, 0)) self.container = QWidget.createWindowContainer(self.view) screen_size = self.view.screen().size() self.ui.viewer.addWidget(self.container) self.container.setMinimumSize(QtCore.QSize(400, 600)) self.container.setMaximumSize(screen_size) # QSize screenSize = self.view -> screen() -> size(); # container -> setMinimumSize(QSize(200, 100)); # container -> setMaximumSize(screenSize); # vLayout -> setAlignment(Qt: : AlignTop); # hLayout -> addWidget(container, 1); # hLayout -> addLayout(vLayout); # input_aspect = Qt3DInput.QInputAspect() # self.view.registerAspect(input_aspect) # root entity self.root_entity: Qt3DCore.QEntity = Qt3DCore.QEntity() # draw grid and axis """ self.x_axis: Qt3DRender.QGeometry = Qt3DRender.QGeometry(self.root_entity) x_axis_pos: QtCore.QByteArray = QtCore.QByteArray() x_axis_pos.append(0) x_axis_pos.append(0) x_axis_pos.append(0) x_axis_pos.append(10) x_axis_pos.append(0) x_axis_pos.append(0) x_axis_buf: Qt3DRender.QBuffer = Qt3DRender.QBuffer(self.x_axis) x_axis_buf.setData(x_axis_pos) x_axis_attr: Qt3DRender.QAttribute = Qt3DRender.QAttribute(self.x_axis) x_axis_attr.setVertexBaseType(Qt3DRender.QAttribute.Float) x_axis_attr.setVertexSize(3) x_axis_attr.setAttributeType(Qt3DRender.QAttribute.VertexAttribute) x_axis_attr.setBuffer(x_axis_buf) x_axis_attr.setByteStride(3) x_axis_attr.setCount(2) self.x_axis.addAttribute(x_axis_attr) """ test_mtl = Qt3DExtras.QTextureMaterial(self.root_entity) self.test = Qt3DCore.QEntity(self.root_entity) self.test_mesh: Qt3DExtras.QTorusMesh = Qt3DExtras.QTorusMesh() self.test_mesh.setRadius(5) self.test_mesh.setMinorRadius(1) self.test_mesh.setRings(100) self.test_mesh.setSlices(20) self.test_tr = Qt3DCore.QTransform() self.test_tr.setTranslation(QtGui.QVector3D(0, 0, 0)) # test_tr.setScale3D() self.test.addComponent(self.test_mesh) self.test.addComponent(self.test_tr) self.test.addComponent(self.test_mtl) # camera entity camera_entity: Qt3DRender.QCamera = self.view.camera() camera_entity.lens().setPerspectiveProjection(45.0, 16.0 / 9.0, 0.1, 1000.0) camera_entity.setPosition(QtGui.QVector3D(0, 0, 20.0)) camera_entity.setUpVector(QtGui.QVector3D(0, 1, 0)) camera_entity.setViewCenter(QtGui.QVector3D(0, 0, 0)) light_entity = Qt3DCore.QEntity(self.root_entity) light = Qt3DRender.QPointLight(light_entity) light.setColor("white") light.setIntensity(1) light_entity.addComponent(light) light_transform = Qt3DCore.QTransform(light_entity) light_transform.setTranslation(camera_entity.position()) light_entity.addComponent(light_transform) # for camera controls cam_controller = Qt3DExtras.QFirstPersonCameraController(self.root_entity) cam_controller.setCamera(camera_entity) # set root object of the scene self.view.setRootEntity(self.root_entity)
def __init__(self, parent): super().__init__() self.root_entity = Qt3DCore.QEntity() # Make additional entities for the gnomon and instrument components self.combined_component_axes_entity = Qt3DCore.QEntity( self.root_entity) self.component_root_entity = Qt3DCore.QEntity( self.combined_component_axes_entity) self.axes_root_entity = Qt3DCore.QEntity( self.combined_component_axes_entity) self.gnomon_root_entity = Qt3DCore.QEntity(self.root_entity) # Create the 3DWindow and place it in a widget with a layout lay = QVBoxLayout(self) self.view = InstrumentZooming3DWindow(self.component_root_entity) self.view.defaultFrameGraph().setClearColor(QColor("lightgrey")) self.view.setRootEntity(self.root_entity) container = QWidget.createWindowContainer(self.view) lay.addWidget(container) # Set the properties of the instrument camera controller camera_entity = self.view.camera() cam_controller = Qt3DExtras.QFirstPersonCameraController( self.root_entity) cam_controller.setLinearSpeed(20) cam_controller.setCamera(camera_entity) # Enable the camera to see a large distance by giving it a small nearView and large farView self.view.camera().lens().setPerspectiveProjection( 45, 16 / 9, 0.01, 1000) # Set the camera view centre as the origin and position the camera so that it looks down at the initial sample self.view.camera().setPosition(QVector3D(6, 8, 30)) self.view.camera().setViewCenter(QVector3D(0, 0, 0)) # Make sure that the size of the gnomon stays the same when the 3D view is resized self.view.heightChanged.connect(self.update_gnomon_size) self.view.widthChanged.connect(self.update_gnomon_size) # Keep a reference to the gnomon viewport so that it can be resized to preserve the original size of the gnomon self.gnomon_viewport = None # Choose a fixed height and width for the gnomon so that this can be preserved when the 3D view is resized self.gnomon_height = self.gnomon_width = 140 # Create the gnomon resources self.gnomon = Gnomon(self.gnomon_root_entity, self.view.camera()) # Create the axes lines objects InstrumentViewAxes(self.axes_root_entity, self.view.camera().farPlane()) # Dictionary of components and transformations so that we can delete them later self.component_entities: Dict[str, EntityCollection] = {} self.transformations = {} # Create layers in order to allow one camera to only see the gnomon and one camera to only see the # components and axis lines self.create_layers() self.initialise_view() # Insert the beam cylinder last. This ensures that the semi-transparency works correctly. self.gnomon.setup_beam_cylinder() # Move the gnomon when the camera view changes self.view.camera().viewVectorChanged.connect(self.gnomon.update_gnomon)