暑期项目实训-基于webgl(threejs)的牙科数据可视化展示.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《暑期项目实训-基于webgl(threejs)的牙科数据可视化展示.docx》由会员分享,可在线阅读,更多相关《暑期项目实训-基于webgl(threejs)的牙科数据可视化展示.docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、暑期项目实训:基于webgl(three.js)的牙科数据可视化展示第一天:本组的选题是“牙科数据的分割与分类及可视化展示平台。工作主要划分成三块前端平台页面搭建、算法与数据可视化、后端及数据库。我以及另一个同学一起负责算法与数据可视化。根据学长给的demo视频。我们将组内任务分为如下一、牙科数据可视化1CBCT数据、口扫数据可视化三维数据其中细分由分为如下功能三维数据呈现、改变观测视角、光照效果、材质、颜色透明度变换形成渲染器中的GUI。2X光全景图可视化二维数据细分功能如下二维数据呈现、切换深度、根本的图像处理。二、牙科数据处理1牙齿分割任务2牙齿分类任务注模型已经由学长给出我们要导入数据
2、和输出结果。、细分好工作后我们先决定实现数据可视化。考虑到以及Web端适配我们决定使用WebGL开发一开场使用原生的WebGL的开发是痛苦的。WebGL以及OpenGL是类似的而渲染管线又是流水线的工作必须按照流程。于是我们寻找到更高效的开发工具three.js简化开发的流程。我们建立了一个建立的html页面并成功载入三维CBCT数据并渲染出来。这是载入stl文件函数这是我们需要加载的外部文件我们需要创立场景、设置光源、设置相机、创立渲染器、执行渲染第二天我们开场给3D模型添加动画效果一是添加旋转让鼠标以及场景完成交互。在网上搜索资料有封装好的API可以调用类似于JQuery创立控件对象然后监
3、听鼠标、键盘事件将render()函数做为参数。这样可以做出“相加跟随的效果。varcontrolsnewTHREE.OrbitControls(camera,renderer.domElement);/创立控件对象controls.addEventListener(change,render);/监听鼠标、键盘事件效果如下二是参加光照跟随的效果起初环境光与点光源都是固定的所以我们从不同的视角观测模型的亮暗局部都是固定的。所以有的角度直面的是暗的局部观测不清楚。我们定义好了render()函数用来专门渲染物体。在这个render()函数中我们先获取了相机的位置然后新建一个点光源把相机位置传入。
4、这样无论我们在何处观测都有点光源会照在正对相机的外表上。极大地方便了用户观测三维模型。functionrender()varvectorcamera.position.clone();/console.log(vector.x);point.position.set(vector.x,vector.y,vector.z);/点光源位置renderer.render(scene,camera);/执行渲染操作/console.log(vector.x);问题我们在添加监控对象的时候遇到了一个费事即参加监听事件的对象后程序保持着监听状态但是刚点开网页的时候却无法渲染出物体。只有通过挪动鼠标运动相机
5、后才能渲染出。我们判断是因为渲染的逻辑顺序的问题“监听的机制我们其实并不解析。但是我们可以在载入STL文件后立即执行渲染这样可以保证刚翻开时就能有模型显示。三为了进一步增加交互进步用户友好性。我们尝试增加一些按钮。首先增加“Reset按钮即复原相机位置让屏幕显示出从模型的正面观测。buttontypebuttononclickreset()重置方向/button我们按照html语法写了一个button添加了onclick一旦点击此按钮便会执行“reset()函数。functionreset()varvcamera.position.clone();camera.position.set(0,0
6、,200);camera.lookAt(scene.position);scene.position.set(0,0,0);/varcontrolsnewTHREE.OrbitControls(camera,renderer.domElement);/创立控件对象/controls.addEventListener(change,render);/监听鼠标、键盘事件render();Reset()函数是先把相机的位置归回最初的(0,0,200)把保存模型的场景位置归回(0,0,0)再把相机的目的点放到“场景上最后渲染出。就能实现“reset。同样的添加了坐标轴的显示坐标轴显示/消失由于坐标轴显
7、示与否是一个状态值所以添加了简单的逻辑判断。functionaxis()if(a0)/axesHelper.position.set(0,100,0);scene.add(axesHelper);a1;/console.log(a);elseif(a1)scene.remove(axesHelper);a0;/console.log(a);render();如下列图所示为了保证画面的美观看起来更灵敏。我们参加了“自动旋转即当阅读器开启时其实显示的模型就已经开场缓慢运动。这样看起来使得场景更具“高级感。代码如下;buttontypebuttononclickspin()自动旋转/buttonbu
8、ttontypebuttononclickspeedup()旋转加速/buttonbuttontypebuttononclickspeedown()旋转减速/buttonfunctionspeedup()speedspeed0.002;functionspeedown()if(speed-0.0020.001)speedspeed-0.002;elsespeed0.001;functionspinrender()mesh1.rotateY(speed);/每次绕y轴旋转0.01弧度mesh2.rotateY(speed);/camera.rotateY(speed);angleanglespe
9、ed;render();/renderer.render(scene,camera);/执行渲染操作functionspin()if(d0)myITVsetInterval(spinrender(),20);d1;elseif(d1)clearInterval(myITV);d0;mesh1.rotateY(-angle);/每次绕y轴旋转0.01弧度mesh2.rotateY(-angle);angle0;render();第四次实验经过我们考虑给模型增加不同的材质效果首先对它的颜色改变。并且我们需要一个成型的GUI在控件面板完成这些操作。我查阅资料发现three.js已经有封装好的GUI给
10、我们使用我们可以轻松地调用这些方法实现颜色改变、模型大小等诸多功能。但问题是调用的变量终究是哪一个。Three.js的对象实在过多了由于之前的工作已经在主js文件里填充了过多。我详细且耐心地查阅了three.js的流程。大致如下将对象关系分析明确就可以判断出GUI的API中color是material的属性。gui.addColor(params,color).onChange(e/点击颜色面板e为返回的10进制颜色pointsMaterial.color.set(e);所以我们修改之前的代码把load函数里的材质提出到主js里。我们完成了对model的颜色修改(调色盘)。但有一个困境难住了我
11、修改颜色后无法实现立即渲染。其实归根结底是代码逻辑的不通顺和three.js实现经过的不明晰。但是在修改颜色之后添加了render()函数立即渲染的问题却奇迹般的解决了。gui.addColor(params,color).onChange(function()material.color.set(params.color);render();完成的效果考虑如此得出的问题mesh早在加载模型时便已经绑定了material以及geometry。Gui.AddColor代码逻辑上在mesh载入scene之后。改变material却引起scene的变化。那么有如下两个可能1.onChange()的侦
12、听重新运行整个程序渲染出新的frame2.Mesh即使在赋值后也是一直依赖于Material以及geometry的。第五次完成的任务1.实现基于GUI的mesh的透明度修改。2.上下颚的出现/隐藏3.坐标轴的隐现4.自动旋转5.旋转速度调控实现经过在添加完修改颜色模块后增加其它功能模块就变得容易起来。只需要在设定参数的时候增加“opacity并在gui中增加对material的opacity的修改。需要设置成滑块来改变。并设置步长为0.01。up.add(params,opacity,0.3,1.0).onChange(ematerial1.opacitye;render();).step(0
13、.01);此外增加了隐藏/出现的按钮。up.add(params,visible).onChange(ematerial1.visiblee;render();坐标轴的出现/隐藏gui2.add(params2,axis).onChange(eif(e)scene.add(axesHelper);elsescene.remove(axesHelper);render();这里面需要注意的我们修改的对象是scene。旋转与速度设置。gui2.add(params2,spin).onChange(eif(e)mysetInterval(function()mesh1.rotateY(speed);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 暑期 项目 基于 webgl threejs 牙科 数据 可视化 展示
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内