教程- VTK.js的基本介绍

news2025/1/12 15:56:29

VTK.js的核心是标准可视化工具包(VTK)库的JavaScript移植,这是一个c++库,旨在促进数据可视化,在此基础上构建了科学可视化应用程序Paraview。VTK.js没有使用OpenGL,而是利用WebGL,主要关注几何和体渲染。因此,它为不同类型的3D对象提供了大量的读取器。OBJ, . stl, . vtk等)。

在本教程中,我们将构建一个基本的VTK.js应用程序,并学习VTK渲染过程的一些基础知识。VTK库(尤其是它最初的c++实现)是一个巨大而强大的资源,如果你对它感兴趣,我强烈建议你查看VTK用户指南VTK教科书以获得更多信息。

注意:本教程基于VTK.js应用程序示例。最初的教程没有太多的解释,所以我在这里更深入地解释了web开发和渲染过程的每个部分。

开始

首先,确保你的计算机上已经安装了node .js/npm(你可以通过在终端上运行node -v或npm -v来确认它们是否已经安装)。在为项目下载所需的JavaScript包时,这是必要的。

然后,在你希望项目基于的目录中,创建一个名为MyWebProject的目录,并将其初始化为一个带有包的npm存储库。json文件:

mkdir MyWebProject

cd MyWebProject

npm init

The package.json文件为你的项目指定了各种控件和选项。例如,包。json包含快捷“脚本”,你可以从你的终端运行,如“test”,当你从你的终端运行“npm test”时,将运行“echo \”错误:没有测试指定\“&& exit 1”。包。Json还跟踪项目依赖项及其版本。

说到依赖项,我们现在可以安装我们的两个依赖项:

npm install vtk.js --save

npm install kw-web-suite --save-dev

这些命令将这些库安装到项目的node_modules目录中,这是一个包含所有依赖项的方便文件夹。

现在,在项目的根目录中创建一个名为webpack.config.js的文件,并复制并粘贴以下代码:

var path = require('path');

var webpack = require('webpack');

var vtkRules = require('vtk.js/Utilities/config/dependency.js').webpack.core.rules;

// Optional if you want to load *.css and *.module.css files

// var cssRules = require('vtk.js/Utilities/config/dependency.js').webpack.css.rules;

var entry = path.join(__dirname, './src/index.js');

const sourcePath = path.join(__dirname, './src');

const outputPath = path.join(__dirname, './dist');

module.exports = {

entry,

output: {

path: outputPath,

filename: 'MyWebApp.js',

},

module: {

rules: [

{ test: /\.html$/, loader: 'html-loader' },

].concat(vtkRules),

},

resolve: {

modules: [

path.resolve(__dirname, 'node_modules'),

sourcePath,

],

},

};

Webpack是一个用于web开发的模块捆绑器。它的功能超出了本教程的范围,但从本质上讲,这个配置文件为如何转译JavaScript文件和依赖项设置了某些选项,这样所有的JavaScript类和功能都可以压缩到一个文件中,以便在web浏览器中使用。欲了解更多信息,请访问https://webpack.js.org/

In package.json,在“scripts”对象下添加以下脚本:

{

[...],

"scripts": {

"build": "webpack --progress --colors --mode development",

"build:release": "webpack --progress --colors --mode production",

"start": "webpack-dev-server --content-base ./dist",

"commit": "git cz",

"semantic-release": "semantic-release"

}

}

现在我们已经准备好构建我们的VTK.js应用程序了!

应用程序

在根目录下创建两个文件夹:./src和./dist。在dist/中,创建一个名为index.html的文件,并将以下代码复制到其中:

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>

<meta name="viewport" content="width=device-width, initial-scale=1">

</head>

<body>

<script type="text/javascript" src="MyWebApp.js"></script>

</body>

</html>

这是一个HTML文件,最终经过转译、捆绑的JS代码将被呈现到这个文件中。如果你有敏锐的眼光,你可能已经注意到在webpack.config.js中,我们应用程序的输出捆绑文件叫做MyWebApp.js,位于dist文件夹中。该文件随后由<script>标记引用。

现在,在src/中,创建一个名为controller.html的文件,并将以下代码复制到其中:

<table>

<tr>

<td>

<select class='representations' style="width: 100%">

<option value='0'>Points</option>

<option value='1'>Wireframe</option>

<option value='2' selected>Surface</option>

</select>

</td>

</tr>

<tr>

<td>

<input class='resolution' type='range' min='4' max='80' value='6' />

</td>

</tr>

</table>

