# Introduction

UE4 has already provide a function `FMath::ClosestPointOnTriangleToPoint` for us to calculate the closest point on a triangle to a specific point:

This function works fine for a `right triangle` or an `acute triangle`. But this function can return a wrong result for an obtuse triangle:

# The Core Algorithm

## How Does This Function Work?

This function simply split the 3-d space into 8 regions. And the closest point is calculated considering which region it is located in:

It’s easy to tell that this can perfectly do the trick for an acute triangle through a little calculation. But this does not work for an obtuse triangle.

## What About An Obtuse Triangle?

Imagine a triangle and a point like this:

The function can return point `A` as the result of the input point `P`. But actually it is point `D` that is the true closest point on the triangle like this:

And that is the issue, or rather, the bug of this implementation.

# PhysX’s Implementation

`PhysX`‘s implementation is like this:

Two additional dot production comparisons are performed to fix this issue. So the space partition is like this:

A precise solution is necessary for `physx` since `GJK algorithm` needs to find the support point.

# Chaos’ Implementation

Chaos has its own implementation as well:

This implementation method is quite simple:

1. Firstly, calculate the target point onto the plane `P'`;
2. Second, calculate the barycentric coordinate of `P'`. If `P'` is located in this triangle, then `P'` is the closest point.
3. Or else, the result point must locate in the edge of this triangle. Thus, calculate the closest point to these 3 line segment, and find the closest one.

The performance implementation is not that good. The implementation of `PhysX` is preferred considering performance.

I am so cute, please give me money...