Barycentric coordinates: Difference between revisions

From vegard.wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
(use glm)
Line 5:
// 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)
void Barycentric(Point p, Point a, Point b, Point c, float &u, float &v, float &w)
{
Vector v0 = b -auto a, v1v0 = c - a, v2 = pb - a;
float d00 auto v1 = Dot(v0,c - v0)a;
float d01 auto v2 = Dot(v0,p - v1)a;
 
float d11 = Dot(v1, v1);
float d20d00 = Dotglm::dot(v2v0, v0);
float d21d01 = Dotglm::dot(v2v0, v1);
float denom = d00 *float d11 - d01= *glm::dot(v1, d01v1);
v = (d11 * float d20 -= d01glm::dot(v2, * d21v0) / denom;
w = (d00 * float d21 -= d01glm::dot(v2, * d20v1) / denom;
u float denom = 1.0fd00 -* vd11 - wd01 * d01;
 
float v = (d11 * d20 - d01 * d21) / denom;
float w = (d00 * d21 - d01 * d20) / denom;
float d11u = Dot(v1,1.0f - v - v1)w;
 
return glm::vec3(u, v, w);
}
</source>
Line 24 ⟶ 30:
<source lang="C++">
// https://stackoverflow.com/a/11262425
glm::vec3 cartesian(glm::vec3 a, glm::vec3 b, glm::vec3 c, glm::vec3 p)
Vector3d Tri::cartesian(const Vector3d& barycentric) const
{
return barycentric.xa * p0p.x + barycentric.yb * p1p.y + barycentric.zc * p2p.z;
}
</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;
}