159 lines
3.8 KiB
C++
159 lines
3.8 KiB
C++
//
|
|
// VROCamera.h
|
|
// ViroRenderer
|
|
//
|
|
// Created by Raj Advani on 11/13/15.
|
|
// Copyright © 2015 Viro Media. All rights reserved.
|
|
//
|
|
|
|
#ifndef VROCamera_h
|
|
#define VROCamera_h
|
|
|
|
#include "VROVector3f.h"
|
|
#include "VROQuaternion.h"
|
|
#include "VROMatrix4f.h"
|
|
#include "VROViewport.h"
|
|
#include "VROFrustum.h"
|
|
#include "VROFieldOfView.h"
|
|
|
|
enum class VROCameraRotationType {
|
|
Standard,
|
|
Orbit
|
|
};
|
|
|
|
/*
|
|
The default forward and up vectors. These are rotated by the base and head
|
|
rotation to derive the actual forward and up vectors.
|
|
*/
|
|
static const VROVector3f kBaseForward = { 0, 0, -1 };
|
|
static const VROVector3f kBaseUp = { 0, 1, 0 };
|
|
|
|
class VROCamera {
|
|
|
|
public:
|
|
|
|
VROCamera();
|
|
virtual ~VROCamera();
|
|
|
|
void setPosition(VROVector3f position);
|
|
void setHeadRotation(VROMatrix4f headRotation);
|
|
void setBaseRotation(VROMatrix4f baseRotation);
|
|
void setViewport(VROViewport viewport);
|
|
void setFOV(VROFieldOfView fov);
|
|
void setProjection(VROMatrix4f projection);
|
|
|
|
VROVector3f getPosition() const {
|
|
return _position;
|
|
}
|
|
VROVector3f getForward() const {
|
|
return _forward;
|
|
}
|
|
VROVector3f getUp() const {
|
|
return _up;
|
|
}
|
|
VROQuaternion getRotation() const {
|
|
return _rotation;
|
|
}
|
|
VROMatrix4f getLookAtMatrix() const {
|
|
return _lookAtMatrix;
|
|
}
|
|
VROMatrix4f getProjection() const {
|
|
return _projection;
|
|
}
|
|
const VROFrustum &getFrustum() const {
|
|
return _frustum;
|
|
}
|
|
VROFieldOfView getFieldOfView() const {
|
|
return _fov;
|
|
}
|
|
VROViewport getViewport() const {
|
|
return _viewport;
|
|
}
|
|
float getNCP() const {
|
|
return _ncp;
|
|
}
|
|
float getFCP() const {
|
|
return _fcp;
|
|
}
|
|
void computeLookAtMatrix();
|
|
void computeFrustum();
|
|
|
|
float getWorldPerScreen(float distance) const;
|
|
private:
|
|
|
|
VROVector3f _position;
|
|
|
|
/*
|
|
The camera forward vector. Normalized vector indicating where the camera
|
|
is pointing.
|
|
*/
|
|
VROVector3f _forward;
|
|
|
|
/*
|
|
The camera up vector. Normalized vector indicating which direction is 'up'.
|
|
*/
|
|
VROVector3f _up;
|
|
|
|
/*
|
|
The camera quaternion represents the rotation from (0, 0, -1) required to
|
|
achieve the camera's current orientation. This factors in both base
|
|
rotation and head rotation.
|
|
*/
|
|
VROQuaternion _rotation;
|
|
|
|
/*
|
|
The current head rotation. Head rotation is set by the user's HMD orientation.
|
|
Total rotation is head rotation plus base rotation.
|
|
*/
|
|
VROMatrix4f _headRotation;
|
|
|
|
/*
|
|
The base rotation. This is set by the application. Total rotation is head
|
|
rotation plus base rotation.
|
|
*/
|
|
VROMatrix4f _baseRotation;
|
|
|
|
/*
|
|
The last computed lookAt matrix for this camera. This matrix combines all rotation
|
|
and position information into one unified view matrix. Note like all matrices in
|
|
the VROCamera, this is eye-independent (the eyeFromHeadMatrix is not considered).
|
|
*/
|
|
VROMatrix4f _lookAtMatrix;
|
|
|
|
/*
|
|
The projection matrix associated with this camera.
|
|
*/
|
|
VROMatrix4f _projection;
|
|
|
|
/*
|
|
The frustum associated with this camera. Derived from the lookAtMatrix and the
|
|
projection matrix.
|
|
*/
|
|
VROFrustum _frustum;
|
|
|
|
/*
|
|
The current viewport and FOV.
|
|
*/
|
|
VROViewport _viewport;
|
|
VROFieldOfView _fov;
|
|
|
|
/*
|
|
The camera's near and far clipping planes.
|
|
*/
|
|
float _ncp, _fcp;
|
|
|
|
void onRotationChanged();
|
|
|
|
};
|
|
|
|
class VROCameraDelegate {
|
|
public:
|
|
VROCameraDelegate() {};
|
|
virtual ~VROCameraDelegate() {};
|
|
virtual void onCameraTransformationUpdate(VROVector3f pos,
|
|
VROVector3f rot,
|
|
VROVector3f forward) = 0;
|
|
};
|
|
|
|
#endif /* VROCamera_h */
|