Je suis actuellement en utilisant AngularJS et Three.js pour essayer de développer un petit exemple d'un VR application. J'ai défini des contrôles basés sur de savoir si l'agent utilisateur est un appareil mobile ou non. C'est un peu louches méthode, mais c'est juste un exemple. OrbitControls sont utilisé sur des appareils mobiles, et DeviceOrientationControls sont utilisées d'une autre manière.
var controls = new THREE.OrbitControls(camera, game.renderer.domElement);
controls.noPan = true;
controls.noZoom = true;
controls.target.set(
camera.position.x,
camera.position.y,
camera.position.z
);
// Really dodgy method of checking if we're on mobile or not
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
controls = new THREE.DeviceOrientationControls(camera, true);
controls.connect();
controls.update();
}
return controls;
J'ai également créé quelques objets à afficher.
this.camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.001, 1000);
this.camera.position.set(0, 15, 0);
this.textGeometry = new THREE.TextGeometry("Hello World", { size: 5, height: 1 });
this.textMesh = new THREE.Mesh(this.textGeometry, new THREE.MeshBasicMaterial({
color: 0xFF0000, opacity: 1
}));
this.textMesh.position.set(-20, 0, -20);
this.light = new THREE.SpotLight(0x999999, 3, 300);
this.light.position.set(50, 50, 50);
this.floorGeometry = new THREE.PlaneBufferGeometry(1000, 1000);
this.floorTexture = THREE.ImageUtils.loadTexture('img/textures/wood.jpg');
this.floorTexture.wrapS = THREE.RepeatWrapping;
this.floorTexture.wrapT = THREE.RepeatWrapping;
this.floorTexture.repeat = new THREE.Vector2(50, 50);
this.floorTexture.anisotropy = this.game.renderer.getMaxAnisotropy();
this.floorMaterial = new THREE.MeshPhongMaterial({
color: 0xffffff,
specular: 0xffffff,
shininess: 20,
shading: THREE.FlatShading,
map: this.floorTexture
});
this.floor = new THREE.Mesh(this.floorGeometry, this.floorMaterial);
this.floor.rotation.x = -Math.PI / 2;
this.scene.add(this.textMesh);
this.scene.add(this.light);
this.scene.add(this.floor);
this.scene.add(this.camera);
Cela fonctionne très bien sur Chrome pour OS x, Safari pour mac OSX & Safari sur l'iPad (y compris le dispositif d'orientation des contrôles, le cas échéant).
Le problème se produit lors de l'exécution de l'application sur google Chrome pour Android. Le " coup de projecteur a été ajouté à la scène sera constamment pointé dans la même direction que la caméra. Voici une capture d'écran de l'application en cours d'exécution sur Android:
Sur tous les autres navigateur, j'ai essayé de l'utiliser, la lumière est placée à (50, 50, 50) correctement et reste statique. Dans l'exemple ci-dessus, la lumière est rendu dans le centre de la caméra, et continue de suivre l'appareil photo lorsqu'il est déplacé ou de rotation. La réelle orientation des contrôles fonctionnent tout aussi bien.
Le fait que cela se produit seulement dans un navigateur me donne des maux de tête, la démo a besoin de fonctionner sur Chrome pour Android.
Merci.
Mise à jour: Avez essayé de nombreuses solutions différentes de différentes méthodes de contrôle pour différents types d'éclairage en vain.