- 相机回到原点
通过单击右键使相机回到初始的平面图位置。
style.RightButtonPressEvt += new vtkObject.vtkObjectEventHandler(OriginMoveEvt);
void OriginMoveEvt(vtkObject sender, vtkObjectEventArgs e)
{
m_camera.SetPosition(0, 0, 0);
m_camera.SetFocalPoint(0, 0, -1); //z-
m_camera.SetViewUp(-1, 0, 0);
//设置窗口中点 只有平移后回到原点需要该函数 其余视角转换可不需要
m_camera.SetWindowCenter(0, 0);
render1.ResetCamera();
renWin.Render();
}
- 左键拖动平移物体
下面采用移动窗口中点的方法来实现。分为三个部分,点击左键、鼠标移动和放开左键。
style.LeftButtonPressEvt += new vtkObject.vtkObjectEventHandler(interactor_LeftButtonDownEvt);
style.LeftButtonReleaseEvt += new vtkObject.vtkObjectEventHandler(interactor_LeftButtonRealeaseEvt);
style.MouseMoveEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseMoveEvt);
点击左键需要记录当前的鼠标位置、窗口大小和窗口中点位置。还设置了一个布尔数来判断左键是否正在按下,避免其他时候运行该事件。(此处最开始把记录窗口位置放在鼠标移动事件里了,结果出现了类似于加速运动的效果,原因是随鼠标移动窗口中点在移动,形成了一种二次方程)
public int[] clickPos;
public int[] clickPos2;
public int[] winSize;
bool isDown;
public double[] curWindowCenter;
void interactor_LeftButtonDownEvt(vtkObject sender, vtkObjectEventArgs e)
{
clickPos = renWin.GetInteractor().GetEventPosition();
winSize = renWin.GetSize();
isDown = true;
curWindowCenter = m_camera.GetWindowCenter();
return; //退出 也可不用加
}
鼠标移动。窗口中心范围是[-1,1],因此归一化之后需要×2才能随鼠标移动。
void interactor_MouseMoveEvt(vtkObject sender, vtkObjectEventArgs e)
{
if (isDown == true)
{
clickPos2 = renWin.GetInteractor().GetEventPosition();
//归一化 缺了数据转换的话全是0
double[] disMove = new double[] { Convert.ToDouble(clickPos2[0] - clickPos[0]) / winSize[0], Convert.ToDouble(clickPos2[1] - clickPos[1]) / winSize[1] };
m_camera.SetWindowCenter(curWindowCenter[0] - disMove[0]*2, curWindowCenter[1] - disMove[1]*2);
renWin.Render();
}
}
左键放开,将isDown归0。
void interactor_LeftButtonRealeaseEvt(vtkObject sender, vtkObjectEventArgs e)
{
isDown = false;
}