需求:通过<vtkRenderWindowInteractor>对象的GetEventPosition()获取到的事件位置如何转化成world坐标系下的值
一、位置转化
//注:以下源码为伪代码,需要根据情况进行添加
//***下面开始是获得坐标的方式
//获得event 的world坐标
int dis_int[3];
interactor->GetEventPosition(dis_int);
double dis_double[3] = {dis_int[0],dis_int[1],dis_int[2]};
render->SetDisplayPoint(dis_double);
render->DisplayToWorld();
double event_world[4];
render->GetWorldPoint(event_world);
//获得last event 的 world 坐标
int dis_int2[3];
interactor->GetLastEventPosition(dis_int2);
double dis_double2[3] = {dis_int2[0],dis_int2[1],dis_int2[2]};
render->SetDisplayPoint(dis_double2);
render->DisplayToWorld();
double lastEvent_world[4];
render->GetWorldPoint(lastEvent_world);
//获得差值
double index[3];
for (int i = 0; i < 3; ++i)
{
index[i] = lastEvent_world[i] - event_world[i];
}
二、由此产生的联想:当我们使用相机变化来响应事件的时候,
事件坐标的改变与相机发生改变所获取的值是否相等?
也即:
①事件位置的差值
interactor->GetLastEventPosition();
interactor->GetEventPosition();
②相机变化前后位置的差值
camera->GetPosition();
经验证:两个值相等,上代码:
//以下为伪代码,需要根据情况进行添加
//大环境是一个window两个view
/// *********** 相机差值 ****************** ///
vtkCamera *leftCamera = m_leftRender->GetActiveCamera();
vtkCamera *rightCamera = m_rightRender->GetActiveCamera();
vtkCamera *camera = this->GetCurrentRenderer()->GetActiveCamera();
//当前相机状态
double *act_position = camera->GetPosition();
//上次左相机
double *left_position = this->m_leftCamera->GetPosition();
//上次右相机
double *right_position = this->m_rightCamera->GetPosition();
//要设置的值
double position[3];
for (int i = 0; i < 3; ++i)
{
position[i] = act_position[i] - left_position[i] + right_position[i];
}