MISE À JOUR FINALE 13/09/2019 23h50: Ce code fonctionne avec plusieurs marqueurs personnalisés, mais les marqueurs ne peuvent pas être trop similaires. Mes précédents marqueurs personnalisés étaient tous des étoiles avec de légères différences, et je pense que cela a déclenché en quelque sorte. Mais avec des marqueurs plus récents et plus uniques, cela fonctionne.
Pour une raison quelconque, cependant, cela n'a pas affecté le résultat lors de l'utilisation de la méthode des "composants séparés".
Mise à jour: 13/09/2019: Le code ci-dessous fonctionne avec hiro et kanji marqueurs prédéfinis et un marqueur personnalisé. Cependant, lorsque j'ajoute plusieurs marqueurs personnalisés, les vidéos se figent sur les marqueurs supplémentaires. J'aimerais que chaque marqueur déclenche des vidéos uniques (certaines vidéos seront réutilisées dans plusieurs marqueurs). Dans mon code actuel, je les ai tous déclenchant les deux vidéos. * Comment puis-je faire fonctionner ce code avec plusieurs marqueurs personnalisés?
<a-assets > <video crossOrigin="Anonymous" preload="auto" Id="vid" loop="true" webkit-playsinline playsinline controls> <source type="video/webm" src="assets\textures\alpha.webm"> <h3>Error : Your browser does not support.</h3> <!-- FOR NOTMAL VIDEO YOU CAN USE MP4 or WEBM BUT FOR ALPHA VIDEO YOU NEED TO USE .WEBM FORMAT--> </video> <video crossOrigin="Anonymous" preload="auto" Id="videonew" loop="true" webkit-playsinline playsinline controls> <source type="video/webm" src="assets\textures\VideoNew.mp4"> <h3>Error : Your browser does not support.</h3> <!-- FOR NOTMAL VIDEO YOU CAN USE MP4 or WEBM BUT FOR ALPHA VIDEO YOU NEED TO USE .WEBM FORMAT--> </video> </a-assets>
Mise à jour le 12/09/19: comment lire des vidéos séparées avec des marqueurs séparés, avec option réutiliser certaines vidéos? Avec le code suivant, les vidéos s'affichent sous forme d'image statique:
<!-- Video Player --> <script> AFRAME.registerComponent('vidhandler', { init: function() { this.toggle = false; this.vidNodes = document.querySelectorAll("#vid, #videonew"); for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].pause(); } }, tick: function() { if (this.el.object3D.visible == true) { if (!this.toggle) { this.toggle = true; for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].play(); } } } else { this.toggle = false; for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].pause(); } } } }); </script>
Question d'origine:
Veuillez me pardonner car je suis très novice dans ce domaine. ..
J'utilise ar.js avec aframe pour créer une expérience webAR. J'utilise deux marqueurs différents pour déclencher deux vidéos différentes.
Comment faire pour que le composant Aframe.register déclenche mes deux vidéos séparément? Les deux vidéos sont répertoriées en tant qu'éléments, avec les ID suivants: #vid #videonew
les résultats attendus sont pour les deux marqueurs d'afficher une vidéo unique en boucle, que les deux marqueurs soient affichés sur la webcam ou si ce n'est qu'un des marqueurs. Mais le résultat réel est que les vidéos ne sont lues que si les deux marqueurs sont affichés sur la webcam. Sinon, individuellement, les vidéos s'affichent sous forme d'image statique.
<!-- vidhandler component --> <script> AFRAME.registerComponent('vidHandler', { // define a variable in which we will keep the video element schema: { targets: {type: "string"} }, init: function() { this.toggle = false; this.vidNodes = document.querySelectorAll(this.data.targets); for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].pause(); } }, tick: function() { if (this.el.object3D.visible == true) { if (!this.toggle) { this.toggle = true; for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].play(); } } } else { this.toggle = false; for (let i = 0; i < this.vidNodes.length; i++) { this.vidNodes[i].pause(); } } } }); </script>
<!-- A-FRAME --> <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script> <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.6.0/aframe/build/aframe- ar.js"></script> <script src="https://cdn.rawgit.com/donmccurdy/aframe- extras/v4.1.2/dist/aframe-extras.min.js"></script> <script src="https://rawgit.com/mayognaise/aframe-gif- shader/master/dist/aframe-gif-shader.min.js"></script> <!-- jQuery library --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> </script> <!-- Latest compiled and minified CSS --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"> </script> <!-- vidhandler component --> <script> AFRAME.registerComponent('vidhandler', { schema: { target: {type: 'string'} }, init: function() { this.videoNodes = document.querySelectorAll(this.data.target) }, tick: function() { if (this.el.object3D.visible == true) { if (!this.toggle) { this.toggle = true; for (let i = 0; i < this.videoNodes.length; i++) { this.videoNodes[i].play(); } } } else { if (this.toggle) { for (let i = 0; i < this.videoNodes.length; i++) { this.videoNodes[i].pause(); } this.toggle = false; } } } }); </script> <!-- assets for vidhandler --> <a-assets > <video crossOrigin="Anonymous" Id="vid" loop="true"src="assets\textures\alpha.webm"> </video> <video crossOrigin="Anonymous" Id="videonew" loop="true" src="assets\textures\VideoNew.mp4"> </video> </a-assets> <!-- marker1: hollywood star 1 --> <a-marker vidhandler="target: #vid, #videonew" type='pattern' url='https://raw.githubusercontent.com/merowell/custom-markers-with-video/master/aframe/examples/assets/hollywood-stars/patt/pattern-hollywood-star1.patt'> <!-- add transparent video (.webm) --> <a-plane position='0 .3 0' width='3' height='2' rotation="-90 0 0" material='transparent:true;alphaTest:0;src:#vid'></a-plane> <!-- add non transparent video (.mp4) --> <a-plane position='0 .2 0' width='1.5' height='1.5' rotation="-90 0 0" material='src:#videonew'></a-plane> </a-marker> <!-- marker2: hollywood star 2 --> <a-marker vidhandler="target: #vid, #videonew" type='pattern' url='https://raw.githubusercontent.com/merowell/custom-markers-with-video/master/aframe/examples/assets/hollywood-stars/patt/pattern-hollywood-star2.patt'> <!-- add transparent video (.webm) --> <a-plane position='0 .3 0' width='3' height='2' rotation="-90 0 0" material='transparent:true;alphaTest:0;src:#vid'></a-plane> <!-- add non transparent video (.mp4) --> <a-plane position='0 .2 0' width='1.5' height='1.5' rotation="-90 0 0" material='src:#videonew'></a-plane> </a-marker>
3 Réponses :
document.querySelectorAll (sélecteur) renvoie un conteneur (NodeList) avec les éléments correspondants.
Pour appeler .play ()
sur chaque vidéo, vous devez parcourez le conteneur et appelez-le sur chaque élément.
Chaque this.vid.play ()
, et this. vid.pause ()
doit être remplacé par:
// <a-marker videohandler="videos: #one, #two"> // videohandler insides: schema: { videos: {type: 'string'} }, init: function() { this.videoNodes = document.querySelectorAll(this.data.target) }, // the rest like in the first case
De plus, il ne ferait pas de mal de le renommer en this.videoNodes
:)
Découvrez ce problème comment vous pouvez faire déclenchement de deux vidéos avec aframe et ar.js
Pas besoin de dupliquer le composant pour chaque marqueur, il vous suffit d'une modification qui permettra de fournir la vidéo au composant. De cette façon, vous pouvez utiliser le même composant, pour différents éléments vidéo. Nous pouvons y parvenir avec les composants schema .
js - en utilisant l'élément du schéma
<a-assets> <video id="one"> <video id="two"> </a-assets> <a-marker preset="hiro" vidhandler="video: #one"> <a-box material='src: #one'></a-box> </a-marker> <a-marker preset="kanji" vidhandler="video: #two"> <a-box material='src: #two'></a-box> </a-marker>
HTML - fournir l'élément au composant
AFRAME.registerComponent('vidHandler', { // define a variable in which we will keep the video element schema: { video: {type: 'selector'}, }, init: function() { // use the video from the schema this.video = this.data.video this.video.pause() }, tick: function() { if (this.el.object3D.visible == true) { if (!this.toggle) { this.toggle = true; this.video.play() } } else { this.toggle = false; this.video.pause() } } })
Nous fournissons maintenant un sélecteur au composant, mais nous pouvons également fournir une chaîne pour alimenter la méthode document.querySelectorAll ()
:
for (let i = 0; i < this.vid.length; i++) { this.vid[i].play() // or this.vid[i].pause() }
Bien qu'il y ait quelques problèmes ici.
Problème de travail ici .
J'ai corrigé le composant avec vos suggestions, mais j'obtiens toujours le même résultat. Seul #vid fonctionne, tandis que #videonew n'est qu'une image statique. J'ai besoin de rechercher comment parcourir le conteneur comme vous l'avez dit - je ne sais pas vraiment ce que cela signifie. Désolé je suis un noob! En dehors de remplacer littéralement "this.vid.play/pause ()" par "for (let i = 0; i
Je ne peux pas faire un exemple d'atm ar.js (je le ferai plus tard), mais vérifiez this . Appuyez sur espace pour lire les vidéos, relâchez-les pour les mettre en pause.
Piotr, je suis désolé pour tous les commentaires, je l'ai fait fonctionner très bien, également avec la transparence. Mais pour une raison quelconque, cela ne fonctionne que pour un marqueur. Je peux mettre deux vidéos dans un marqueur et elles fonctionnent toutes les deux. Mais je veux deux marqueurs avec deux vidéos distinctes.
votre code ajusté fonctionne très bien pour lire des vidéos séparées avec deux marqueurs différents. Mais si je voulais dire que hiro joue #one et que les kanji jouent #one et #two, aurais-je alors besoin de créer des composants séparés?
@merowell comme maintenant? La réponse est-elle claire du tout avec toutes ces informations?
les vidéos apparaissent maintenant comme un avion blanc. J'ai mis à jour mon message d'origine avec le code que j'ai maintenant pour le composant vidhandler. Est-ce que cela vous convient?
@merowell j'ai ajouté une mise à jour, faites-moi savoir si c'est ce que vous recherchez
Merci beaucoup! J'apprécie beaucoup votre patience - j'ai encore beaucoup à apprendre. Vous réglez! J'imagine que vos réponses réfléchies aideront d'autres personnes qui ont pris l'appât «vous pouvez créer un webAR avec 10 lignes de HTML». haha :)
Ahhh @piotr Je pensais que cela fonctionnait bien, mais il semble que lorsque je retire le premier marqueur de la webcam, le marqueur suivant se fige sur la vidéo là où il s'était arrêté. Peut-être que l'ajout de l'horodatage aiderait? Forcer à jouer depuis le début. Comment pourrais-je faire ça? Ou peut-être avez-vous une autre idée de ce qui pourrait en être la cause.
Je poste mon code le plus récent. Je pense que cela pourrait avoir quelque chose à voir avec le fait que j'utilise des vidéos transparentes, donc Aframe v 0.8? Parce que votre exemple fonctionne parfaitement, mais lorsque je l'applique avec mes ressources, les vidéos se figent.
ok, après le dépannage, j'ai compris que lorsque je remplace mes marqueurs personnalisés par les marqueurs hiro / kanji prédéfinis, cela fonctionne. Des idées sur les raisons pour lesquelles cela ne fonctionnerait pas avec les marqueurs personnalisés?
Très bien @piotr, j'ai compris que mes marqueurs personnalisés se ressemblaient trop et c'est pourquoi plusieurs marqueurs personnalisés le déclenchaient. Merci encore pour toute votre aide!
@Piotr a répondu à cette question et a fourni un excellent exemple de ce problème: https://glitch.com/edit/#!/stack-57863016?path=arjs.html:3:0
Merci! De plus, là où j'ai échoué, c'est que je n'incluais pas «vidhandler» dans la section a-marker.
Enfin! Je l'ai compris --- Afin de pouvoir lire des vidéos séparées avec des marqueurs séparés, j'avais besoin de créer un deuxième composant. Chaque marqueur a besoin d'un gestionnaire de composant unique, au moins, c'est ainsi que je l'ai fait fonctionner.
Pas besoin de répliquer le composant, consultez ma réponse mise à jour