在vue2项目中使用vtk.js解决建模脱离文档流问题

文章介绍了如何在Vue项目中使用vtk.js创建圆柱体模型,避免全屏窗口导致的文档流问题,并解决模型模糊和交互问题。作者提供了使用vtkRenderer和RenderWindow替代FullScreenRenderWindow的方法,以及添加交互器和样式以提高用户体验。
摘要由CSDN通过智能技术生成

比如我们要实现一个圆柱体的建模

<template>

         <div ref="vtkContainer" id="vtkContainer"></div>

</template>  

import 'vtk.js/Sources/favicon'

import 'vtk.js/Sources/Rendering/Profiles/Geometry'

import vtkFullScreenRenderWindow from'vtk.js/Sources/Rendering/Misc/FullScreenRenderWindow'

import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper'

import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor'

import vtkCylinderSource from 'vtk.js/Sources/Filters/Sources/CylinderSource'

//创建全屏窗口

const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({

        container: this.$refs.vtkContainer,

        background: [0.2, 0.2, 0.2, 0.2],

      })

const renderer = this.fullScreenRenderer.getRenderer()

const renderWindow = this.fullScreenRenderer.getRenderWindow()

// 创建一个圆柱体

const cylinderSource = vtkCylinderSource.newInstance()

cylinderSource.set({ height: 30, radius: 10, resolution: 80 })

const mapper = vtkMapper.newInstance()

mapper.setInputConnection(cylinderSource1.getOutputPort())

const actor = vtkActor.newInstance()

actor.setMapper(mapper)

actor.setPosition(10, 15, 10) // 将圆柱体移到10的位置

renderer.addActor(actor)

 // 更新并渲染

renderer.resetCamera()

renderWindow.render()

以上代码虽然在项目中创建了一个圆柱体,但是会出现类似脱离文档流情况。假设我们的项目有一个侧边导航栏,右边是我们的内容部分,如果用以上代码,虽然创建了建模,但是你会发现你的侧边导航没有办法点击跳转了。你再使用浏览器直接输入路径跳转页面之后,(比如跳转到首页),页面上不仅有页面原本的内容,还会出现你创建的建模。打开控制台查看元素时,会发现,在你ID为app的div标签的同级下,也会出现一个div标签,里面包裹一个canvas。正常情况这个div标签是要在app里面的。这种情况是因为使用了vtkFullScreenRenderWindow导致的。因为他是一个全屏的渲染窗口。

我们可以使用vtkrenderer和vtkRenderWindow解决这个问题

import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor'

import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper'

import vtkCylinderSource from 'vtk.js/Sources/Filters/Sources/CylinderSource'

import vtkrenderer from 'vtk.js/Sources/Rendering/Core/Renderer'

import vtkRenderWindow from 'vtk.js/Sources/Rendering/Core/RenderWindow'

import vtkOpenGLRenderWindow from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow'

//获取展示建模的标签

const container = this.$refs.container

//渲染器

const renderer = vtkrenderer.newInstance()

//渲染窗口

const renderWindow = vtkRenderWindow.newInstance()

// 将渲染器添加到渲染窗口

renderWindow.addRenderer(renderer)

// 为渲染窗口创建一个OpenGL视图

const openGLRenderWindow = vtkOpenGLRenderWindow.newInstance()

renderWindow.addView(openGLRenderWindow)

// 将容器与OpenGL视图关联

openGLRenderWindow.setContainer(container)

// 创建一个圆柱体

const cylinderSource = vtkCylinderSource.newInstance()

cylinderSource.set({ height: 30, radius: 10, resolution: 80 })

const mapper = vtkMapper.newInstance()

mapper.setInputConnection(cylinderSource1.getOutputPort())

const actor = vtkActor.newInstance()

actor.setMapper(mapper)

actor.setPosition(10, 15, 10) // 将圆柱体移到10的位置

renderer.addActor(actor)

 // 更新并渲染

renderer.resetCamera()

renderWindow.render()

这样就解决了推理文档流的问题了。但是你会发现一个新的问题,你会发现页面的建模非常的模糊,并且没有办法使用鼠标拖动旋转。这也是使用vtkrenderer和vtkRenderWindow去创建和使vtkFullScreenRenderWindow的区别。vtkFullScreenRenderWindow是自动的帮你设置了交互器的,但是使用vtkrenderer和vtkRenderWindow需要手动去设置交互器。

添加这两个引入,交互器和交互样式

import vtkRenderWindowInteractor from 'vtk.js/Sources/Rendering/Core/RenderWindowInteractor'

import vtkInteractorStyleTrackballCamera from 'vtk.js/Sources/Interaction/Style/InteractorStyleTrackballCamera'

//这一步是解决模型模糊的,将容器的宽高设置到openGL的视图上。让视图自适应相机的像素

openGLRenderWindow.setSize(container.clientWidth, container.clientHeight)

 // 创建交互器

const interactor = vtkRenderWindowInteractor.newInstance()

interactor.setView(openGLRenderWindow)

interactor.initialize()

interactor.bindEvents(container) // 绑定到容器上

// 设置交互样式

const trackballInteractionStyle =

      vtkInteractorStyleTrackballCamera.newInstance()

interactor.setInteractorStyle(trackballInteractionStyle)

添加以上代码,模型就解决了模糊和不能旋转的问题了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值