这个HTML文件表示可视化的查看控件。我们将能够选择什么表示我们的可视化采取(即点,线框或表面),以及该可视化的分辨率。我们将很快对此展开更多内容。

最后,同样在src/中,创建一个index.js文件,并将以下代码复制到其中:

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

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

import vtkCalculator from 'vtk.js/Sources/Filters/General/Calculator';

import vtkConeSource from 'vtk.js/Sources/Filters/Sources/ConeSource';

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

import { AttributeTypes } from 'vtk.js/Sources/Common/DataModel/DataSetAttributes/Constants';

import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constants';

import controlPanel from './controller.html';

// ----------------------------------------------------------------------------标准呈现代码设置

// ----------------------------------------------------------------------------

const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();

const renderer = fullScreenRenderer.getRenderer();

const renderWindow = fullScreenRenderer.getRenderWindow();

// ----------------------------------------------------------------------------

// 代码示例

// ----------------------------------------------------------------------------

const coneSource = vtkConeSource.newInstance({ height: 1.0 });

const filter = vtkCalculator.newInstance();

filter.setInputConnection(coneSource.getOutputPort());

filter.setFormula({

getArrays: inputDataSets => ({

input: [],

output: [

{ location: FieldDataTypes.CELL, name: 'Random', dataType: 'Float32Array', attribute: AttributeTypes.SCALARS },

],

}),

evaluate: (arraysIn, arraysOut) => {

const [scalars] = arraysOut.map(d => d.getData());

for (let i = 0; i < scalars.length; i++) {

scalars[i] = Math.random();

}

},

});

const mapper = vtkMapper.newInstance();

mapper.setInputConnection(filter.getOutputPort());

const actor = vtkActor.newInstance();

actor.setMapper(mapper);

renderer.addActor(actor);

renderer.resetCamera();

renderWindow.render();

// -----------------------------------------------------------

// UI 操作处理

// -----------------------------------------------------------

fullScreenRenderer.addController(controlPanel);

const representationSelector = document.querySelector('.representations');

const resolutionChange = document.querySelector('.resolution');

representationSelector.addEventListener('change', (e) => {

const newRepValue = Number(e.target.value);

actor.getProperty().setRepresentation(newRepValue);

renderWindow.render();

});

resolutionChange.addEventListener('input', (e) => {

const resolution = Number(e.target.value);

coneSource.setResolution(resolution);

renderWindow.render();

});

这段代码是应用程序的核心。在我们继续之前,让我们构建并运行这个项目:

npm run build

npm start

导航到http://localhost:8080/查看我们的应用程序正在运行!

在引擎盖下-探索代码

让我们打开index.js,看看里面发生了什么。幸运的是,VTK开发人员已经用注释清晰地分割了JS代码的重要部分,所以我们可以把它作为起点。

渲染设置

这段代码设置了三个变量,fullScreenRenderer, renderer和renderWindow。

fullScreenRenderer提供了一个全屏上下文,其中呈现的模型和控件共存。

renderWindow是一个包含多个渲染器的窗口。在每个动画帧上,renderWindow调用每个渲染器并将所有相关模型渲染到窗口。

渲染器为要渲染到相关渲染窗口的模型提供了一个入口点(在vtkActor对象中包装了其他信息——稍后将详细介绍)。渲染器还包含一个vtkLights集合和一个vtkCamera实例。

创建和渲染模型- VTK可视化管道的基础知识

这部分代码创建一个模型,过滤它的数据,将这个数据连接到一个映射器,将这个映射器连接到一个参与者,最后将参与者添加到渲染的场景中。

coneSource只是一个程序生成的圆锥的3D模型。VTK.js提供了许多程序生成的3D模型源代码,包括ArrowSource和PointSource。源代码是VTK可视化管道的开始。

filter是Calculator过滤器的一个实例。过滤器从源中获取输出数据,并以各种方式修改它们,然后继续在呈现管道中进行进一步处理。在本例中,使用了两个函数:

getArrays()——给定一个输入数据集,返回两个数组,指定要传递给函数的vtkDataArray类型的输入和输出数组

在本例中,filter.getArrays()将coneSource的输出数据作为输入,并返回类型为“CELL”的输出数组,名称为“Random”,数据类型为“Float32Array”,并带有标量属性。

evaluate()——给定一个输入数组vtkDataArray和输出数组vtkDataArray,使用输入数组构造一个输出数组

在本例中,filter.evaluate()生成一个与输出数据长度相同的随机标量值数组。

mapper是mapper的一个实例。映射器终止了可视化管道,并充当可视化子系统和图形子系统之间的接口。在本例中,创建了一个映射器,它将过滤器的输出作为输入。

