sdk-sync-paint.html 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. <style>
  8. html,
  9. body {
  10. width: 100%;
  11. height: 100%;
  12. margin: 0;
  13. overflow: hidden;
  14. }
  15. .scene {
  16. /* height: 100%;
  17. float: left;
  18. width: 50%; */
  19. width: 100%;
  20. height: 100%;
  21. }
  22. .paint {
  23. position: absolute;
  24. width: 100%;
  25. top: 0;
  26. left: 0;
  27. z-index: 1000;
  28. }
  29. .control {
  30. pointer-events: all;
  31. display: flex;
  32. align-items: center;
  33. justify-content: space-around;
  34. height: 34px;
  35. border-radius: 17px;
  36. background-color: rgba(0, 0, 0, 0.3);
  37. position: absolute;
  38. bottom: 10px;
  39. left: 10px;
  40. z-index: 1000;
  41. }
  42. .control div {
  43. position: relative;
  44. margin-left: 20px;
  45. margin-right: 20px;
  46. cursor: pointer;
  47. }
  48. .control div i {
  49. font-size: 18px;
  50. color: #fff;
  51. }
  52. </style>
  53. </head>
  54. <body>
  55. <div id="scene" class="scene">
  56. <div class="control">
  57. <div>
  58. <!-- icon-show_roaming_selected -->
  59. <button onclick="changeMode('panorama')" class="iconfont icon-show_roaming_normal">panorama</button>
  60. </div>
  61. <div>
  62. <button onclick="changeMode('floorplan')" class="iconfont icon-show_plane_normal">floorplan</button>
  63. </div>
  64. <div>
  65. <button onclick="changeMode('dollhouse')" class="iconfont icon-show_3d_normal">dollhouse</button>
  66. </div>
  67. </div>
  68. </div>
  69. <div id="scene2" class="scene"></div>
  70. <div class="paint">
  71. <button id="show-paint" onclick="paint(true)">开启画笔</button>
  72. <button id="hide-paint" onclick="paint(false)" disabled>关闭画笔</button>
  73. </div>
  74. <script src="./js/socket.io.min.js"></script>
  75. <script src="../dist/sdk/kankan-sdk-deps.js"></script>
  76. <script src="../dist/sdk/kankan-sdk.js"></script>
  77. <script>
  78. var role = window.location.search.indexOf('leader') != -1 ? 'leader' : 'customer'
  79. function getURLParams(params) {
  80. var p = []
  81. for (let key in params) {
  82. p.push(key + '=' + encodeURIComponent(params[key]))
  83. }
  84. return p.join('&')
  85. }
  86. function paint(show) {
  87. if (show) {
  88. document.getElementById('show-paint').disabled = true
  89. document.getElementById('hide-paint').disabled = false
  90. kankan.Connect.paint.show({ role, paint: role == 'leader' ? true : false })
  91. if (role == 'leader') {
  92. socket.emit('action', { type: 'user-paint', open: true })
  93. }
  94. } else {
  95. document.getElementById('show-paint').disabled = false
  96. document.getElementById('hide-paint').disabled = true
  97. kankan.Connect.paint.hide()
  98. if (role == 'leader') {
  99. socket.emit('action', { type: 'user-paint', open: false })
  100. }
  101. }
  102. }
  103. function createSocket(config) {
  104. var socket = io('https://v4-test.4dkankan.com/', {
  105. path: '/ws-sync',
  106. transports: ['websocket'],
  107. })
  108. return socket
  109. }
  110. var kankan = null
  111. var isJoined = false
  112. var socket = createSocket()
  113. socket.on('connect', () => {
  114. socket.emit('join', {
  115. userId: Date.now().toString(),
  116. roomId: 'test-room-paint-1',
  117. role: role,
  118. })
  119. })
  120. socket.on('join', data => {
  121. isJoined = true
  122. })
  123. socket.on('action', data => {
  124. if (data.type == 'error') {
  125. } else if (data.type == 'user-init') {
  126. kankan.Connect.follow.sync()
  127. } else if (data.type == 'user-paint') {
  128. paint(data.open)
  129. }
  130. })
  131. socket.on('paint', data => {
  132. kankan.Connect.paint.receive(data)
  133. })
  134. socket.on('sync', data => {
  135. kankan.Connect.follow.receive(data)
  136. })
  137. var kankan = new KanKan({
  138. dom: '#scene',
  139. num: 't-JKNqv1o',
  140. })
  141. kankan.Scene.on('loaded', () => {
  142. if (role == 'leader') {
  143. kankan.Connect.follow.start()
  144. } else {
  145. kankan.Connect.follow.start({ follow: true })
  146. setTimeout(() => {
  147. socket.emit('action', { type: 'user-init' })
  148. }, 1000);
  149. }
  150. })
  151. kankan.Connect.follow.on('data', data => {
  152. if (isJoined) {
  153. socket.emit('sync', data)
  154. }
  155. })
  156. kankan.Connect.paint.on('data', data => {
  157. socket.emit('paint', data)
  158. })
  159. kankan.render()
  160. function changeMode(mode) {
  161. kankan.Camera[mode]()
  162. }
  163. </script>
  164. </body>
  165. </html>