Difference between revisions of "Barycentric coordinates"
Jump to navigation
Jump to search
(use glm) |
|||
Line 5: | Line 5: | ||
// Compute barycentric coordinates (u, v, w) for | // Compute barycentric coordinates (u, v, w) for | ||
// point p with respect to triangle (a, b, c) | // 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); | ||
} | } | ||
</source> | </source> | ||
Line 24: | Line 30: | ||
<source lang="C++"> | <source lang="C++"> | ||
// https://stackoverflow.com/a/11262425 | // 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; | |
} | } | ||
</source> | </source> |
Revision as of 13:43, 29 December 2019
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;
}