informatica:linux:tour360
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
informatica:linux:tour360 [2024/03/03 20:43] – created jose | informatica:linux:tour360 [2024/03/09 16:18] (current) – jose | ||
---|---|---|---|
Line 5: | Line 5: | ||
https:// | https:// | ||
+ | |||
+ | ====== Instalación ====== | ||
+ | Descargamos el código de Marzipano | ||
+ | git clone https:// | ||
+ | Ejecutamos docker y mapeamos el directorio: | ||
+ | docker run --name marzipano -v / | ||
+ | |||
+ | Instalamos Marzipano: | ||
+ | npm install | ||
+ | npm run dev | ||
+ | Ya lo tenemos funcionando en http:// | ||
===== Parámetros ===== | ===== Parámetros ===== | ||
Line 17: | Line 28: | ||
pitch: el ángulo del suelo al techo, va de -1 a 1 \\ | pitch: el ángulo del suelo al techo, va de -1 a 1 \\ | ||
fov: es el zoom, de 0 a 1.4 | fov: es el zoom, de 0 a 1.4 | ||
+ | |||
+ | |||
+ | < | ||
+ | var currentScene = null; | ||
+ | |||
+ | |||
+ | |||
+ | function switchScene(scene) { | ||
+ | stopAutorotate(); | ||
+ | if (currentScene !== null) { | ||
+ | console.log(" | ||
+ | if ( currentScene.data.id == " | ||
+ | scene.data.initialViewParameters.yaw=1.7; | ||
+ | } | ||
+ | } else { | ||
+ | console.log(" | ||
+ | } | ||
+ | console.log(scene.data.initialViewParameters.yaw); | ||
+ | scene.view.setParameters(scene.data.initialViewParameters); | ||
+ | scene.scene.switchTo(); | ||
+ | startAutorotate(); | ||
+ | updateSceneName(scene); | ||
+ | updateSceneList(scene); | ||
+ | |||
+ | currentScene = scene; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Modificaciones ====== | ||
+ | ===== Girar escena de un hotspor ===== | ||
+ | Cuando clickamos en un hotspot la escena viene con la orientación por defecto, pero no es lo mismo si venimos por la izquierda que por la derecha o si vamos de adelante hacía atrás. | ||
+ | |||
+ | Añadimos el siguiente parámetro en el hotspot de una nuestra escena. Giro indica lo que giramos yaw en la escena target: | ||
+ | < | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | En este caso es dentro de la escena Portalon_01 los dos hotspot que tiene. Significa que cuando estemos en la escena " | ||
+ | |||
+ | Para que esto funcione, tenemos que modificar el fichero index.js dentro de la función createLinkHotspotElement el bloque "Add click event handler" | ||
+ | |||
+ | ORIGINAL: | ||
+ | < | ||
+ | // Add click event handler. | ||
+ | wrapper.addEventListener(' | ||
+ | switchScene(findSceneById(hotspot.target)); | ||
+ | }); | ||
+ | </ | ||
+ | MODIFICADO | ||
+ | < | ||
+ | // Add click event handler. | ||
+ | wrapper.addEventListener(' | ||
+ | // Aquí es donde modificas la propiedad ' | ||
+ | var scene = findSceneById(hotspot.target); | ||
+ | if (scene && scene.data.initialViewParameters) { | ||
+ | // Actualiza el ' | ||
+ | scene.data.initialViewParameters.yaw = hotspot.giro; | ||
+ | } | ||
+ | // Luego cambia a la escena con el ' | ||
+ | switchScene(scene); | ||
+ | }); | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Añadir mapa con la posición y orientación ===== | ||
+ | Copiamos el fichero mapa.png con capas transparentes en el directorio raiz donde está index.js | ||
+ | |||
+ | En el fichero index.js, entre | ||
+ | // Initialize viewer. | ||
+ | y | ||
+ | // Create scenes, | ||
+ | Añadimos el minimapa | ||
+ | < | ||
+ | // Crear un contenedor para el mini-mapa | ||
+ | var miniMapContainer = document.createElement(' | ||
+ | miniMapContainer.style.position = ' | ||
+ | miniMapContainer.style.right = ' | ||
+ | miniMapContainer.style.bottom = ' | ||
+ | miniMapContainer.style.width = ' | ||
+ | miniMapContainer.style.height = ' | ||
+ | miniMapContainer.style.zIndex = ' | ||
+ | |||
+ | // Añadir el mini-mapa al contenedor | ||
+ | var miniMap = document.createElement(' | ||
+ | miniMap.src = ' | ||
+ | miniMap.style.width = ' | ||
+ | miniMap.style.height = ' | ||
+ | miniMap.style.pointerEvents = ' | ||
+ | |||
+ | // Añadir el marcador al contenedor | ||
+ | var marker = document.createElement(' | ||
+ | marker.style.position = ' | ||
+ | marker.style.width = ' | ||
+ | marker.style.height = ' | ||
+ | marker.style.backgroundColor = ' | ||
+ | marker.style.borderRadius = ' | ||
+ | marker.style.zIndex = ' | ||
+ | // Posicionamiento inicial del marcador dentro del contenedor del mini-mapa | ||
+ | marker.style.transition = 'top 0.5s ease-out, left 0.5s ease-out'; | ||
+ | marker.style.left = ' | ||
+ | marker.style.top = ' | ||
+ | |||
+ | // Añadir el mini-mapa y el marcador al contenedor | ||
+ | miniMapContainer.appendChild(miniMap); | ||
+ | miniMapContainer.appendChild(marker); | ||
+ | |||
+ | // Finalmente, añadir el contenedor del mini-mapa al body o al contenedor principal | ||
+ | document.body.appendChild(miniMapContainer); | ||
+ | </ | ||
+ | |||
+ | Creamos la función actualizarPosicionDelMarcador al final del documento antes de estas líneas: | ||
+ | |||
+ | // Display the initial scene. | ||
+ | switchScene(scenes[0]); | ||
+ | |||
+ | Función actualizarPosicionDelMarcador | ||
+ | < | ||
+ | function actualizarPosicionDelMarcador(nuevaX, | ||
+ | // Suponiendo que ' | ||
+ | // y ' | ||
+ | // ' | ||
+ | // relativas al contenedor del mini-mapa. | ||
+ | |||
+ | marker.style.left = nuevaX + ' | ||
+ | marker.style.top = nuevaY + ' | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | La función la llamamos dentro de la función switchScene: | ||
+ | < | ||
+ | function switchScene(scene) { | ||
+ | stopAutorotate(); | ||
+ | scene.view.setParameters(scene.data.initialViewParameters); | ||
+ | scene.scene.switchTo(); | ||
+ | startAutorotate(); | ||
+ | updateSceneName(scene); | ||
+ | updateSceneList(scene); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | La ponemos al final del todo después de updateSceneList | ||
+ | < | ||
+ | function switchScene(scene) { | ||
+ | stopAutorotate(); | ||
+ | scene.view.setParameters(scene.data.initialViewParameters); | ||
+ | scene.scene.switchTo(); | ||
+ | startAutorotate(); | ||
+ | updateSceneName(scene); | ||
+ | updateSceneList(scene); | ||
+ | actualizarPosicionDelMarcador(scene.data.initialViewParameters.x, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ahora en cada escena tenemos que poner los valores x,y de la posición que están en el mapa en la sección initialViewParameters. El punto 0,0 es la esquina superior izquierda | ||
+ | < | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Añadir nuevas fotos sin Marzipano tool ====== | ||
+ | Hay que hacer 3 pasos: | ||
+ | < | ||
+ | 1. Convertir foto en directorios y copiar en directorio tiles | ||
+ | 2. Modificar data.js | ||
+ | 3. Modificar index.html | ||
+ | </ | ||
+ | Descargamos la foto en formato rectangular. Por ejemplo si la tenemos subida a kuula y la editamos, abajo a la derecha está la opción download | ||
+ | |||
+ | Para convertir las fotos en formato Marzipano usamos este repositorio nodejs y este repo: | ||
+ | https:// | ||
+ | |||
+ | Por ejemplo tenemos nuestra foto en la ruta: | ||
+ | / | ||
+ | Ejecutamos docker con node | ||
+ | | ||
+ | docker run -ti -v / | ||
+ | Bajamos el repositorio: | ||
+ | git clone https:// | ||
+ | cd marzipano-pano-tiler | ||
+ | npm install | ||
+ | Copiamos la foto o fotos en el directorio input | ||
+ | mv / | ||
+ | Convertimos la foto: | ||
+ | node index.js | ||
+ | Tarda un poco, unos 2 minutos, pone " | ||
+ | |||
+ | < | ||
+ | ..cubemap created | ||
+ | |||
+ | ..planta2_01 - preview created | ||
+ | ..planta2_01 - layer 0 created | ||
+ | ..planta2_01 - layer 1 created | ||
+ | ..planta2_01 - layer 2 created | ||
+ | ..planta2_01 - layer 3 created | ||
+ | |||
+ | ..images fetched | ||
+ | </ | ||
+ | En el directorio output nos ha creado lo siguiente con un montón de fotos en cada directorio: | ||
+ | < | ||
+ | . | ||
+ | `-- planta2_01 | ||
+ | |-- 1 | ||
+ | | |-- b | ||
+ | | | ||
+ | | |-- d | ||
+ | | | ||
+ | | |-- f | ||
+ | | | ||
+ | | |-- l | ||
+ | | | ||
+ | | |-- r | ||
+ | | | ||
+ | | `-- u | ||
+ | | `-- 0 | ||
+ | |-- 2 | ||
+ | | |-- b | ||
+ | | | ||
+ | | | ||
+ | | |-- d | ||
+ | | | ||
+ | | | ||
+ | | |-- f | ||
+ | | | ||
+ | | | ||
+ | | |-- l | ||
+ | | | ||
+ | | | ||
+ | | |-- r | ||
+ | | | ||
+ | | | ||
+ | | `-- u | ||
+ | | |-- 0 | ||
+ | | `-- 1 | ||
+ | |-- 3 | ||
+ | | |-- b | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- d | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- f | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- l | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- r | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | `-- u | ||
+ | | |-- 0 | ||
+ | | |-- 1 | ||
+ | | |-- 2 | ||
+ | | `-- 3 | ||
+ | |-- 4 | ||
+ | | |-- b | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- d | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- f | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- l | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | |-- r | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | `-- u | ||
+ | | |-- 0 | ||
+ | | |-- 1 | ||
+ | | |-- 2 | ||
+ | | |-- 3 | ||
+ | | |-- 4 | ||
+ | | |-- 5 | ||
+ | | |-- 6 | ||
+ | | `-- 7 | ||
+ | `-- cube-map | ||
+ | </ | ||
+ | |||
+ | Copiamos el directorio dentro de la instalación de marzipano en el directorio tiles | ||
+ | |||
+ | Por ejemplo si hemos añadido planta2_01 se suele poner el ID: 3-planta2_01 para tenerlos ordenados. | ||
+ | |||
+ | El directorio tiles nos quedaría mas o menos así | ||
+ | < | ||
+ | └── tiles | ||
+ | ├── 0-portalon_01 | ||
+ | ├── 1-portalon_02 | ||
+ | ├── 2-patio_01 | ||
+ | └── 3-planta2_01 | ||
+ | </ | ||
+ | |||
+ | Modificamos el fichero data.js añadiendo otra entrada al vector json de Scenes. Podemos copiar otro tal cual y después ir cambiando los parámetros, | ||
+ | |||
+ | < | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Y por último tenemos que añadir el DIV en el fichero index.html: | ||
+ | < | ||
+ | <div id=" | ||
+ | <ul class=" | ||
+ | |||
+ | <a href=" | ||
+ | <li class=" | ||
+ | </a> | ||
+ | |||
+ | <a href=" | ||
+ | <li class=" | ||
+ | </a> | ||
+ | <a href=" | ||
+ | <li class=" | ||
+ | </a> | ||
+ | <a href=" | ||
+ | <li class=" | ||
+ | </a> | ||
+ | </ul> | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |
informatica/linux/tour360.1709498581.txt.gz · Last modified: 2024/03/03 20:43 by jose