76 const Vector3& cameraPosition,
const Vector3& viewCenter,
77 const Vector3& upDir, Deg fov,
const Magnum::Vector2i& windowSize,
78 const Magnum::Vector2i& viewportSize,
79 float nearClip = 0.01f,
float farClip = std::numeric_limits<float>::infinity()
81 ArcBall{cameraPosition, viewCenter, upDir, fov, windowSize}
84 setProjectionMatrix(Matrix4::perspectiveProjection(fov, Vector2{windowSize}.aspectRatio(), nearClip, farClip));
85 setViewport(viewportSize);
89 void reshape(
const Magnum::Vector2i& windowSize,
const Magnum::Vector2i& viewportSize) {
90 _windowSize = windowSize;
91 setViewport(viewportSize);
98 auto projectionMatrix() {
99 return _projectionMatrix;
102 void rotateDelta(
const float *deltaX=NULL,
const float *deltaY=NULL,
const float *deltaZ=NULL) {
103 if(deltaZ) _targetQRotation = Magnum::Quaternion::rotation(Magnum::Rad(*deltaZ), Magnum::Vector3::zAxis()) * _targetQRotation;
104 if(deltaY) _targetQRotation = Magnum::Quaternion::rotation(Magnum::Rad(*deltaY), Magnum::Vector3::yAxis()) * _targetQRotation;
105 if(deltaX) _targetQRotation = Magnum::Quaternion::rotation(Magnum::Rad(*deltaX), Magnum::Vector3::xAxis()) * _targetQRotation;
108 void translateDelta(
const Vector3 &deltaPos,
const bool &absolute=
false) {
109 if(absolute) _targetPosition += deltaPos;
110 else _targetPosition += _targetQRotation.inverted().transformVector(deltaPos);
113 void translateToOrigin() {
114 _targetPosition = Vector3(0.0);
117 void viewBottom(
const float &viewDistance) {
118 rotateToAxis(Vector3::xAxis(-1.0f), viewDistance);
122 void viewTop(
const float &viewDistance) {
123 rotateToAxis(Vector3::xAxis(), viewDistance);
126 void viewLeft(
const float &viewDistance) {
127 viewTop(viewDistance);
131 void viewRight(
const float &viewDistance) {
132 viewLeft(viewDistance);
136 void viewBack(
const float &viewDistance) {
137 viewTop(viewDistance);
141 void viewFront(
const float &viewDistance) {
142 viewBack(viewDistance);
146 fVector3 cposition() {
147 return _currentPosition;
150 fQuaternion crotation() {
151 return _currentQRotation;
155 return _currentZooming;
158 void setViewParameters(
const fVector3 &position,
const fQuaternion &rotation,
const float &zoom) {
159 _targetPosition = position;
160 _targetQRotation = rotation;
161 _targetZooming = zoom;
166 Magnum::Matrix4 _projectionMatrix;
168 Magnum::Matrix4 _rawProjectionMatrix;
172 Magnum::Vector2i _viewport;
174 void setViewport(
const Magnum::Vector2i& size) {
179 void setProjectionMatrix(
const Matrix4& matrix) {
180 _rawProjectionMatrix = matrix;
185 _aspectRatioPolicy = policy;
189 static Matrix4 aspectRatioFix(
AspectRatioPolicy aspectRatioPolicy,
const Vector2& projectionScale,
const Magnum::Vector2i& viewport) {
192 if(projectionScale.x() == 0 || projectionScale.y() == 0 || viewport.x() == 0 || viewport.y() == 0 || aspectRatioPolicy ==
AspectRatioPolicy::NotPreserved)
195 CORRADE_INTERNAL_ASSERT((projectionScale > Vector2(0)).all() && (viewport > Magnum::Vector2i(0)).all());
197 Vector2 relativeAspectRatio = Vector2(viewport)*projectionScale;
201 return Matrix4::scaling(Vector3::pad(
203 Vector2(relativeAspectRatio.y()/relativeAspectRatio.x(),
float(1)) :
204 Vector2(float(1), relativeAspectRatio.x()/relativeAspectRatio.y()), float(1)));
208 void fixAspectRatio() {
209 _projectionMatrix = aspectRatioFix(_aspectRatioPolicy, {Math::abs(_rawProjectionMatrix[0].x()), Math::abs(_rawProjectionMatrix[1].y())}, _viewport)*_rawProjectionMatrix;