×

基于VRML的数码摄影虚拟实验系统设计方案

消耗积分:1 | 格式:rar | 大小:0.3 MB | 2017-10-27

分享资料个

1 研究思路与开发平台的选择
  目前,基于网络对实验对象进行三维交互展示的有效处理方法是使用专业的设计软件,如采用AUTOCAD、3DS MAX等将实验对象的三维模型设计出来。这种方法建模过程直观形象,但生成的模型和动画不能与用户进行交互,需要将三维模型导出为相关虚拟现实设计软件所需要的格式文件,用虚拟现实设计软件进行三维展示的交互设计,最后将它发布到网站上[1]。
  经过多年的发展,虚拟现实技术的实现也派生出多种不同的方法,现在较为流行的有VRML、Java 3D、CULT3D、X3D等多种实现方法。它们各自有不同的优缺点。其中,虚拟现实建模语言VRML(Virtual Reality Modeling Language)是一种描述大量对象的属性及相互关系的语言,具有平台无关性、三维交互性、多媒体集成、境界逼真等众多优越的特征,所以选择该软件作为开发平台。虽然VRML可以通过直接编程进行语义描述,建立实验对象的三维模型,但这种方法适合建立简单规则的模型。数码单反相机主要由机身和镜头两部分组成。机身上又包括取景窗口、液晶显示屏、曝光模式选择盘、控制拨轮以及各个操作按钮等,结构比较复杂,不宜直接用VRML语言进行语义描述。而是利用3DS MAX建立整个模型,并赋予材质、色彩、光照,导出VRML的格式文件(.*wrl文件)。因此,选择3DS MAX进行建模,再使用VRML软件进行交互设计并实现网上发布,建立逼真的交互式三维虚拟实验环境,可以让学生随时通过网络浏览三维场景,并通过人机交互进行仿真实验。
  2 三维虚拟数码单反相机的设计与实现
  实验对象的建模是虚拟实验开发过程中最重要的一步,模型的好坏直接影响运行的效果和场景的沉浸度。为了便于在VRML浏览器中设计三维数码单反相机的交互,可以真实地模拟实际操作进行镜头的旋转、曝光模式选择盘的转动、控制拨轮和按钮的操作等,在对数码相机进行建模时,将其各部分分别建模,后期组装。将数码单反相机的三维模型建好后,在3DS MAX中应用输出插件导出*wrl格式的文件。在运用3DS MAX模型导出VRML文件后要充分注意优化VRML程序。优化技术是三维虚拟建模过程中至关重要的一个环节,优化结果的好坏将直接影响三维数码相机的显示速度和交互效果[2]。
  3 使用VRML语言结合JavaScript实现数码单反相机的虚拟实验
  数码单反相机虚拟实验系统共包括四个实验,分别是:认识数码相机、数码相机的调节模式、数码相机的光圈调节、数码相机快门调节。
  3.1 认识数码单反相机模块的设计与实现[3]
  实验1是对数码单反相机的三维展示,主要分为:(1)自由旋转展示。在这种方式下,相机自动在浏览器中旋转,让学习者从不同的角度上观察相机的结构。(2)手动控制展示。在这种方式下,学习者可以自主转动相机,从不同角度细致地观察相机。
  为了实现相机的自由旋转展示,可以运用时间传感器节点(TimeSensor)和方向插补器节点(OrientationInterpolator)。TimeSensor节点的作用是创建一个虚拟时钟,可以像时钟一样标记时间的流逝,设置开始动画、结束动画和控制动画的播放速度等属性,并向插补器节点输出时间事件,产生相应的动画效果。OrientationInterpolator可改变观察方向或者改变形状体的方向。插补器节点使用一组关键时刻和关键值来描述一个动画。关键时刻列表在插补器节点的key域中指定,关键值列表在插补器节点的keyvalue域中指定。浏览器在渲染时将根据这些关键时刻所对应的关键状态在场景中通过线性插值计算技术自动生成连续动画。实现自由旋转展示部分相应代码如下:
  OrientationInterpolator{ //创建控制动画的插补器
  key [0 0.5 1]//指定关键时刻列表
  keyValue [//指定对应的旋转关键值列表
  0 1 0 0,
  0 1 0 3.14,
  0 1 0 6.28
  ]
  }
  TimeSensor {//创建控制动画的时间感应器
  enabled TRUE
  cycleInterval 30//指定每个变化周期的时间长短
  }
  ROUTE clock_camera.fraction_changed TO camera_auto_rotation.set_fraction
  ROUTE camera_auto_rotation.value_changed TO
  camera_all.rotation
  在ROUTE中,将TimeSensor的fraction_changed出事件路由到插补器的set_fraction入事件,每次时间传感器输出一个新的时刻,插补器就会利用输入的时间计算出一个新的旋转值,然后通过其value_changed出事件路由到方向插补器节点。
  为了能从各种角度来展示相机,运用SphereSensor传感器节点,对相机进行了手动的三维展示。 SphereSensor节点用于感知观察者的拖动动作,并且计算旋转角和角度。通过使用它的rotation_changed域输出变化的参数,对相机整体进行360°上下左右的旋转完成相机的手动展示。代码如下:
  SphereSensor{
  enabled TRUE
  }
  ROUTE camera_sd.rotation_changed TO camera_all.rotation
  对于VRML窗口与网页之间的交互主要是通过JavaScript和VRML中的TouchSensor节点完成。由于TouchSensor节点能感知用户的鼠标事件,一般的鼠标操作通常有3种:移动、点击、拖动。本设计主要使用了移动操作,当用户进行移动操作的时候会使TouchSensor中的isOver公共域变为TRUE,传递出去一个真事件。在网页中用JavaScript接收到该事件再运用相应的程序完成相应的操作,然后在VRML场景中运用Onmousemove感知鼠标的移动事件。VRML场景中主要代码:
  Touchsensor {
  Enabled TRUE
  }
  在网页中对VRML场景运用了Onmousemove感知鼠标的移动事件,当鼠标作用于VRML场景时会触发相应的处理事件javascript代码,例如当鼠标移动到LCD显示屏时,用到了条件判断语句对其进行判断:
  if(M_e.Nodes(“Viewfinder_button”).Fields(“isOver”)==-1){
  display_div(2,12);
  }
  然后进行相应的处理操作。其中Viewfinder_button是取景器的触发传感器TouchSensor的名称。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于VRML的数码摄影虚拟实验系统设计方案',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);