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

需求:通过对象的GetEventPosition()获取到的事件位置如何转化成world坐标系下的值

 


一、本文包含的函数获取到的位置所在坐标系

 

1. display 坐标系:

vtkRenderWindowInteractor 中的 GetEventPosition() 获取的位置。

vtkRenderWindowInteractor 中的 GetLastEventPosition() 获取的位置。

2. world 坐标系:

renderer->GetActiveCamera()->GetPosition() 即获取当前相机位置。

 

二、display 坐标系坐标 转 world 坐标系坐标方法

(以下使用 eventPosition 做例子,eventWorldPoint[4]为转换后的坐标点)

        vtkRenderWindowInteractor *interactor = this->GetInteractor();
        vtkRenderer               *render     = this->GetCurrentRenderer();
        int eventDisplayPosition[3];
        interactor->GetEventPosition(eventDisplayPosition);
        render->SetDisplayPoint((double)eventDisplayPosition[0], (double)eventDisplayPosition[1], (double)eventDisplayPosition[2]);
        render->DisplayToWorld();
        double  eventWorldPoint[4];
        render->GetWorldPoint(eventWorldPoint);

 

三、额外内容

当前相机的坐标位置与鼠标最后点击事件的坐标位置相等
(验证方法:相机获得的位置是在 world 坐标系下的,鼠标最后点击事件位置是在 display坐标系下的,可以通过把 display 坐标转化为 world 坐标进行比对)

 

四、源码如下

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class myInteractorStyle:public vtkInteractorStyleTrackballCamera
{
public:
    static myInteractorStyle* New()
    {
        return new myInteractorStyle;
    }
    void OnLeftButtonDown()
    {
        vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
        this->ShowStation();           
    }

public:
    void    ShowStation()
    {
        vtkRenderWindowInteractor *interactor = this->GetInteractor();
        vtkRenderer               *render     = this->GetCurrentRenderer();
        
        
        //获得 event 的 world 坐标
        int eventDisplayPosition[3];

        interactor->GetEventPosition(eventDisplayPosition);
        
        qDebug() << "eventDisplayPosition: ";
        for (int i = 0; i < 3; ++i)
        {
            qDebug() << QString::number(eventDisplayPosition[i]);
        }
        
        render->SetDisplayPoint((double)eventDisplayPosition[0], (double)eventDisplayPosition[1], (double)eventDisplayPosition[2]);
        render->DisplayToWorld();
    
        double  eventWorldPoint[4];
        render->GetWorldPoint(eventWorldPoint);
        
        qDebug() << "eventWorldPoint: ";
        for (int i = 0; i < 4; ++i)
        {
            qDebug() << QString::number(eventWorldPoint[i]);
        }
        
    
        //获得 last event的 world 坐标
        int     LastEventDisplayPosition[3];
        interactor->GetLastEventPosition(LastEventDisplayPosition);
        
        qDebug() << "LastEventDisplayPosition: ";
        for (int i = 0; i < 3; ++i)
        {
            qDebug() << QString::number(LastEventDisplayPosition[i]);
        }
        
        
        render->SetDisplayPoint((double)LastEventDisplayPosition[0], (double)LastEventDisplayPosition[1], (double)LastEventDisplayPosition[2]);
        render->DisplayToWorld();
        
        double  lastEventWorldPoint[4];
        render->GetWorldPoint(lastEventWorldPoint);
        
        qDebug() << "lastEventWorldPoint: ";
        for (int i = 0; i < 3; ++i)
        {
            qDebug() << QString::number(lastEventWorldPoint[i]);
        }

        vtkCamera *camera           = this->GetCurrentRenderer()->GetActiveCamera();
        double    *cameraPosition   = camera->GetPosition();  
        
        qDebug() << "cameraPosition: ";
        for (int i = 0; i < 3; ++i)
        {
            qDebug() << QString::number(cameraPosition[i]);
        }
        
        
    }
};

int main(int, char *[])
{
    //***创建一个正方体的基本信息
    vtkSmartPointer                      cube        = vtkSmartPointer::New();
    vtkSmartPointer                  mapper      = vtkSmartPointer::New();
    vtkSmartPointer                           actor       = vtkSmartPointer::New();
    vtkSmartPointer                        render      = vtkSmartPointer::New();  
    vtkSmartPointer                    renwindow   = vtkSmartPointer::New();    
    vtkSmartPointer          interactor  = vtkSmartPointer::New();
    vtkSmartPointer                  style       = vtkSmartPointer::New();
    
    
    cube->Update();
    mapper->SetInputConnection(cube->GetOutputPort()); 
    actor->SetMapper(mapper);
    render->AddActor(actor);
    renwindow->AddRenderer(render);
    interactor->SetRenderWindow(renwindow);
    interactor->SetInteractorStyle(style);
    renwindow->SetInteractor(interactor);
    interactor->Initialize();
    interactor->Start();
   
    return EXIT_SUCCESS;
    
}


 

 

你可能感兴趣的:(VTK)