Encontre o ponto mais próximo ao longo de um retângulo, dado outro ponto e direção

8

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?

Retângulo de frente para o ponto

onedayitwillmake
fonte
Você pode explicar mais o que está perguntando? Eu realmente não estou entendendo.
Digamos que eu tenha um caractere voltado para um objeto (um retângulo) e traço uma linha imaginária desse caractere para o retângulo. Gostaria de saber como saber em qual ponto do objeto retangular a linha está tocando.
Onedayitwillmake
11
A palavra-chave para procurar no Google é "AABB" (caixa delimitadora alinhada ao eixo). Se a sua "caixa" (retângulo) ainda não estiver alinhada com o eixo, uma matriz de transformação simples - usada em todos os itens importantes, obviamente - pode ser usada primeiro para transformá-la em uma.
Martin Sojka

Respostas:

6

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).

Luke Van In
fonte
9

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
}
Vai
fonte
1

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 pointserá 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á).

bobobobo
fonte
0

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/


fonte