S3D의 객체에는 RangeBox라는 객체의 크기를 가지는 속성이 있습니다.
RangeBox는 글로벌 좌표계에서 Min, Max 좌표를 가지고 있습니다.
객체가 $X$축,$Y$축 또는 $Z$축에 놓여있을 때는 RangeBox와 실제 크기가 일치하겠지만, 그 외의 경우에는 RangeBox의 크기가 실제 크기보다 큽니다.
따라서 모든 경우에 객체 크기에 정확히 일치하는 크기를 구할때 RangeBox는 부적합합니다.
심지어 $X$축,$Y$축 또는 $Z$축에 놓여있을 때에도 RangeBox가 실제 크기보다 조금 더 큽니다.
모든 경우에 객체의 실제 크기와 같은 RangeBox를 구하기 위해서는 OrientedRangeBox를 구해야 합니다. 왜 S3D에서 객체의 속성으로 OrientedRangeBox를 제공하지 않는지 모르겠습니다.
OrientedRangeBox는 아래와 같은 구조를 가지고 있습니다.
Cable Way/Cable Tray 객체는 Start, End, 코너의 8개점, Length, Width, Depth 정보를 가지있습니다.
8개의 코너 점은 실제 형상보다 큰 지점을 가리키고 있고 Start, End는 실제 형상의 단면의 중점입니다.
코너의 8개의 점들은 객체를 이루는 두 단면의 4개씩의 점들로 이루어진다고 생각합니다. 제가 디자인했다면 이렇게 했을겁니다. 아무도 뒤죽박죽 점들의 순서를 정하지 않았을겁니다. 그렇지 않다면 제 손에 장을 지지겠습니다.
이제 이 8개의 점들로 객체의 Width, Depth 벡터를 구하면 OrientedRangeBox의 3 벡터를 결정할 수 있습니다.
$\overrightarrow{P_1-P_0}$과 $\overrightarrow{P_3-P_0}$ 중에서 객체의 $\overrightarrow{Width},\overrightarrow{Depth}$를 선택해야 합니다.
객체의 Width ,Depth 크기를 알고 있으니 $\overrightarrow{P_1-P_0}$와 $\overrightarrow{P_3-P_0}$의 크기를 비교하여 선택하면 됩니다.
3개의 벡터가 정해졌으므로 이제 원점만 구하면 됩니다.
객체의 Start 점을 Width 벡터의 반대 방향으로 Width의 반만큼 그리고 Depth 벡터의 반대 방향으로 Depth의 반만큼 이동하면 OrientedRangeBox의 원점이 됩니다.
$$Origin = Start - \overrightarrow{Width}*Width*0.5 - \overrightarrow{Height}*Height*0.5$$
위에서 구한 원점과 3개의 벡터를 이용하여 객체의 OrientedRangeBox를 구할 수 있습니다.
댓글
댓글 쓰기