Add CameraIntrinsic class

This commit is contained in:
2020-12-13 13:15:04 +01:00
parent 1c682f8783
commit 39ae50a2c4

View File

@@ -0,0 +1,101 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "Math.hpp"
namespace openVulkanoCpp::Math
{
class CameraIntrinsic
{
public:
const Math::Matrix3f cameraMatrix;
CameraIntrinsic(const Math::Matrix3f& camMat) : cameraMatrix(camMat)
{}
CameraIntrinsic(float fx, float fy, float cx, float cy, float skew = 0)
: cameraMatrix(fx, 0, 0, skew, fy, 0, cx, cy, 0)
{}
[[nodiscard]] CameraIntrinsic Scale(float scale) const
{
Math::Matrix3f scaled = cameraMatrix;
scaled[0][0] *= scale;
scaled[2][0] *= scale;
scaled[1][1] *= scale;
scaled[2][1] *= scale;
return { scaled };
}
[[nodiscard]] CameraIntrinsic Scale(Math::Vector2f scale) const
{
Math::Matrix3f scaled = cameraMatrix;
scaled[0][0] *= scale.x;
scaled[2][0] *= scale.x;
scaled[1][1] *= scale.y;
scaled[2][1] *= scale.y;
scaled[1][0] *= scale.x / scale.y; // Scale skew
return { scaled };
}
[[nodiscard]] float Fx() const
{
return cameraMatrix[0][0];
}
[[nodiscard]] float Fy() const
{
return cameraMatrix[1][1];
}
[[nodiscard]] float Cx() const
{
return cameraMatrix[2][0];
}
[[nodiscard]] float Cy() const
{
return cameraMatrix[2][1];
}
[[nodiscard]] float Skew() const
{
return cameraMatrix[1][0];
}
[[nodiscard]] float PixelAspectRatio() const
{
return Fy() / Fx();
}
[[nodiscard]] Math::Vector3f ProjectTo3D(Math::Vector2i pixelCoordinates, float depth) const
{
return ProjectTo3D(Math::Vector2f(pixelCoordinates), depth);
}
[[nodiscard]] Math::Vector3f ProjectTo3D(Math::Vector2f pixelCoordinates, float depth) const
{
// TODO handle skew
return {
(pixelCoordinates.x - Cx()) * depth / Fx(),
(pixelCoordinates.y - Cy()) * depth / Fy(),
depth
};
}
CameraIntrinsic operator * (const float scale) const
{
return Scale(scale);
}
CameraIntrinsic operator * (const Math::Vector2f& scale) const
{
return Scale(scale);
}
};
}