HTML5 Canvas实现360度全景图

本文介绍了一种使用HTML5 Canvas实现360度实物全景图像的方法,通过拍摄一系列间隔15度的照片并利用JavaScript进行加载和展示,提供了一个交互式的购物体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多购物网站现在都支持360实物全景图像,可以360度任意选择查看样品,这样

对购买者来说是一个很好的消费体验,网上有很多这样的插件都是基于JQuery实现的

有收费的也有免费的,其实很好用的一个叫3deye.js的插件。该插件支持桌面与移动终

端iOS与Android, 它的demo程序:http://www.voidcanvas.com/demo/28823deye/

自己玩了玩这个Demo以后,照着它的思路,用HTML5 Canvas也实现了类似的功能。

所以先说一下它的360度全景图的原理

1.首先需要对实物拍照,间隔是每张照片旋转15度,所以需要23张照片。

2.照片准备好了以后,尽量选择JPG格式,裁剪到适当大小。

3.JAVASCRIPT中预加载所有照片,可以配合进度条显示加载精度

4.创建/获取Canvas对象,加上鼠标监听事件,当鼠标左右移动时候,适度的绘制不

同帧。大致的原理就是这样,简单吧!

实现代码:

[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset=utf-8">
  5. <title>Full360degreeView</title>
  6. <script>
  7. varctx=null;//globalvariable2dcontext
  8. varframe=1;//23
  9. varwidth=0;
  10. varheight=0;
  11. varstarted=false;
  12. varimages=newArray();
  13. varstartedX=-1;
  14. window.onload=function(){
  15. varcanvas=document.getElementById("fullview_canvas");
  16. canvas.width=440;//window.innerWidth;
  17. canvas.height=691;//window.innerHeight;
  18. width=canvas.width;
  19. height=canvas.height;
  20. varbar=document.getElementById('loadProgressBar');
  21. for(vari=1;i<24;i++)
  22. {
  23. bar.value=i;
  24. if(i<10)
  25. {
  26. images[i]=newImage();
  27. images[i].src="0"+i+".jpg";
  28. }
  29. else
  30. {
  31. images[i]=newImage();
  32. images[i].src=i+".jpg";
  33. }
  34. }
  35. ctx=canvas.getContext("2d");
  36. //mouseevent
  37. canvas.addEventListener("mousedown",doMouseDown,false);
  38. canvas.addEventListener('mousemove',doMouseMove,false);
  39. canvas.addEventListener('mouseup',doMouseUp,false);
  40. //loaded();
  41. //frame=1
  42. frame=1;
  43. images[frame].onload=function(){
  44. redraw();
  45. bar.style.display='none';
  46. }
  47. }
  48. functiondoMouseDown(event){
  49. varx=event.pageX;
  50. vary=event.pageY;
  51. varcanvas=event.target;
  52. varloc=getPointOnCanvas(canvas,x,y);
  53. console.log("mousedownatpoint(x:"+loc.x+",y:"+loc.y+")");
  54. startedX=loc.x;
  55. started=true;
  56. }
  57. functiondoMouseMove(event){
  58. varx=event.pageX;
  59. vary=event.pageY;
  60. varcanvas=event.target;
  61. varloc=getPointOnCanvas(canvas,x,y);
  62. if(started){
  63. varcount=Math.floor(Math.abs((startedX-loc.x)/30));
  64. varframeIndex=Math.floor((startedX-loc.x)/30);
  65. while(count>0)
  66. {
  67. console.log("frameIndex="+frameIndex);
  68. count--;
  69. if(frameIndex>0)
  70. {
  71. frameIndex--;
  72. frame++;
  73. }elseif(frameIndex<0)
  74. {
  75. frameIndex++;
  76. frame--;
  77. }
  78. elseif(frameIndex==0)
  79. {
  80. break;
  81. }
  82. if(frame>=24)
  83. {
  84. frame=1;
  85. }
  86. if(frame<=0)
  87. {
  88. frame=23;
  89. }
  90. redraw();
  91. }
  92. }
  93. }
  94. functiondoMouseUp(event){
  95. console.log("mouseupnow");
  96. if(started){
  97. doMouseMove(event);
  98. startedX=-1;
  99. started=false;
  100. }
  101. }
  102. functiongetPointOnCanvas(canvas,x,y){
  103. varbbox=canvas.getBoundingClientRect();
  104. return{x:x-bbox.left*(canvas.width/bbox.width),
  105. y:y-bbox.top*(canvas.height/bbox.height)
  106. };
  107. }
  108. functionloaded(){
  109. setTimeout(update,1000/8);
  110. }
  111. functionredraw()
  112. {
  113. //varimageObj=document.createElement("img");
  114. //varimageObj=newImage();
  115. varimageObj=images[frame];
  116. ctx.clearRect(0,0,width,height)
  117. ctx.drawImage(imageObj,0,0,width,height);
  118. }
  119. functionupdate(){
  120. redraw();
  121. frame++;
  122. if(frame>=23)frame=1;
  123. setTimeout(update,1000/8);
  124. }
  125. </script>
  126. </head>
  127. <body>
  128. <progressid="loadProgressBar"value="0"max="23"></progress>
  129. <canvasid="fullview_canvas"></canvas>
  130. <buttononclick="loaded()">AutoPlay</button>
  131. </body>
  132. </html>

Demo演示文件下载地址->http://download.youkuaiyun.com/detail/jia20003/6670901

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值