VTK(3)—— "display"坐标 转 "world"坐标

需求:通过<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];
        
    }

猜你喜欢

转载自blog.csdn.net/Jecklin_online/article/details/82260396
今日推荐