Difference between revisions of "Barycentric coordinates"

From vegard.wiki
Jump to navigation Jump to search
(add link)
 
Line 37: Line 37:
 
}
 
}
 
</source>
 
</source>
 +
 +
=== See also ===
 +
 +
* https://asawicki.info/news_1721_how_to_correctly_interpolate_vertex_attributes_on_a_parallelogram_using_modern_gpus
  
 
[[Category:Graphics programming]]
 
[[Category:Graphics programming]]
 
[[Category:Geometry]]
 
[[Category:Geometry]]

Latest revision as of 15:51, 17 February 2020

Barycentric coordinates let you represent a coordinate as a weighted sum of three points. This can be very useful for interpolating values across a triangle, including world coordinates or texture coordinates.

Conversion from cartesian

// https://gamedev.stackexchange.com/a/23745
// Compute barycentric coordinates (u, v, w) for
// point p with respect to triangle (a, b, c)
glm::vec3 barycentric(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 p)
{
        auto v0 = b - a;
        auto v1 = c - a;
        auto v2 = p - a;

        float d00 = glm::dot(v0, v0);
        float d01 = glm::dot(v0, v1);
        float d11 = glm::dot(v1, v1);
        float d20 = glm::dot(v2, v0);
        float d21 = glm::dot(v2, v1);
        float denom = d00 * d11 - d01 * d01;

        float v = (d11 * d20 - d01 * d21) / denom;
        float w = (d00 * d21 - d01 * d20) / denom;
        float u = 1.0f - v - w;

        return glm::vec3(u, v, w);
}

Conversion to cartesian

// https://stackoverflow.com/a/11262425
glm::vec3 cartesian(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 p) 
{
        return a * p.x + b * p.y + c * p.z;
}

See also