actor是actor的一个实例,actor是vtkProp3D最常见的子类。actor将渲染属性信息分组,如表面属性(例如,环境、漫反射和高光颜色)、表示(例如,表面、线框)、纹理映射和/或几何定义(通过映射器)。在本例中,我们的参与者与之前创建的映射器链接,映射器将呈现过滤器输出的几何数据。

然后我们的渲染器将这个actor添加到场景中。renderWindow被重新渲染以反映更新后的状态。我们已经成功地从source -> filter -> mapper -> actor -> renderWindow创建了一个可视化管道,并且我们对该管道中的任何元素所做的任何后续更改都将反映在我们的最终渲染中,正如我们将在下一节中看到的那样。

UI控件

这部分代码封装了UI逻辑,允许我们操作呈现的对象。如果你还记得的话,我们在src/controller.html中定义了2个交互控件——一个控制对象的表示,另一个控制对象的解析。在这里,我们添加了JS事件监听器逻辑,该逻辑对其值的变化做出反应。

从本质上讲,在将这些控件与我们的fullScreenRenderer关联之后,这段代码只是从DOM中抓取元素(即representationSelector和resolutionChange),并将简单的eventlistener添加到每个元素中。

例如,对于representationSelector,添加了一个监听值中的“变化”的事件侦听器。当用户更改对象表示时,该侦听器将被触发,获取元素的更新值,相应地设置参与者表示,并重新呈现窗口。它对resolutionChange做了非常类似的事情。

结论

现在你知道了!我们已经成功地建立并运行了一个VTK.js web应用程序示例,并且在此过程中我们已经学习了一些web开发的基础知识和VTK可视化管道。欲了解更多信息,或者如果您想尝试VTK.js中的其他示例查看器,请查看官方网站。另外,请填写教程的反馈表!https://goo.gl/forms/41Mgd6zTTctPwBWs2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaFx程序使用Gloun打包成Android平台App教程

0. 提要 !!! 适合有Maven基础&#xff0c;对JavaFx或JavaFX移动端感兴趣的朋友 提示必须在Linux环境下进行&#xff0c;可以使用虚拟机 推荐使用CentOS系统进行,虚拟机硬盘大小推荐最少给30G 不要像我一样,搞一半又去给文件系统根目录扩大容量 如果容量不够可以看篇博客: http…

C++模板(第二版)笔记之第十八章:模板的多态性

文章目录一、动态多态&#xff08;dynamic polymorphism&#xff09;二、静态多态三、静态多态VS动态多态1.术语2.优点和缺点3.结合两种多态形式&#xff1a;CRTP四、使用concepts五、新形势的设计模式六、泛型编程七、总结一、动态多态&#xff08;dynamic polymorphism&#…

【C语言】内存函数介绍

它们所在的头文件&#xff1a; &#xff08;这里出现的arr都为char类型数组&#xff09;strlen作用&#xff1a;计算一个字符串的长度本质&#xff1a;历经千辛找一个 \0 &#xff0c;找到 \0 就立马停止。&#xff08;就是找 \0 &#xff09;易错&#xff1a;strlen 返回值为 …

物联网无线通信技术中蓝牙和WIFI有哪些区别?

在物联网快速发展的时代&#xff0c;联网运行的设备越来越多&#xff0c;无线通信技术在物联网中发挥着举足轻重的作用&#xff0c;无线通信技术的发展改变了信息传输的方式&#xff0c;人们在任何时间、任何地点都可以访问设备&#xff0c;目前最常用的两种无线通信技术分别是…

云服务器CentOS前后端部署流程记录

部署流程记录 购买云服务ecs服务器&#xff0c;建立CentOS系统 通过xftpxshell访问远程服务 doker部署&#xff08;https://www.runoob.com/docker/centos-docker-install.html&#xff09; docker docker部署环境&#xff08;mysql&#xff09; docker常用命令 1. docker i…

【Linux】进程状态与优先级

文章目录进程状态概念Linux中的进程状态R(running)状态S(sleeping)状态D(disk sleep)状态T(stopped)状态t(tracing stop)状态X(dead)状态Z(zombie)状态特殊的孤儿进程进程优先级进程性质补充进程状态概念 《现代操作系统》中给出的进程状态的定义如下&#xff1a; 进程状态反映…

Qt+C++窗体界面中英文多语言切换

程序示例精选 QtC窗体界面中英文语言切换 如需安装运行环境或远程调试&#xff0c;见文章底部个人微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC窗体界面中英文语言切换>>编写代码&#xff0c;代码整洁&#xff0c;规则&#x…

