Commit 1e026322 by Julian Schakib

### frustum from proj-view (or planes), intersection with aabb (as a

`comment)`
parent 41065333
 ... ... @@ -759,6 +759,48 @@ template return intersects(b, a); } /* template [[nodiscard]] constexpr bool intersects(plane const& p, aabb const& b) { #warning not tested whatsoever // see https://gdbooks.gitbooks.io/3dcollisions/content/Chapter2/static_aabb_plane.html // convert aabb to center-extents representation auto c = (b.max + b.min) * 0.5f; // aabb center auto e = b.max - c; // positive extents // compute the projection interval radius of b onto L(t) = b.c + t * p.n float r = e.x * abs(p.normal.x) + e.y * abs(p.normal.y) + e.z * abs(p.normal.z); // compute distance of box center from plane float s = dot(p.normal, c) - p.dis; // intersection occurs when distance s falls within [-r,+r] interval return abs(s) <= r; } template [[nodiscard]] constexpr bool intersects(aabb const& a, plane const& b) { return intersects(b, a); }*/ template [[nodiscard]] constexpr bool intersects(frustum const& a, aabb const& b) { for (auto const& p : a.planes) if (intersects(b, p)) return true; return false; } template [[nodiscard]] constexpr bool intersects(aabb const& a, frustum const& b) { return intersects(b, a); } template [[nodiscard]] constexpr optional> intersection(segment const& a, sphere const& b) { ... ...
 #pragma once #include #include #include #include #include #include #include "../pos.hh" #include "../vec.hh" #include "plane.hh" namespace tg { template struct frustum; // Common frustum types using ffrustum = frustum; using dfrustum = frustum; // ======== IMPLEMENTATION ======== template struct frustum { // frustum represented by 6 planes array, 6> planes; constexpr frustum() = default; explicit constexpr frustum(array, 6> const& planes) : planes(planes) { /* TG_CONTRACT(..); */ } // extract frustum from a view-projection-matrix explicit constexpr frustum(mat<4, 4, ScalarT> const& m) { // computing planes in order: left, right, bottom, top, near, far for (auto i = 0u; i < 3; ++i) for (auto j = 0u; j < 2; ++j) { // plane parameters from matrix (see http://www8.cs.umu.se/kurser/5DV051/HT12/lab/plane_extraction.pdf) vec4 abcd; for (auto k = 0; k < 4; ++k) abcd[k] = j == 0 ? m[k][3] + m[k][i] : m[k][3] - m[k][i]; #warning normalization correct? #warning -d due to tg representation of planes, right? auto n = vec3(abcd); auto l = length(n); planes[2 * i + j] = plane3(dir3(n / l), -abcd.w / l); } } [[nodiscard]] bool operator==(frustum const& rhs) const { for (auto i = 0u; i < planes.size(); ++i) { if (planes[i] != rhs.planes[i]) return false; } return true; } [[nodiscard]] bool operator!=(frustum const& rhs) const { return !operator==(rhs); } }; template constexpr void introspect(I&& i, frustum& v) { i(v.planes, "planes"); } } // namespace tg
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!