Я хотел бы повернуть или переместить объект, похожий на цилиндр, нажав на нем левую кнопку мыши.
Чтобы повернуть, я хотел бы нажать на кончик и заставить его вращаться вокруг другого кончика, когда я перемещаю мышь (левая кнопка все еще нажата).
Для перевода я хотел бы нажать клавишу «t» и переместить объект в соответствии с планом камеры.< /p>
Поворот работает, но не плавно, потому что как только мышь покидает объект, ориентация больше не обновляется.
Кажется, что перевод не работает должным образом, когда камера перемещается .
Когда нажата левая кнопка мыши, я сохраняю объект, на который нажимаю.
Когда я нажимаю клавишу, я также сохраняю клавишу, чтобы узнать клавишу «t». нажимается для перевода.
В функции MouseMove
def MouseMove(self, obj, event):
if self.DetectMouseMove:
self.OnMouseMove()
clickPos = self.GetInteractor().GetEventPosition()
pickerActor = vtk.vtkPropPicker()
pickerActor.PickProp(clickPos[0], clickPos[1], self.GetDefaultRenderer())
# get the new
NewPickedActor = pickerActor.GetAssembly()
#
if NewPickedActor:
if NewPickedActor in self.parent.Electrode_aAssemblys:
if self.key =='t':
elec = self.elec
Aelectrode = self.parent.Electrode_aAssemblys[elec]
electrode = self.parent.ElectrodeList[elec]
# click3D = np.asarray(self.parent.ren.GetWorldPoint())
click3D = np.asarray(pickerActor.GetPickPosition())
a = click3D - self.prevpos
if np.linalg.norm(a)
Вот полный код, который у меня есть на данный момент:
from PyQt6.QtGui import *
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
import numpy as np
import sys
import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class Mesh_sEEGElectrodeView(QMainWindow):
def __init__(self,parent=None):
super(Mesh_sEEGElectrodeView, self).__init__()
self.parent = parent
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.mainHBOX_param_scene = QVBoxLayout()
self.MV_plot = VTK_sEEGElectrodeView(self)
self.mainHBOX_param_scene.addWidget(self.MV_plot)
self.centralWidget.setLayout(self.mainHBOX_param_scene)
self.ElectrodeList = []
self.ElectrodeList.append(Electrode())
self.Display_parcellisation()
def Display_parcellisation(self):
self.MV_plot.draw_Mesh(self.ElectrodeList)
class Electrode():
def __init__(self, NumOfSensors=15, Diameter=0.8, Resolution=36):
self.NOS = NumOfSensors
self.Diameter = Diameter
self.Resolution = Resolution
def Create(self):
SensorLength = 2
mm = 1
self.cylActors = []
# design tube holding electrodes
tube = vtk.vtkCylinderSource()
tube.SetHeight(((self.NOS * 2 + (self.NOS - 1) * 1.5) - 0.1) * mm)
tube.SetCenter(0, (self.NOS * 2 + (self.NOS - 1) * 1.5) * mm / 2, 0)
tube.SetRadius((self.Diameter - 0.05) * mm / 2)
tube.SetResolution(self.Resolution)
tubePoly = tube.GetOutput()
# tubePoly.Update()
tube.Update()
TubeMT = vtk.vtkPolyDataMapper()
TubeMT.SetInputData(tubePoly)
TubeMT.Update()
# TubeMT.GlobalImmediateModeRenderingOn()
TubeA = vtk.vtkLODActor()
TubeA.VisibilityOn()
TubeA.SetMapper(TubeMT)
TubeA.GetProperty().SetColor(1, 0, 0)
self.cylActors.append(TubeA)
# create the Electrodes
for i in range(self.NOS):
# create cylinder
cyl = vtk.vtkCylinderSource()
cyl.SetHeight(SensorLength * mm)
cyl.SetCenter(0, (1 + i * (2 + 1.5)) * mm, 0)
cyl.SetRadius(self.Diameter / 2 * mm)
cyl.SetResolution(self.Resolution)
# cylPoly = cyl.GetOutput()
cyl.Update()
# cylPoly.Update()
# create mappers and actors for the sensors
cMT = vtk.vtkPolyDataMapper()
cMT.SetInputData(cyl.GetOutput())
# cMT.GlobalImmediateModeRenderingOn()
cA = vtk.vtkActor()
cA.VisibilityOn()
cA.SetMapper(cMT)
if i == 0:
cA.GetProperty().SetColor(0, 1, 0)
else:
cA.GetProperty().SetColor(0, 0, 1)
# if i == self.NOS-1:
# cA.SetPickable(True)
# else:
# cA.SetPickable(True)
self.cylActors.append(cA)
return self.cylActors
class VTK_sEEGElectrodeView(QMainWindow):
def __init__(self, parent=None):
super(VTK_sEEGElectrodeView, self).__init__(parent)
self.parent=parent
self.frame = QFrame()
self.vl = QVBoxLayout()
self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
self.vl.addWidget(self.vtkWidget)
self.ren = vtk.vtkRenderer()
self.ren.SetBackground(.1, .1, .1)
# self.ren.SetUseDepthPeeling(1)
# self.ren.SetMaximumNumberOfPeels(100)
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
# style = vtk.vtkInteractorStyleTrackballCamera()
self.style1 = MouseInteractorHighLightActor_sEEGElectrode(self)
self.style1.SetDefaultRenderer(self.ren)
self.iren.SetInteractorStyle(self.style1)
self.ren.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.Initialize()
self.iren.Start()
def draw_Mesh(self,ElectrodeList,smoothing =0):
self.ren.RemoveAllViewProps()
self.ElectrodeList = ElectrodeList
self.Electrode_a = []
self.Electrode_aAssemblys = []
for i in range(len(self.ElectrodeList)):
self.Electrode_a.append(self.ElectrodeList.Create())
actAssembly = vtk.vtkAssembly()
for j in range(self.ElectrodeList.NOS + 1):
actAssembly.AddPart(self.Electrode_a[j])
actAssembly.id = i
n = [0, 50, 0]
actAssembly.SetOrientation(np.degrees(np.arctan(n[2] / (n[1] + 0.000001))), 0,
np.degrees(np.arctan(n[0] / (n[1] + 0.000001))))
actAssembly.SetPickable(True)
self.Electrode_aAssemblys.append(actAssembly)
self.ren.AddActor(self.Electrode_aAssemblys)
for i in range(10):
source = vtk.vtkSphereSource()
source.SetCenter(np.random.randint(-50,50,1),np.random.randint(-50,50,1),np.random.randint(-50,50,1))
source.SetRadius(3.0)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
self.ren.AddActor(actor)
self.ren.ResetCamera()
self.iren.ReInitialize()
self.iren.GetRenderWindow().Render()
self.ren.Render()
class MouseInteractorHighLightActor_sEEGElectrode(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self, parent=None):
self.parent = parent
self.AddObserver("KeyPressEvent",self.keyPressEvent)
self.AddObserver("KeyReleaseEvent",self.KeyReleaseEvent)
self.AddObserver('LeftButtonPressEvent',self.MouseMoveOK)
self.AddObserver('LeftButtonReleaseEvent',self.MouseMoveNot)
self.AddObserver("MouseMoveEvent",self.MouseMove)
self.DetectMouseMove = 0
self.prevpos= [0,0]
self.elec = 0
self.key = None
def keyPressEvent(self,obj,event):
self.key = obj.GetInteractor().GetKeySym()
def KeyReleaseEvent(self,obj,event):
self.key = None
def MouseMove(self, obj, event):
if self.DetectMouseMove:
self.OnMouseMove()
clickPos = self.GetInteractor().GetEventPosition()
pickerActor = vtk.vtkPropPicker()
pickerActor.PickProp(clickPos[0], clickPos[1], self.GetDefaultRenderer())
# get the new
NewPickedActor = pickerActor.GetAssembly()
#
if NewPickedActor:
if NewPickedActor in self.parent.Electrode_aAssemblys:
if self.key =='t':
elec = self.elec
Aelectrode = self.parent.Electrode_aAssemblys[elec]
electrode = self.parent.ElectrodeList[elec]
# click3D = np.asarray(self.parent.ren.GetWorldPoint())
click3D = np.asarray(pickerActor.GetPickPosition())
a = click3D - self.prevpos
if np.linalg.norm(a)
Подробнее здесь: https://stackoverflow.com/questions/787 ... nvironment