ETC/Unity

[Unity/게임수학] 2D 쿼터뷰 공간 Sprite Order (Vector2 수선의 발)

Jade Choe 2024. 5. 7. 03:04
SMALL

 

https://jyspw.tistory.com/72

 

[Unity] 2D 쿼터뷰 공간 바닥에 랜덤 스폰하기

개발 진행중인 프로젝트는 2D게임인데, 쿼터뷰 형식으로 되어있다. 3D공간에 물체를 배치하고 Orthographic View로 보여주는게 아니라 각각의 장소가 모두 1장의 Sprite이다. 그렇기 때문에 공간 내에

blog.ysoft.kr

 

위 글에서 Y축을 기준으로 0~100까지 Layer Order를 줬다.

 

당연하게도 제대로 안된다.

 

아래 그림과 같이 각각의 Vector A, B, P가 있다고 가정할 때

점 P에서 선분 BA로 수선의 발을 내린 후, 0~1로 Normalize된 선분 BA와 수선의 발의 접점을 찾는다.

 

public float FindShortest(Vector2 point, Vector2 lineA, Vector2 lineB)
{
	Vector2 BP = point - lineB;
    Vector2 BA = lineA - lineB;
    
    float _sqrBA = BA.sqrMagnitude; // BA 거리
    
    float _dot = Vector2.Dot(BP, BA);
    float _normalized = _dot / _sqrBA;
    
    if(_normalized < .0f)
    {
    	// 가장 가까운 점은 B
        return BP.magnitude;
    }
    else if(_normalized > 1.0f)
    {
    	// 가장 가까운 점은 A
        return (point - lineA).magnitude;
    }
    
    Vector2 _shortest = lineB + _normalized * BA;
    return (point - _shortest).magnitude;
}

 

다만, Left - Bottom - Right의 각도가 90도가 넘으므로 한쪽 변만 수행하면 안되고...

네 변에 전부 수행 후 최단거리를 비교해서 다시 한번 계산해줘야 한다.

 

계산을 다섯번이나 해야 하니 다른 방법을 찾아보도록 하자....

BIG