tour.md 10 KB

/*online-demo*/
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Virtual Tour</title>
        <style>
            html,
            body {
                width: 100%;
                height: 100%;
                margin: 0;
                overflow: hidden;
            }
            .scene {
                width: 100%;
                height: 100%;
            }
            #toolbar {
                position: absolute;
                left: 50%;
                top: 0;
                z-index: 10000;
            }
            #tours {
                position: absolute;
                left: 0;
                right: 0px;
                bottom: 50px;
                height: 200px;
                overflow: hidden;
                overflow-x: auto;
                background-color: rgba(0, 0, 0, 0.5);
                z-index: 10000;
                color: #fff;
            }
            #tours ul {
                margin: 0;
                padding: 0;
                display: flex;
                width: 100%;
                border-bottom: solid 1px #ccc;
            }
            #tours li {
                cursor: pointer;
                margin: 0;
                margin-left: 10px;
                list-style: none;
            }
            #tours li:hover {
                color: #f60;
            }
            #options {
                display:none;
                position: absolute;
                width: 200px;
                top: 0;
                right: 0;
                bottom: 50px;
                background-color: rgba(0, 0, 0, 0.5);
                z-index: 10000;
                color: #fff;
            }
            #options > div {
                margin-top: 10px;
                color: #fff;
            }
            #tour-list li{
                position: relative;
            }
            #tour-list li.active {
                border: solid 1px #f60;
            }
            .progress{
                position: absolute;
                left: 0;
                bottom: 0;
                width: 100%;
                height: 4px;
            }
            .progress div{
                height: 100%;
                width: 0;
                background-color: #f60;
            }
            [xui_min_map] {
                right:10px;
                top:10px
            }
            #navs{
                position: absolute;
                left: 0;
                bottom: 0;
                z-index:1000
            }
        </style>
    </head>
    <body>
        <div id="scene" class="scene"></div>
        <div id="toolbar">
            <button id="btn_addFrame">Add a POV</button>
            <button id="btn_addPart">Add a Clip</button>
            <button id="btn_play">Play</button>
            <button id="btn_pause">Pause</button>
        </div>
         <div id="navs">
            <button onclick="kankan.Camera.panorama()">panorama</button>
            <button onclick="kankan.Camera.floorplan()">floorplan</button>
            <button onclick="kankan.Camera.dollhouse()">dollhouse</button>
        </div>
        <div id="tours"></div>
        <div id="options">
            <div>Dwell Time:<input id="time" value="3.5" />s</div>
            <div>Angle of Rotation:<input id="rotateRange" value="35" />°</div>
            <div>
                Rotate Type:
                <select id="rotateType" style="width: 100%">
                    <option value="L" selected>From left to right</option>
                    <option value="R">From right to left</option>
                </select>
                <label for=""><input type="checkbox" />Apply to all</label>
            </div>
            <div>
                Transition Methods:
                <select id="transitType" style="width: 100%">
                    <option value="normal" selected>Roaming</option>
                    <option value="fast">Dip to Black</option>
                </select>
                <label for=""><input type="checkbox" />Apply to all</label>
            </div>
            <div>
               Entry:
                <img style="width: 200px; height: 140px" id="enterCover" />
            </div>
            <div>
                Exit:
                <img style="width: 200px; height: 140px" id="exitCover" />
            </div>
            <div style="text-align: center" id="btn_save"><button>Settings</button></div>
        </div>
        <script src="//4dkk.4dage.com/v4/sdk/4.2.2/kankan-sdk-deps.js"></script>
        <script src="//4dkk.4dage.com/v4/sdk/4.2.2/kankan-sdk.js"></script>
        <script>
            var kankan = new KanKan({
                dom: '#scene',
                num: 'KJ-JYo2ZZyKKJ', //    '' //'t-YhBCzQr'  t-QiKQpuF
            })

            function render(tours) {
                var html = []
                var parts = tours.map(item => item.name)
                var frames = tours[0].list
                html.push('<ul data-part>')
                parts.forEach((item, i) => {
                    html.push('<li data-id="' + i + '">' + item + '</li>')
                })
                html.push('</ul>')

                html.push('<ul data-frame style="margin-top:10px;border:none" id="tour-list">')
                frames.forEach((item, i) => {
                    html.push('<li data-id="' + i + '">')
                    html.push('<img style="width:200px;height:140px" src="' + item.enter.cover + '">')
                    html.push('<div class="progress"><div></div></div>')
                    html.push('</li>')
                })
                html.push('</ul>')

                document.getElementById('tours').innerHTML = html.join('')

                document.querySelectorAll('#tour-list li').forEach(el => {
                    el.addEventListener('click', () => {
                        kankan.TourManager.recorder.then(recorder => {
                            var frame = recorder.selectFrame(el.getAttribute('data-id'))
                            if (frame) {
                                document.querySelectorAll('#tour-list li').forEach(el => {
                                    el.classList.remove('active')
                                })
                                el.classList.add('active')
                                document.getElementById('time').value = frame.time / 1000
                                document.getElementById('rotateRange').value = frame.rotateRange
                                document.getElementById('rotateType').value = frame.rotateType
                                document.getElementById('transitType').value = frame.transitType
                                document.getElementById('enterCover').src = frame.enter.cover
                            }
                        })
                        kankan.TourManager.player.then(player=>{
                            player.selectFrame(el.getAttribute('data-id'))
                        })
                    })
                })
            }

            kankan.use('TourRecorder').then(recordr => {
                document.getElementById('btn_addFrame').onclick = () => recordr.addFrame()
                document.getElementById('btn_addPart').onclick = () => recordr.addPart()
                document.getElementById('btn_save').onclick = () => {
                    var data = {
                        // Dwell Time3.5s
                        time: document.getElementById('time').value * 1000,
                        // Angle of Rotation
                        rotateRange: parseFloat(document.getElementById('rotateRange').value),
                        // Rotate Type L,R
                        rotateType: document.getElementById('rotateType').value,
                        // Transition Methods normal:General(Roaming),fast:Instant(Dip to Black)
                        transitType: document.getElementById('transitType').value,
                    }

                    recordr.setFrame(recordr.frameId, data)
                }

                document.getElementById('exitCover').onclick = () => {
                    recordr
                        .setExit()
                        .then(frame => {
                            document.getElementById('exitCover').src = frame.exit.cover
                        })
                        .catch(err => {
                            alert(err.errMsg)
                        })
                }

                recordr.on('change', tours => {
                    render(tours)
                })
            })
            kankan.use('TourPlayer').then(player => {
                document.getElementById('btn_play').onclick = () => player.play()
                document.getElementById('btn_pause').onclick = () => player.pause()

                player.on('play', tours => {
                    document.querySelector('[data-frame]').querySelectorAll(`[data-id] .progress div`).forEach(el=>el.style.width=0)
                })
                player.on('pause', tours => {
                   
                })
                player.on('end', tours => {
                    document.querySelector('[data-frame]').querySelectorAll(`[data-id]`).forEach(el=>el.classList.remove('active'))
                    document.querySelector('[data-frame]').querySelector(`[data-id="${player.frameId}"]`).classList.add('active')
                    $progress = document.querySelector('[data-frame]').querySelector(`[data-id="${player.frameId}"] .progress div`)
                })
               
                player.on('progress', ({ partId, frameId, progress }) => {
                    $progress.style.width= Number(progress*100).toFixed(5)+'%'
                })

                var  $progress = null
                player.on('next', ({ partId, frameId, progress }) => {
                    document.querySelector('[data-frame]').querySelectorAll(`[data-id]`).forEach(el=>el.classList.remove('active'))
                    document.querySelector('[data-frame]').querySelector(`[data-id="${frameId}"]`).classList.add('active')
                    $progress = document.querySelector('[data-frame]').querySelector(`[data-id="${frameId}"] .progress div`)
                })
            })
            kankan.render()
        </script>
    </body>
</html>