VTK(Visualization Toolkit)是一个开源的、跨平台的图形应用函数库,广泛应用于3D计算机图形学、图像处理和可视化等领域。在VTK中,获取鼠标位置处的世界坐标是一个常见的需求,尤其在交互式3D可视化应用中。
世界坐标:在计算机图形学中,世界坐标是一个绝对坐标系,用于描述场景中所有对象的位置。与之相对的是局部坐标或屏幕坐标。
鼠标位置:通常指的是用户在屏幕上的点击或移动位置,这是一个二维坐标(x, y)。
以下是一个简单的VTK示例代码,展示如何获取鼠标位置处的世界坐标:
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkSphereSource.h>
#include <vtkInteractorStyleTrackballCamera.h>
class CustomInteractorStyle : public vtkInteractorStyleTrackballCamera {
public:
static CustomInteractorStyle* New();
vtkTypeMacro(CustomInteractorStyle, vtkInteractorStyleTrackballCamera);
virtual void OnLeftButtonDown() override {
int* clickPos = this->GetInteractor()->GetEventPosition();
double worldCoords[4];
this->ComputeWorldToDisplay(clickPos[0], clickPos[1], 0, worldCoords);
std::cout << "World coordinates at mouse click: ("
<< worldCoords[0] << ", "
<< worldCoords[1] << ", "
<< worldCoords[2] << ")" << std::endl;
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
};
vtkStandardNewMacro(CustomInteractorStyle);
int main(int, char*[]) {
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.2, 0.3);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer<CustomInteractorStyle> style =
vtkSmartPointer<CustomInteractorStyle>::New();
renderWindowInteractor->SetInteractorStyle(style);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
问题:转换后的坐标不准确。 原因:可能是由于视口变换、投影矩阵或模型视图矩阵设置不正确导致的。 解决方法:
ComputeWorldToDisplay
和ComputeDisplayToWorld
,这些函数内部已经处理了大部分的矩阵运算。通过上述方法和代码示例,你应该能够在VTK应用中准确地获取鼠标位置处的世界坐标。
领取专属 10元无门槛券
手把手带您无忧上云