【Linux】软件包管理器 yum

目录 一、什么是软件包 二、如何进行软件安装 1、yum 的使用 2、yum 配置 一、什么是软件包 在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但是这样太麻烦了&#xff0c;于是有些人把一些常用的软…

InnoDB数据存储结构

InnoDB数据存储结构 本专栏学习内容来自尚硅谷宋红康老师的视频 有兴趣的小伙伴可以点击视频地址观看 1. 数据库的存储结构&#xff1a;页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的&#xff0c;确切来说是存储在页结构中。…

不讨论颜色的前提下,如何证明自己不是色盲?神奇的零知识证明

0x01 一个小故事 《阿里巴巴与四十大盗》中有这样一段小故事&#xff1a; 阿里巴巴会芝麻开门的咒语&#xff0c;强盗向他拷问打开山洞石门的咒语&#xff0c;他不想让人听到咒语&#xff0c;又要向强盗证明他知道这个咒语。 那应该怎么办呢&#xff1f; 便对强盗说&#xf…

基于KVM安装部署RHCOS操作系统

参考&#xff1a;Openshift 4.4 静态 IP 离线安装系列&#xff1a;初始安装 - 米开朗基杨 - 博客园 一、Openshift OCP集群安装架构示意图 RHCOS 的默认用户是 core 如果安装有问题会进入 emergency shell&#xff0c;检查网络、域名解析是否正常&#xff0c;如果正常一般是以…

重修JAVA

程序员的差距是在构思上&#xff1a;思想决定了深度&#xff0c;思想的精髓高深是很多人学不来的&#xff01; 每一门语言都有它的特点&#xff0c;有优势也有劣势&#xff0c; 所以不必拘泥于招式&#xff0c;掌握底层原理即可&#xff01; 每一们语言实际上都是一个“工具”&…

如何在您的香港主机帐户上注册多个域名

注册多个域名非常普遍。事实上&#xff0c;香港主机服务提供商鼓励这样做&#xff0c;因为它既有意义又是必要的。下面将介绍决定为什么您可能需要在香港主机上注册多个域名的几个因素。注册多个域名的原因是什么?方便多个项目如果香港主机帐户的所有者在网络上有多个不同域名…

优化vue项目后, 启动编译项目过程中 报 javaScript heap out of memory 错误 及 nodejs内存溢出

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 1、优化vue项目后&#xff0c;运行npm run serve 启动编译项目过程中 报 javaScript heap out of memory 错误 2、项目启动时&#xff0c;出现 nodejs 内存溢出错误 问题描述 提示&#xff1a;遇到…

分布式事务的背景和解决方案

在常用的关系型数据库&#xff0c;都是具备事务特性的。 那什么是事务呢&#xff1f;事务是数据库运行的一个逻辑工作单元&#xff0c;在这个工作单元内的一系列SQL命令具有原子性操作的特点&#xff0c;也就是说这一系列SQL指令要么全部执行成功&#xff0c;要么全部回滚不执…

经典算法之深度优先搜索(DFS)

&#x1f451;专栏内容&#xff1a;算法学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐。 目录一、前言二、基本概念1.简单介绍2. 官方概念三、动图分析四、模板框架五、例题分析组合问题题干描述&#xff1a;思路…

leetcode146. LRU 缓存【python3哈希表+双向链表】利用OrderedDict以及自实现双向链表

题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现LRUCache类&#xff1a; LRUCache(int capacity) 以正整数作为容量capacity初始化 LRU 缓存int get(int key) 如果关键字key存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则…

【论文速递】9位院士Science88页长文:人工智能的进展、挑战与未来

【论文速递】9位院士Science88页长文&#xff1a;人工智能的进展、挑战与未来 【论文原文】&#xff1a;Intelligent Computing: The Latest Advances, Challenges and Future 获取地址&#xff1a;https://spj.science.org/doi/10.34133/icomputing.0006摘要&#xff1a; ​…

【阶段三】Python机器学习15篇:机器学习项目实战:支持向量机回归模型

本篇的思维导图: 项目实战(支持向量机回归模型) 项目背景 股票投资(Stock Investment)是指企业或个人用积累起来的货币购买股票,借以获得收益的行为。股票投资的收益是由“收入收益”和“资本利得”两部分构成的。收入收益是指股票投资者以股东身份,按照持股的份…

大网规划部署刷题讲解(带答案)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.大网规划刷题 前言 本章将会讲解大网规划刷题的讲解。 一.大网规划刷题 …