Convertir 2:1 équirectangulaire panorama de cube map
Je suis actuellement en train de travailler sur un simple panorama 3D viewer pour un site web. Mobiles pour des raisons de performances, je suis en utilisant le three.js
CSS3 moteur de rendu. Cela nécessite une cube map, divisé en 6 images.
J'enregistre les images sur l'iPhone avec Google Photosphère application, ou des applications similaires qui créent de 2:1 équirectangulaire panoramas. J'ai ensuite redimensionner et convertir à un cubemap avec ce site: http://gonchar.me/panorama/ (Flash)
De préférence, j'aimerais faire la conversion moi-même, soit à la volée dans three.js si c'est possible, ou dans Photoshop. J'ai trouvé Andrew Hazelden Photoshop actions, et ils semblent un peu étroits, mais pas de conversion directe est disponible. Est-il un moyen mathématique de convertir ces, ou une sorte de script qui est-il? J'aimerais éviter de passer par une 3D app comme Blender, si possible.
Peut-être que c'est un long shot, mais j'ai pensé que je voudrais vous demander. J'ai okay expérience avec javascript, mais je suis assez nouveau à three.js
. Je suis aussi hésitants à s'appuyer sur le WebGL fonctionnalité, car il semble lente ou buggy sur des appareils mobiles. Le soutien est encore inégale.
- Il y a des façons de le faire en javascript qui utilise CSS ou une toile. Cependant, je ne suis pas sûr que cela soit compatible avec three.js. stackoverflow.com/questions/8912917/...
- J'ai créé un script python pour ce faire, github.com/seiferteric/cubemap
Vous devez vous connecter pour publier un commentaire.
Compte tenu de l'excellente accepté de répondre, je voulais ajouter mon correspondant c++ mise en œuvre, basé sur OpenCV.
Pour ceux qui ne sont pas familiers avec OpenCV, pensez à
Mat
comme une image. Nous avons d'abord que la construction de deux cartes qui reconfigurer à partir de la dernière image de notre correspondant cubemap visage. Ensuite, nous faisons le levage lourd (c'est à dire la reconfiguration à l'interpolation) à l'aide d'OpenCV.Le code peut être rendu plus compact, si la lisibilité n'est pas un souci.
Donnée d'entrée suivantes:
Suivantes visages sont générés:
Image courtoisie de Optonaut.
mapx.at<float>(y, x) = u; mapy.at<float>(y, x) = v;
J'ai écrit un script pour couper le générés cubemap dans des fichiers individuels (posx.png, negx.png, posy.png, negy.png, posz.png et negz.png). Il sera également le pack de 6 fichiers dans un .fichier zip.
La source est ici: https://github.com/dankex/compv/blob/master/3d-graphics/skybox/cubemap-cut.py
Vous pouvez modifier le tableau pour définir les fichiers de l'image:
Les fichiers convertis sont:
Trouve cette question, et même si les réponses sont bonnes, je pense qu'il y a encore un peu de terrain à découvert, voici donc mes deux cents.
D'abord: à moins que vous vraiment besoin de convertir les images vous-même (c'est à dire en raison de certains logiciels spécifiques exigence), ne pas.
La raison en est que, même si il est très simple de correspondance entre la projection équirectangulaire et le cube de projection, le mappage entre les régions n'est pas simple: lorsque vous établissez une correspondance entre un point spécifique de votre image de destination et un point de la source avec un calcul élémentaire, dès que vous convertissez les deux points de pixels par arrondissement vous faites un très brut rapprochement qui ne prend pas en considération la taille des pixels, et la qualité de l'image est lié à être faible.
Deuxième: même si vous avez besoin de faire la conversion au moment de l'exécution, êtes-vous sûr que vous avez besoin pour faire la conversion à tous? Qu'il existe quelques très strictes problème de performance, si vous avez juste besoin d'un skybox, créer une très grosse sphère, point de équirectangulaire texure sur elle, et vous partez. Trois JS fournit la sphère déjà, comme je me souviens bien 😉
Troisième: la NASA propose un outil pour convertir entre toutes les projections (j'ai juste trouvé, testé et fonctionne comme un charme). Vous pouvez le trouver ici:
G. Projecteur — Carte Mondiale Projecteur
et je trouve raisonnable de penser que les gars savent ce qu'ils font 😉
Espère que cette aide
Mise à JOUR: il s'avère que le "gars" savent ce qu'ils font jusqu'à un certain point: le générés cubemap a une hideuse frontière qui fait la conversion n'est pas si facile...
Mise à JOUR 2: trouvé l'outil précieux pour la projection équirectangulaire à cubemap de conversion, et il est appelé
erect2cubic
.C'est un petit utilitaire qui génère un script pour être nourris à hugin, de cette façon:
(information détournés de Vinay est Hacks page)
et va générer tous les 6 cubemap visages. Je l'utilise pour mon projet et il fonctionne comme un charme!
Le seul inconvénient de cette approche est que le script
erect2cubit
il n'est pas dans le standard de la distribution Ubuntu (qui est ce que j'utilise) et j'ai eu recours à des instructions sur ce lien:Blog décrivant comment installer et utiliser erect2cubic
pour savoir comment l'installer.
En vaut la peine!
Voici un (naïvement) version modifiée de Salix Alba est absolument fantastique répondre qui convertit une face à la fois, crache de six images différentes, et conserve l'image d'origine du type de fichier.
Mis à part le fait la plupart des cas d'utilisation probablement s'attendre six images distinctes, le principal avantage de la conversion d'un visage à un moment, c'est qu'il vous permet de travailler avec des images énormes beaucoup moins gourmande en mémoire.
cmft Studio prend en charge
conversion/filtering
de diversHDR/LDR
projections decubemaps
.https://github.com/dariomanesku/cmftStudio
Voici une version JavaScript de Benjamn Dobell du code. Le
convertFace
doit être passé deuxìmageData
objets et un visage ID (0-6).Le code fourni peut en toute sécurité être utilisé dans un site web travailleur, car il n'a pas de dépendances.
Il existe différentes représentations de l'environnement des cartes. Voici un bel aperçu.
Vue D'Ensemble - Panoramic Images
Si vous utilisez la Photosphère (ou tout panorama application pour cette question), vous avez probablement déjà à l'horizontale latitude /longitude représentation.
Vous pouvez ensuite il suffit de dessiner une texture three.js SphereGeometry. Voici un tutoriel sur la façon de rendre la terre.
Tutoriel - Comment Faire de la Terre en WebGL?
Bonne chance :).
Très simple, C++ application qui convertit une projection équirectangulaire panorama de cube map en fonction de la réponse par Salix Alba => https://github.com/denivip/panorama
J'ai créé une solution à ce problème en utilisant OpenGL et fait un outil de ligne de commande autour d'elle. Il fonctionne à la fois avec des images et des vidéos, et c'est le plus rapide de l'outil que j'ai trouvé là-bas.
Convert360 - Projet sur GitHub.
OpenGL Shader - Le fragment shader utilisé pour la re-projection.
L'utilisation est aussi simple que:
Pour obtenir quelque chose comme ceci:
Peut-être que je suis absent quelque chose ici. Mais il semble que la plupart, si pas tous les transformation de code peut être quelque peu incorrect. Ils prennent un panorama sphérique (équirectangulaire --- 360 ° horizontalement et 180 ° verticalement) et semblent convertir les faces du cube à l'aide d'un cartésien <-> cylindrique de transformation. Ne devraient-ils pas être l'aide d'un cartésien <-> sphérique de transformation. Voir http://mathworld.wolfram.com/SphericalCoordinates.html
Je suppose que tant qu'ils inverser le calcul d'aller de l'faces du cube pour le panorama, alors il devrait fonctionner. Mais les images des faces du cube peut être légèrement différent lors de l'utilisation de la partie sphérique de la transformation.
Si je commence avec cette dernière (panorama sphérique):
Alors si j'utilise un cylindrique de transformation (dont je ne suis pas sûr à 100% est correct en ce moment), j'obtiens ce résultat:
Mais si j'utilise une sphère de transformation, j'obtiens ce résultat:
Ils ne sont pas les mêmes. Mais mon sphérique résultat de transformation semble correspondre à la suite de Merci Xif au catalogue, mais son lien ne montre pas le genre de transformation, il est de l'aide, du mieux que je peux lire.
Je suis malentendu le code utilisé par de nombreux contributeurs à ce sujet?