123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*!
- * \file src/Camera.cpp
- * \brief Camera class
- *
- * \author Mongoose
- * \author xythobuz
- */
-
- #include "global.h"
- #include <cmath>
- #include "math/Matrix.h"
- #include "Camera.h"
-
- Camera::Camera() {
- mViewDistance = 14.0f;
- mRotationDeltaX = 1.0f;
- mRotationDeltaY = 1.0f;
- mTheta = 0.0f;
- mTheta2 = 0.0f;
-
- mPos[0] = 0.0f;
- mPos[1] = 0.0f;
- mPos[2] = 0.0f;
-
- mTarget[0] = 0.0f;
- mTarget[1] = 0.0f;
- mTarget[2] = mViewDistance;
-
- mQ.setIdentity();
- }
-
- void Camera::getTarget(float target[3]) {
- target[0] = mTarget[0];
- target[1] = mTarget[1];
- target[2] = mTarget[2];
- }
-
- float Camera::getRadianYaw() {
- return mTheta;
- }
-
- float Camera::getRadianPitch() {
- return mTheta2;
- }
-
- void Camera::setPosition(float pos[3]) {
- mPos[0] = pos[0];
- mPos[1] = pos[1];
- mPos[2] = pos[2];
- }
-
- void Camera::setSensitivityX(float sens) {
- mRotationDeltaX = sens;
- }
-
- void Camera::setSensitivityY(float sens) {
- mRotationDeltaY = sens;
- }
-
- void Camera::update() {
- mTarget[0] = (mViewDistance * std::sin(mTheta)) + mPos[0];
- mTarget[1] = (mViewDistance * std::sin(mTheta2)) + mPos[1]; // + height_offset;
- mTarget[2] = (mViewDistance * std::cos(mTheta)) + mPos[2];
- }
-
- void Camera::rotate(float angle, float x, float y, float z) {
- Quaternion t, n;
- float look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
-
- t.set(angle, x, y, z);
- n = mQ * t;
- n.normalize();
-
- Matrix matrix(n);
- matrix.multiply4v(look, mTarget);
-
- for (int i = 0; i < 3; ++i)
- mTarget[i] += mPos[i];
-
- mQ = n;
- }
-
- void Camera::command(enum camera_command cmd) {
- switch (cmd) {
- case CAMERA_ROTATE_UP:
- if (mTheta2 < (OR_PI / 2)) {
- mTheta2 += mRotationDeltaY;
- rotate(mTheta2, 1.0f, 0.0f, 0.0f);
- }
- break;
-
- case CAMERA_ROTATE_DOWN:
- if (mTheta2 > -(OR_PI / 2)) {
- mTheta2 -= mRotationDeltaY;
- rotate(mTheta2, 1.0f, 0.0f, 0.0f);
- }
- break;
-
- case CAMERA_ROTATE_RIGHT:
- mTheta += mRotationDeltaX;
- rotate(mTheta, 0.0f, 1.0f, 0.0f);
- break;
-
- case CAMERA_ROTATE_LEFT:
- mTheta -= mRotationDeltaX;
- rotate(mTheta, 0.0f, 1.0f, 0.0f);
- break;
- }
- }
|