Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Feb 27, 2011, 12:48:50 PM (13 years ago)
Author:
landauf
Message:
  • FOV and pixel aspect ratio are now configurable
  • aspect ratio and FOV of the camera are automatically adjusted if the window is resized (note: hud and gui still scale with the window which is fine I guess)
  • the config value for FOV defines FOVx which is more convenient than FOVy
  • default FOVx is now 80 degree (it was ~57.5 degree before, so the field of view is now much larger and the ship seems more distant).
Location:
code/branches/usability/src/orxonox/graphics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/usability/src/orxonox/graphics/Camera.cc

    r7966 r7988  
    6969        this->bHasFocus_ = false;
    7070        this->bDrag_ = false;
    71         this->nearClipDistance_ = 1;
    7271        this->lastDtLagged_ = false;
    7372
     
    7574
    7675        this->setConfigValues();
     76
     77        this->configvaluecallback_changedFovAndAspectRatio();
    7778        this->configvaluecallback_changedNearClipDistance();
    7879    }
     
    9798    void Camera::setConfigValues()
    9899    {
    99         SetConfigValue(nearClipDistance_, 1.0f).callback(this, &Camera::configvaluecallback_changedNearClipDistance);
     100        SetConfigValue(fov_, 80.0f)
     101            .description("Horizontal field of view in degrees")
     102            .callback(this, &Camera::configvaluecallback_changedFovAndAspectRatio);
     103        SetConfigValue(aspectRatio_, 1.0f)
     104            .description("Aspect ratio of pixels (width / height)")
     105            .callback(this, &Camera::configvaluecallback_changedFovAndAspectRatio);
     106        SetConfigValue(nearClipDistance_, 1.0f)
     107            .description("Distance from the camera where close objects will be clipped")
     108            .callback(this, &Camera::configvaluecallback_changedNearClipDistance);
     109    }
     110
     111    /**
     112        @brief Update FOV and the aspect ratio of the camera after the config values or the window's size have changed.
     113    */
     114    void Camera::configvaluecallback_changedFovAndAspectRatio()
     115    {
     116        // the aspect ratio of the window (width / height) has to be multiplied with the pixels aspect ratio (this->aspectRatio_)
     117        float aspectRatio = this->aspectRatio_ * this->getWindowWidth() / this->getWindowHeight();
     118        this->camera_->setAspectRatio(aspectRatio);
     119
     120        // Since we use horizontal FOV, we have to calculate FOVy by dividing by the aspect ratio and using some tangents
     121        Radian fovy(2 * atan(tan(Degree(this->fov_).valueRadians() / 2) / aspectRatio));
     122        this->camera_->setFOVy(fovy);
    100123    }
    101124
     
    103126    {
    104127        this->camera_->setNearClipDistance(this->nearClipDistance_);
     128    }
     129
     130    /**
     131        @brief Inherited from WindowEventListener.
     132    */
     133    void Camera::windowResized(unsigned int newWidth, unsigned int newHeight)
     134    {
     135        this->configvaluecallback_changedFovAndAspectRatio();
    105136    }
    106137
  • code/branches/usability/src/orxonox/graphics/Camera.h

    r6417 r7988  
    3333
    3434#include "util/OgreForwardRefs.h"
     35#include "core/WindowEventListener.h"
    3536#include "tools/interfaces/Tickable.h"
    3637#include "tools/interfaces/TimeFactorListener.h"
     
    3940namespace orxonox
    4041{
    41     class _OrxonoxExport Camera : public StaticEntity, public Tickable, public TimeFactorListener
     42    class _OrxonoxExport Camera : public StaticEntity, public Tickable, public TimeFactorListener, public WindowEventListener
    4243    {
    4344        friend class CameraManager;
     
    6667            void removeFocus();
    6768            void setFocus();
     69
     70            void configvaluecallback_changedFovAndAspectRatio();
    6871            void configvaluecallback_changedNearClipDistance();
     72
     73            void windowResized(unsigned int newWidth, unsigned int newHeight);
    6974
    7075            Ogre::Camera*    camera_;
     
    7479            bool             bDrag_;
    7580            bool             lastDtLagged_;
     81            float            fov_;
     82            float            aspectRatio_;
    7683    };
    7784}
Note: See TracChangeset for help on using the changeset viewer.