vtk种ResetCamera

在vtk中,我们通常加入道具以后,会ResetCamera,这个是具体做了什么?
void vtkRenderer::ResetCamera()
this->ComputeVisiblePropBounds(allBounds);
跟踪源码可以看到,这个是计算道具的边界。
在这里插入图片描述然后调用ResetCamera带参数的
在这里插入图片描述
获取是平面法向量,

在这里插入图片描述
计算中心点,获取球半径,这里要说明下
我们获取了道具的左右,上下和前后边界,相当于获取一个大的盒子,
在盒子外面画个球,这个是想象中的,
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210713000231361.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3prd2x5ejE2Mzk4OA==,size_16,color_FFFFFF,t_70
求出球的半径,r=sqr(x^2 + y ^2 + z ^2);球半径公式,
获取相机到球中心点距离,使用正弦定理,sin(a)c=r. >c = r/sin(a)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071300075792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3prd2x5ejE2Mzk4OA
,size_16,color_FFFFFF,t_70
中心点+距离
法向量,就是camera位置点。

### 如何使用C++和VTK库读取VTK格式文件 为了实现这一目标,可以利用VTK中的`vtkGenericDataObjectReader`类来处理不同类型的VTK数据对象。下面是一个简单的例子,展示了如何加载并显示来自`.vtk`文件的数据。 ```cpp #include <vtkSmartPointer.h> #include <vtkGenericDataObjectReader.h> #include <vtkPolyDataReader.h> // 如果知道是polydata类型可以直接用这个更具体的reader #include <vtkDataSetMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> int main(int argc, char *argv[]) { if(argc != 2){ std::cout << "Usage: " << argv[0] << " Filename(.vtk)" << std::endl; return EXIT_FAILURE; } // 创建一个通用的VTK文件读取器实例 vtkSmartPointer<vtkGenericDataObjectReader> reader = vtkSmartPointer<vtkGenericDataObjectReader>::New(); reader->SetFileName(argv[1]); reader->Update(); // 获取输出作为多边形数据集 auto polyData = vtkPolyData::SafeDownCast(reader->GetOutput()); if (!polyData) { std::cerr << "File does not contain PolyData." << std::endl; return EXIT_FAILURE; } // 映射到图形组件上准备渲染 vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New(); mapper->SetInputConnection(polyData->GetProducerPort()); // 设置演员属性并将映射应用给它 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 渲染窗口设置 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); // 添加演员至场景中 renderer->AddActor(actor); renderer->ResetCamera(); // 启动交互模式查看结果 renderWindow->Render(); interactor->Start(); return EXIT_SUCCESS; } ``` 此程序接受命令行参数指定要打开的.vtk文件路径,并尝试将其内容呈现出来。注意这里假设输入的是一个多边形数据(PolyData),如果不确定具体类型也可以先通过`vtkGenericDataObjectReader`读入再判断实际类型[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值