유니티 C# new Plane(Vector3.up, Vector3.zero); 이 코딩이 궁금합니다

조회수 2665회

그냥 Plane 을 바닥으로 쓰려고 하는데 Plane groundPlane = new Plane(Vector3.up, Vector3.zero);

이렇게 하는 이유가 뭔가요 ? 쓰고 안쓰고 차이가 뭔지 모르겠어요 왠 Vector 값을 조정하는지 또 파라미터가 왜 두개인지..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 유니티에서는 Plane을 만드는 생성자가 3개로, 오버로딩 되어 있습니다. https://docs.unity3d.com/ScriptReference/Plane-ctor.html

    이는 각 상황에 맞춰 사용할 수 있다는 의미입니다.

    보통 기하학에서 평면을 결정할 수 있는 최소 조건이 있으며 고등학교 수학에서 나오는 설명을 기준으로는

    1. 한 직선 위에 있지 않은 세 점
    2. 한 직선과 그 직선 위에 있지 않은 한 점
    3. 한 점에서 만나는 두 직선
    4. 서로 평행한 두 직선

    이렇게 네 가지가 있네요.

    public Plane(Vector3 a, Vector3 b, Vector3 c);
    

    이 생성자가 받는 파라메터를 보면 평면 결정 조건 1번에 해당하네요. 비록 각각의 타입은 벡터지만 여기선 원점으로부터의 위치 벡터를 의미하기에 정규화된(normalized) 벡터를 받지는 않습니다. 월드 공간의 좌표 그대로를 가지는 벡터를 쓰죠.

    그럼 나머지 normal을 받는 생성자들은 왜 그렇게 정의되는지 알아 볼 필요가 있는데요.

    public Plane(Vector3 inNormal, Vector3 inPoint);
    
    public Plane(Vector3 inNormal, float d);
    

    normal은 평면의 수직 방향을 말합니다. 즉 벡터죠. 벡터는 방향과 크기를 가지고 있지만 위치를 특정하지는 않습니다. 그래서 벡터만으로는 평면을 표현할 수 없습니다.

    결국 위치를 지정할 수 있는 인자가 하나 더 필요하다는 얘기인데 그것이 한 점(inPoint), 아니면 원점으로부터의 거리(d)가 됩니다. 이 인자에 따라서 호출하는 생성자를 달리 쓸 수 있습니다.

    이것 말고도 평면을 결정하는 조건들은 많습니다만 굳이 normal을 쓰는 이유는 익히 알고 있는 평면의 방정식(일반형)을 보시면 이해에 도움이 될 거에요.

    평면의 일반형 방정식은 다음과 같이 표현합니다.

    ax + by + cz + d = 0

    여기서 이 평면의 normal vector가 (a, b, c)가 되고 원점으로부터의 거리가 d가 됩니다.

    위 유니티의 Plane 생성자들은 이 일반형 방정식을 세우기 위해 필요한 요소들을 인자로 받는 것입니다. 방정식을 세울 수 있다 == 평면이 결정된다. 로 귀결되기 때문이죠.

    한 점(inPoint)을 아는 것은 원점으로부터의 거리(d)를 아는것과 다름없기 때문에 생성자는 나눠져 있지만 수학적으로 같은 것이라 봐도 무방합니다.

    설명에서 인자로 넣는 normal vector는 꼭 정규화된(normalized) 벡터를 사용해야 한다고 나와 있습니다.

    d값은 normal vector의 크기에 반비례하여 맞춰지기 때문에 normal vector가 normalized되어 있지 않으면(즉 크기가 1이 아니면) d 값이 다른 값이 되기 때문입니다. 이는 꼭 지켜주셔야 합니다.


    new Plane(Vector3.up, Vector3.zero);
    

    이 코드에서 Vector3.up은 유니티가 축방향을 어떻게 쓰는지 모르지만 아마도 월드 좌표 기준으로 하늘 방향에 크기가 1인 단위벡터일 거고요.

    Vector3.zero는 원점이겠네요.

    월드 좌표 기준 높이가 0인 상태의 바닥을 만드시려면 저렇게 해 주시는게 맞는 표현입니다.

    • 결론적으로 세 점을 알면 이를 이용해 normal vector를 구할 수 있고 나머지는 세 점 중 하나를 이용하면 되니, 세 점을 아는 경우도 결국 normal을 알고 한 점을 아는 것과 다름 없게 되겠네요. doodoji 2018.9.5 18:53

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)