package com.sinuxvr.sample;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Quaternion;
import com.badlogic.gdx.math.Vector3;

/** Класс VR камеры
 * Данные об ориентации берутся из VRSensorManager при вызове update() */

public class VRCamera {
    private PerspectiveCamera leftCam;   // Левая камера
    private PerspectiveCamera rightCam;  // Правая камера
    private Vector3 position;            // Позиция VR камеры
    private float parallax;              // Расстояние между камерами
    private Vector3 direction;           // Вектор направления VR камеры
    private Vector3 up;                  // Вектор UP VR камеры
    private Vector3 upDirCross;          // Векторное произведение up и direction (понадобится в части 2, сейчас не трогаем)

    /** Конструктор */
    public VRCamera(float fov, float parallax, float near, float far) {
        this.parallax = parallax;
        leftCam = new PerspectiveCamera(fov, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight());
        leftCam.near = near;
        leftCam.far = far;
        leftCam.update();
        rightCam = new PerspectiveCamera(fov, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight());
        rightCam.near = near;
        rightCam.far = far;
        rightCam.update();
        position = new Vector3(0, 0, 0);
        direction = new Vector3(0, 0, 1);
        up = new Vector3(0, 1, 0);
        upDirCross = new Vector3().set(direction).crs(up).nor();
    }

    /** Обновление ориентации камеры */
    public void update() {
        Quaternion headQuaternion = GdxVR.vrSensorManager.getHeadQuaternion();

        // Из-за обхода стандартного механизма вращения камеры необходимо вручную
        // получать векторы ее направления из кватерниона
        direction.set(0, 0, 1);
        headQuaternion.transform(direction);
        up.set(0, 1, 0);
        headQuaternion.transform(up);
        upDirCross.set(direction);
        upDirCross.crs(up).nor();

        // Вычисление углов вращения камер из кватерниона
        float angle = 2 * (float)Math.acos(headQuaternion.w);
        float s = 1f / (float)Math.sqrt(1 - headQuaternion.w * headQuaternion.w);
        float vx = headQuaternion.x * s;
        float vy = headQuaternion.y * s;
        float vz = headQuaternion.z * s;

        // Вращение левой камеры
        leftCam.view.idt(); // Сброс матрицы вида
        leftCam.view.translate(parallax, 0, 0); // Перенос в начало координат + parallax по X
        leftCam.view.rotateRad(vx, vy, vz, -angle); // Поворот кватернионом
        leftCam.view.translate(-position.x, -position.y, -position.z); // Смещение в position
        leftCam.combined.set(leftCam.projection);
        Matrix4.mul(leftCam.combined.val, leftCam.view.val);

        // Вращение правой камеры
        rightCam.view.idt(); // Сброс матрицы вида
        rightCam.view.translate(-parallax, 0, 0); // Перенос в начало координат + parallax по X
        rightCam.view.rotateRad(vx, vy, vz, -angle); // Поворот кватернионом
        rightCam.view.translate(-position.x, -position.y, -position.z); // Смещение в position
        rightCam.combined.set(rightCam.projection);
        Matrix4.mul(rightCam.combined.val, rightCam.view.val);
    }

    /** Изменение местоположения камеры */
    public void setPosition(float x, float y, float z) {
        position.set(x, y, z);
    }

    /** Возврат левой камеры */
    public PerspectiveCamera getLeftCam() {
        return leftCam;
    }

    /** Возврат правой камеры */
    public PerspectiveCamera getRightCam() {
        return rightCam;
    }

    /** Возврат позиции, направления и вектора UP камеры, а так же их векторного произведения*/
    public Vector3 getPosition() { return position; }
    public Vector3 getDirection() { return direction; }
    public Vector3 getUp() { return up; }
    public Vector3 getUpDirCross() { return upDirCross; }
}
@@ -316,23 +316,16 @@
 e() */%0A%0A
-public 
 class VR
@@ -333,16 +333,16 @@
 amera %7B%0A
+
     priv
@@ -870,23 +870,16 @@
  */%0A    
-public 
 VRCamera
@@ -1565,31 +1565,24 @@
 %D0%BC%D0%B5%D1%80%D1%8B */%0A    
-public 
 void update(
@@ -3322,23 +3322,16 @@
  */%0A    
-public 
 void set
@@ -3434,39 +3434,32 @@
 %D0%B9 %D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D1%8B */%0A    
-public 
 PerspectiveCamer
@@ -3543,23 +3543,16 @@
  */%0A    
-public 
 Perspect
@@ -3705,31 +3705,24 @@
 %D0%B4%D0%B5%D0%BD%D0%B8%D1%8F*/%0A    
-public 
 Vector3 getP
@@ -3748,39 +3748,32 @@
 position; %7D%0A    
-public 
 Vector3 getDirec
@@ -3797,39 +3797,32 @@
 irection; %7D%0A    
-public 
 Vector3 getUp() 
@@ -3844,15 +3844,8 @@
     
-public 
 Vect
@@ -3888,8 +3888,9 @@
 oss; %7D%0A%7D
+%0A

Update VRCamera.java