Есть такой алгоритм
public static Vector2f getClosestVertex(Box box, Line line) {
Vector2f dir = Vector2f.sub(line.getB(), line.getA()).getDirection();
dir = new Vector2f(dir.y, -dir.x);
if( Vector2f.sub(box.getPos(), line.getA()).dot(dir) > 0 ) dir.mul(-1);
Vector2f dirX = box.getDirX().getDirection();
Vector2f dirY = box.getDirY().getDirection();
float sx = Math.signum( dirX.dot(dir) );
float sy = Math.signum( dirY.dot(dir) );
Vector2f closest = box.getPos();
closest.add( Vector2f.mul(box.getDirX(), sx) );
closest.add( Vector2f.mul(box.getDirY(), sy) );
return closest;
}
Суть его: находим перпендикуляр прямой, нормализуем его, и проверяем оси бокса смотрят на перпендикуляр или нет. Из этих данных вычисляем вершину: box.pos + box.dirX*sx + box.dirY*sy.
Все довольно просто, но как для 3д это сделать? Ведь перпендикуляр не вычислишь.
Нужно для нахождения ближайших точек между боксом и отрезком. Потом я нахожу ближайшие точки на боксе от вершин отрезка. И из этих 3х точек выбираю ближайшие к отрезку. Может есть проще пути.