В настоящее время я использую AngularJS и Three.js, чтобы попытаться разработать небольшой пример приложения VR. Я определил элементы управления на основе того, является ли пользовательский агент мобильным устройством или нет. Это изворотливый метод, но это всего лишь пример. OrbitControls используются на немобильных устройствах, а DeviceOrientationControls используются иначе.
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;
Я также создал несколько объектов для фактического отображения.
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);
Это отлично работает в Chrome для OSX, Safari для OSX и Safari на iPad (включая, в случае необходимости, элементы управления ориентацией устройства).
Проблема возникает при запуске приложения в Chrome для Android. Прожектор, который был добавлен в сцену, будет постоянно направлен в том же направлении, что и камера. Вот скриншот приложения, работающего на Android:
В каждом другом браузере, который я пытался использовать, свет позиционируется правильно (50, 50, 50) и остается статичным. В приведенном выше примере свет отображается в середине камеры и продолжает следить за камерой при ее перемещении или повороте. Фактические элементы управления ориентацией работают очень хорошо.
Тот факт, что это происходит только в одном браузере, действительно дает мне головные боли, так как демо нужно запускать в Chrome для Android.
Спасибо.
Обновление: пытались использовать множество различных решений от различных методов управления для различных типов освещения. [/p >