>웹 프론트엔드 >H5 튜토리얼 >360도 파노라마 방식의 HTML5 Canvas 구현

360도 파노라마 방식의 HTML5 Canvas 구현

小云云
小云云원래의
2018-01-31 10:52:446378검색

본 글에서는 HTML5 Canvas에서 360도 파노라마를 구현하기 위한 샘플 코드를 주로 소개하고 있는데, 편집자께서 꽤 괜찮다고 생각하셔서 지금부터 공유해드리도록 하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

현재 많은 쇼핑 웹사이트에서는 실제 사물의 360도 파노라마 이미지를 지원하며, 360도에서 샘플을 볼 수 있습니다. 이는 구매자에게 좋은 소비자 경험입니다. jQuery 및 실제로 매우 유용한 3deye.js라는 무료 플러그인도 있습니다. 플러그인은 데스크톱 및 모바일 단말기 iOS 및 Android를 지원합니다. 데모 프로그램: http://www.voidcanvas.com/demo/28823deye/

이 데모를 직접 플레이한 후 아이디어를 따라 HTML5 Canvas를 사용했습니다. 기능.

먼저 360도 파노라마의 원리에 대해 이야기해보겠습니다

1. 먼저 실제 사물을 사진으로 찍는 간격은 사진 한 장씩 15도 회전시키는 것이므로 23장의 사진이 필요합니다.
2. 사진이 준비되면 JPG 형식을 선택하고 적절한 크기로 잘라보세요.
3. 모든 사진은 JavaScript로 사전 로드되며 진행률 표시줄을 통해 로딩 정확도를 표시할 수 있습니다.
4. 캔버스 개체를 생성/가져오고, 마우스 청취 이벤트를 추가하고, 마우스가 좌우로 움직일 때 적절하게 다른 프레임을 그립니다. 일반적인 원리는 간단합니다!

구조 코드 :


R
<!DOCTYPE html>  
<html>  
<head>  
  <meta charset=utf-8">  
  <title>Full 360 degree View</title>  
  <script>  
        var ctx = null; // global variable 2d context  
        var frame = 1; // 23  
        var width = 0;  
        var height = 0;  
        var started = false;  
        var images = new Array();  
        var startedX = -1;  
      window.onload = function() {  
        var canvas = document.getElementById("fullview_canvas");  
        canvas.width = 440;// window.innerWidth;  
        canvas.height = 691;//window.innerHeight;  
        width = canvas.width;  
        height = canvas.height;  
        var bar = document.getElementById(&#39;loadProgressBar&#39;);  
        for(var i=1; i<24; i++)  
        {  
            bar.value = i;  
            if(i<10)  
            {  
                images[i] = new Image();  
                images[i].src = "0" + i + ".jpg";  
            }  
            else   
            {  
                images[i] = new Image();  
                images[i].src = i + ".jpg";  
            }  
        }  
        ctx = canvas.getContext("2d");  
          
        // mouse event  
        canvas.addEventListener("mousedown", doMouseDown, false);  
        canvas.addEventListener(&#39;mousemove&#39;, doMouseMove, false);  
        canvas.addEventListener(&#39;mouseup&#39;,   doMouseUp, false);  
        // loaded();  
          
        // frame = 1  
        frame = 1;  
        images[frame].onload = function() {  
            redraw();  
            bar.style.display = &#39;none&#39;;  
        }  
    }  
    function doMouseDown(event) {  
        var x = event.pageX;  
        var y = event.pageY;  
        var canvas = event.target;  
        var loc = getPointOnCanvas(canvas, x, y);  
        console.log("mouse down at point( x:" + loc.x + ", y:" + loc.y + ")");  
        startedX = loc.x;  
        started = true;  
    }  
      
    function doMouseMove(event) {  
        var x = event.pageX;  
        var y = event.pageY;  
        var canvas = event.target;  
        var loc = getPointOnCanvas(canvas, x, y);  
        if (started) {  
            var count = Math.floor(Math.abs((startedX - loc.x)/30));  
            var frameIndex = Math.floor((startedX - loc.x)/30);  
            while(count > 0)  
            {                 
                console.log("frameIndex = " + frameIndex);  
                count--;      
                if(frameIndex > 0)  
                {  
                    frameIndex--;  
                    frame++;  
                } else if(frameIndex < 0)  
                {  
                    frameIndex++;  
                    frame--;  
                }  
                else if(frameIndex == 0)  
                {  
                    break;  
                }  
                                  
                if(frame >= 24)  
                {  
                    frame = 1;  
                }  
                if(frame <= 0)  
                {  
                    frame = 23;  
                }  
                redraw();  
            }  
        }  
    }  
      
    function doMouseUp(event) {  
        console.log("mouse up now");  
        if (started) {  
            doMouseMove(event);  
            startedX = -1;  
            started = false;  
        }  
    }  
  
    function getPointOnCanvas(canvas, x, y) {  
        var bbox = canvas.getBoundingClientRect();  
        return { x: x - bbox.left * (canvas.width  / bbox.width),  
                y: y - bbox.top  * (canvas.height / bbox.height)  
                };  
    }  
      
    function loaded() {  
        setTimeout( update, 1000/8);  
    }  
    function redraw()  
    {  
        // var imageObj = document.createElement("img");  
        // var imageObj = new Image();  
        var imageObj = images[frame];  
        ctx.clearRect(0, 0, width, height)  
        ctx.drawImage(imageObj, 0, 0, width, height);  
    }  
    function update() {  
        redraw();  
        frame++;  
        if (frame >= 23) frame = 1;  
        setTimeout( update, 1000/8);  
    }  
  </script>  
</head>  
<body>  
<progress id="loadProgressBar" value="0" max="23"></progress>   
<canvas id="fullview_canvas"></canvas>  
<button onclick="loaded()">Auto Play</button>  
</body>  
</html>

demo 데모 파일 다운로드 주소 -& gt; 브라우저 스크린샷


JS+canvas

로 그린 동적 기계식 시계 애니메이션 효과

위 내용은 360도 파노라마 방식의 HTML5 Canvas 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.