Dado um retângulo e um ponto com uma direção de vetor em direção ao retângulo. Como posso encontrar o ponto mais próximo do lado de fora desse retângulo ao ponto em questão?
Dado um retângulo e um ponto com uma direção de vetor em direção ao retângulo. Como posso encontrar o ponto mais próximo do lado de fora desse retângulo ao ponto em questão?
Respostas:
Uma técnica que você pode usar é chamada de "fundição de raios". É comumente usado para renderizar gráficos, mas possui outros aplicativos como a linha de visão (como você deseja fazer) e a localização de caminhos. Em termos gerais, ele funciona encontrando a interseção de um raio e um objeto. No seu exemplo, o raio é o vetor para a direção do personagem.
Uma referência útil para interseções de raio / objeto (e aliás outras interseções de objeto / objeto) é www.realtimerendering.com/intersections.html (consulte as referências de raio / aabb e raio / obb).
O retângulo tem quatro lados. Cada lado é um segmento de linha.
Teste cada um dos quatro lados para interseção com o raio. Acompanhe o hit mais próximo.
Aqui está um código para descobrir onde o segmento atinge o raio:
bool intersect(const ray& ray, const segment& segment,point& hit) {
// where do we intersect this line?
float t = ((ray.direction.x * ray.origin.y + ray.direction.y *
(segment[0].x - ray.origin.x)) -
(ray.direction.x * segment[1].y)) /
(ray.direction.y * (segment[0].x + segment[1].x) -
ray.direction.x * (segment[0].y + segment[1].y));
if(t >= 0.0 && t<=1.0) { // in the segment
hit = segment[0] + (segment[1]-segment[0]*t); // lerp
return true;
}
return false; // no hit
}
Se a sua caixa estiver alinhada ao eixo, basta fixar cada eixo de coordenada na caixa se o ponto estiver fora da caixa.
Do RTCD, página 130:
// Do this for all 3 axes
if( point.x < min.x ) point.x = min.x ;
else if( point.x > max.x ) point.x = max.x ;
Se você fizer isso para os eixos x, y, z, ele point
será batido na parede mais próxima da caixa, se estiver fora da caixa, para começar. se já estiver dentro da caixa, será deixado sozinho (onde está).
Bem, você pode usar apenas álgebra linear (geometria analítica, para ser mais específico) para resolver isso. Depende de como você modelou o retângulo.
Aqui está um caso geral: http://paulbourke.net/geometry/lineline2d/