VTK多图层渲染窗口添加vtkOrientationMarkerWidget不起作用

Demo 描述:
一个vtk多图层小案例,设置三个图层,添加`vtkOrientationMarkerWidget`用于显示窗口的旋转交互;开始不起作用,经过查询发现,对于多图层,vtkOrientationMarkerWidget需要设置渲染器
        vtkOrientationMarkerWidget* markedCoorSys = vtkOrientationMarkerWidget::New();
		markedCoorSys->SetOutlineColor(0.9300, 0.5700, 0.1300);
		//markedCoorSys->SetDefaultRenderer(renderer);//多图层需要设置渲染器
		markedCoorSys->SetOrientationMarker(axes);
		assert(renderWindow->GetInteractor() != nullptr);
		markedCoorSys->SetInteractor(renderWindow->GetInteractor());
		markedCoorSys->SetViewport(0, 0, 0.2, 0.2);
		markedCoorSys->SetEnabled(1);

完整Demo案例:

#include<iostream>

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAxesActor.h>
#include <vtkAssembly.h>
#include <vtkProperty.h>
#include <vtkOrientationMarkerWidget.h>


int main()
{
	// 创建立方体
	vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();

	// 映射数据到图形对象
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(cubeSource->GetOutputPort());

	// 创建表示物体的角色
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	// 创建渲染器和窗口
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderer> overlay  = vtkSmartPointer<vtkRenderer>::New();
	overlay->SetLayer(1);

	vtkSmartPointer<vtkRenderer> selectlay = vtkSmartPointer<vtkRenderer>::New();
	selectlay->SetLayer(2);

	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->SetNumberOfLayers(3);
	renderWindow->AddRenderer(renderer);
	renderWindow->AddRenderer(overlay);
	renderWindow->AddRenderer(selectlay);

	renderer->AddActor(actor);

	// 创建交互器
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	style->SetDefaultRenderer(renderer);
	renderWindowInteractor->SetInteractorStyle(style);
	renderWindowInteractor->SetRenderWindow(renderWindow);

	// 将角色添加到渲染器
	renderer->AddActor(actor);

	// 设置背景颜色
	renderer->SetBackground(0.1, 0.2, 0.4);


	{
		vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
		axes->GetXAxisTipProperty()->SetColor(0.706, 0.016, 0.150);
		axes->GetXAxisShaftProperty()->SetColor(0.706, 0.016, 0.150);
		axes->GetYAxisTipProperty()->SetColor(0.130, 0.806, 0.150);
		axes->GetYAxisShaftProperty()->SetColor(0.130, 0.806, 0.150);
		axes->GetZAxisTipProperty()->SetColor(0.230, 0.299, 0.754);
		axes->GetZAxisShaftProperty()->SetColor(0.230, 0.299, 0.754);
		axes->AxisLabelsOff();

		vtkOrientationMarkerWidget* markedCoorSys = vtkOrientationMarkerWidget::New();
		markedCoorSys->SetOutlineColor(0.9300, 0.5700, 0.1300);
		markedCoorSys->SetDefaultRenderer(renderer);//多图层需要设置渲染器
		markedCoorSys->SetOrientationMarker(axes);
		assert(renderWindow->GetInteractor() != nullptr);
		markedCoorSys->SetInteractor(renderWindow->GetInteractor());
		markedCoorSys->SetViewport(0, 0, 0.2, 0.2);
		markedCoorSys->SetEnabled(1);
		

	}

	// 渲染并启动交互器
	renderWindow->Render();
	renderWindowInteractor->Start();

	return 0;
}


你可以使用 Vue Router 的导航守卫来实现外链跳转时携带 token 但不显示在地址栏中。下面是一种可能的解决方案: 1. 首先,确保你已经安装了 Vue Router,并在项目中引入它。 2. 在路由文件中,定义一个全局前置守卫(global before guard),用来拦截所有的外链跳转。 ```javascript import router from './router' router.beforeEach((to, from, next) => { // 判断是否是外链跳转 if (to.meta.externalLink) { // 获取 token const token = 'your_token_here' // 创建一个隐藏的表单,用于提交 token const form = document.createElement('form') form.action = to.path form.method = 'post' // 创建一个隐藏的输入框,存放 token const tokenInput = document.createElement('input') tokenInput.type = 'hidden' tokenInput.name = 'token' tokenInput.value = token // 将输入框添加到表单中 form.appendChild(tokenInput) // 将表单添加到页面中 document.body.appendChild(form) // 提交表单 form.submit() } else { next() } }) ``` 3. 在定义路由时,为外链跳转的路由添加一个 meta 属性,用来标识它是外链跳转。 ```javascript const routes = [ { path: '/external', name: 'ExternalLink', component: ExternalLink, meta: { externalLink: true } }, // 其他路由... ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 这样,当用户点击一个带有 `externalLink` meta 属性的链接时,会触发全局前置守卫,创建一个隐藏的表单,将 token 作为参数提交,然后页面会进行跳转,但地址栏中并不会显示 token。 请注意,这只是一种解决方案,具体实现可能因你的项目结构和需求而有所不同。你需要根据实际情况进行调整和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值