지금 점, 평면 충돌 함수를 만들고 있음.
원리는 점이 평면 위에 있으면, 평면의 법선벡터와 점(원점으로부터의 벡터)를 내적했을 때, 그 값이 평면의 방정식 ax + by + cz + d = 0의 d와 근사하면 충돌로 처리.
근데 Plane 클래스에 GetNormal()이라는 함수가 있음. 내가 이 함수를 단순히 Vector3(a, b, c)를 리턴하게 했음.
그리고 충돌 함수에서 그 벡터(a, b, c)를 normalize하고 내적 함.
궁금한게, (a, b, c)가 평면에 수직인 벡터인건 맞잖음. 근데 normal이라는 단어가 수직 + 길이1인지, 수직만 의미하는지 모르겠음.
Normalize라는 표현을 보면 길이1까지 포함하는 것 같긴 한데... 뭐가 맞는거임?
직각만 말하는 거임. normalize는 길이를 1로 만든다는 거고 normal vector랑은 상관없음
아래 내가 쓴 댓글 맞는말인거죠?
ㅇㅇ
아 다시 생각해보니까 orthogonal이랑 orthonormal이 있네... normal은 단순히 단위가 1임을 의미하는 듯. 근데 걍 편의상 법선벡터를 normal이라고 말하는건가?
왜 길이를 1로 하냐면 그게 편해서 그럼. 안 그러면 normal vector가 유일하지 않으니까
orthogonal vector랑 normal vector랑은 같은 뜻이고, orthonormal할때 normal은 normal vector랑은 다른 뜻임.
아 다시 복기하니까 기억 났다. orthonormal은 벡터 집합에서 그 벡터들끼리 수직 관계일때 orthonormal이라고 하는거죠?
근데 그 벡터들이 모두 길이가 1인
거기다 길이 1 조건까지 추가해야 orthonormal이고 너가 말하는건 orthogonal vector"s"
한줄요약 : 영어의 동음이의어 문제
그러면 단순히 평면에 수직이지만, 길이가 1이 아닌 벡터는 뭐라고 불러야함? plane의 멤버가 (a, b, c)랑 d인데, (a, b, c) 벡터 이름을 뭘로 지어야할지 모르겠음. 걍 float coefficients[4]로 퉁 쳐버릴까
그게 normal vector임
정말 미치겠다...
그거랑 plane의 a, b, c랑은 다른개념임. 너가 말하는건 basis
선형대수 안배웠노
아. 미친 첫 번째 댓글에 있었구나. normal이 직각만 의미한다고... 진짜 나 개ㅄ인듯..
아 a, b, c가 각각 벡터가 아니라 a, b, c는 float이라고?
그러면 그건 basis가 아니라 normal vector가 맞음.
a, b, c, d 이렇게 하지 말고, Vec3d normal_vec_; 이거 하나랑 float offset_; 이렇게 하셈
여기서 Vec3d 는 float 3개 들고있는 클래스 (너가 float 말고 다른거 쓸일 있으면 템플릿 으로 만들수도 있음). 이렇게 만들어두면 Vec3d를 받는 다른 유틸함수들 쓰며 ㄴ됨
지금 딱 그렇게 하고 있었음. m_Normal이랑 m_Distance. 근데 망할 용어때문에 첫 번째 댓글 제대로 안보고 normal이 길이가 1인 것 까지 의미하는줄알고 겁나 뺑뺑돌았네. 하.. 감사합니다. 결국 처음 그대로지만 알아가네요.
저같은 빡대가리 상대하시느라 고생많으십니다 ㅠ
일단 공간도형에서 벡터 길이 정보가 필요없는 모든 경우에는 길이 1로 맞추는게 좋음. 안그러면 코싸인, 싸인, 내적, 외적, 전부 계산하기 매우 짜증남
문제가 되는 경우는 한 벡터 크기가 엄청 작고 (1e-5쯤) 한 벡터 크기가 엄청 커서 (1e5쯤) 길이 1로 맞추면 각 오차가 상당히 커지는 좃같은 경우인데 이런 경우는 특수케이스로 다뤄야함. 근데 일단 일반적인 경우부터 만들고 생각하셈.
사이즈를 1로 만드는걸 noramlize(정규화)라고 하고 nomalized vector(노말 벡터)의 사이즈가 1인거임, 수직인 벡터는 normal vector(법선 벡터) 인거고