mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 07:03:25 +00:00
Fixes incorrect NDC calculation and updates formulas
Corrects the NDC calculation in `world_to_screen` to improve accuracy. Replaces custom perspective projection matrix calculation with `omath::mat_perspective_right_handed` for correctness and consistency. Updates test cases and provides debugging information by printing view and projection matrices. Addresses an issue in the feature/ndc_invalid_calc_fix branch.
This commit is contained in:
@@ -239,7 +239,8 @@ namespace omath::projection
|
|||||||
-1 |
|
-1 |
|
||||||
v
|
v
|
||||||
*/
|
*/
|
||||||
return {(ndc.x + 1.f) / 2.f * m_view_port.m_width, (1.f - ndc.y) / 2.f * m_view_port.m_height, ndc.z};
|
|
||||||
|
return {(ndc.x + 1.f) / 2.f * m_view_port.m_width, (ndc.y / 2.f + 0.5f) * m_view_port.m_height, ndc.z};
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] Vector3<float> screen_to_ndc(const Vector3<float>& screen_pos) const noexcept
|
[[nodiscard]] Vector3<float> screen_to_ndc(const Vector3<float>& screen_pos) const noexcept
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace omath::unity_engine
|
|||||||
}
|
}
|
||||||
Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||||
{
|
{
|
||||||
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(forward_vector(angles), -right_vector(angles),
|
return mat_camera_view<float, MatStoreType::ROW_MAJOR>(-forward_vector(angles), right_vector(angles),
|
||||||
up_vector(angles), cam_origin);
|
up_vector(angles), cam_origin);
|
||||||
}
|
}
|
||||||
Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
Mat4X4 rotation_matrix(const ViewAngles& angles) noexcept
|
||||||
@@ -37,13 +37,6 @@ namespace omath::unity_engine
|
|||||||
Mat4X4 calc_perspective_projection_matrix(const float field_of_view, const float aspect_ratio, const float near,
|
Mat4X4 calc_perspective_projection_matrix(const float field_of_view, const float aspect_ratio, const float near,
|
||||||
const float far) noexcept
|
const float far) noexcept
|
||||||
{
|
{
|
||||||
const float fov_half_tan = std::tan(angles::degrees_to_radians(field_of_view) / 2.f);
|
return omath::mat_perspective_right_handed(field_of_view, aspect_ratio, near, far);
|
||||||
|
|
||||||
return {
|
|
||||||
{1.f / (aspect_ratio * fov_half_tan), 0, 0, 0},
|
|
||||||
{0, 1.f / (fov_half_tan), 0, 0},
|
|
||||||
{0, 0, (far + near) / (far - near), -(2.f * far * near) / (far - near)},
|
|
||||||
{0, 0, -1.f, 0},
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
} // namespace omath::unity_engine
|
} // namespace omath::unity_engine
|
||||||
|
|||||||
@@ -87,9 +87,9 @@ TEST(unit_test_unity_engine, Project)
|
|||||||
constexpr auto fov = omath::projection::FieldOfView::from_degrees(60.f);
|
constexpr auto fov = omath::projection::FieldOfView::from_degrees(60.f);
|
||||||
|
|
||||||
const auto cam = omath::unity_engine::Camera({0, 0, 0}, {}, {1280.f, 720.f}, fov, 0.03f, 1000.f);
|
const auto cam = omath::unity_engine::Camera({0, 0, 0}, {}, {1280.f, 720.f}, fov, 0.03f, 1000.f);
|
||||||
const auto proj = cam.world_to_screen({5.f, 3, 10.f});
|
const auto proj = cam.world_to_screen({10.f, 3, 10.f});
|
||||||
|
|
||||||
EXPECT_NEAR(proj->x, 951.769f, 0.001f);
|
EXPECT_NEAR(proj->x, 1263.538, 0.001f);
|
||||||
EXPECT_NEAR(proj->y, 547.061f, 0.001f);
|
EXPECT_NEAR(proj->y, 547.061f, 0.001f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,3 +234,18 @@ TEST(unit_test_unity_engine, loook_at_random_z_axis)
|
|||||||
}
|
}
|
||||||
EXPECT_LE(failed_points, 100);
|
EXPECT_LE(failed_points, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(unit_test_unity_engine, to_camera_coordiante_syste)
|
||||||
|
{
|
||||||
|
omath::Vector3<float> point = {10, 3, 10};
|
||||||
|
auto result = omath::unity_engine::calc_view_matrix({}, {}) * omath::mat_column_from_vector(point);
|
||||||
|
auto perspective = omath::unity_engine::calc_perspective_projection_matrix(60, 1280 / 720.f, 0.3, 1000);
|
||||||
|
|
||||||
|
constexpr auto fov = omath::projection::FieldOfView::from_degrees(60.f);
|
||||||
|
|
||||||
|
const auto cam = omath::unity_engine::Camera({0, 0, 0}, {}, {1280.f, 720.f}, fov, 0.03f, 1000.f);
|
||||||
|
|
||||||
|
std::println("View matrix: \n{}", cam.get_view_matrix());
|
||||||
|
std::println("Projection: \n{}", cam.get_projection_matrix());
|
||||||
|
std::print("NDC: projection {} -> {}", point, cam.world_to_screen(point).value());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user