S3D에서 두 객체가 연결되어 있는지 여부를 확인하기 위해 객체의 OrientedRangeBox를 구한 뒤 Intersects 함수를 사용하였습니다.
S3D API에서 제공하는 Intersects 함수의 설명은 아래와 같습니다.
- //
- // 요약:
- // Determines whether two oriented boxes intersect or not.
- //
- // 매개 변수:
- // oRangeBox2:
- // OrientedRangeBox object.
- //
- // 반환 값:
- // RangeBoxIntersectionType = 0: inside, 1: outside, 2: overlapping.
- //
- // 예외:
- // T:System.ArgumentNullException:
- // oRangeBox2 cannot be null.
- public RangeBoxIntersectionType Intersects(OrientedRangeBox oRangeBox2);
대상인 OrientedRangeBox가 내부(0), 외부(1) 그리고 겹쳐지는지(2) 리턴합니다.
작업을 끝마친 뒤 결과를 확인하는데 결과가 이상한 부분을 확인하였습니다.
Intersects 함수에서 사선으로 기다란 볼륨에 붉게 마크친 부분의 영역이 Outside라고 리턴하는 것이었습니다.
ISO 뷰 |
실제 코드는 아래와 같습니다.
- OrientedRangeBox source = new OrientedRangeBox(
- new Position(1487.1449000000002, 1333.987, 18.389),
- new Vector(0, 10.021999999999952, 0),
- new Vector(198.35219999999984, 0, 0),
- new Vector(0, 0, 5.2151600000000045));
- OrientedRangeBox target = new OrientedRangeBox(
- new Position(1517.3200000000002, 1334.497, 18.399),
- new Vector(0, 9.0019999999999527, 0),
- new Vector(3.7019999999997708, 0, 0),
- new Vector(0, 0, 1.5020000000000024));
- RangeBoxIntersectionType intersects1 = source.Intersects(target);
- RangeBoxIntersectionType intersects2 = target.Intersects(source);
결과 값 intersects1, intersects2 둘 모두 Outside 였습니다.
입력값을 몇번이나 확인해 봤는데 결과값은 Inside가 되어야 마땅했습니다.
오류가 발생하면 API를 의심하지 말고 자신을 의심하라고 줄곧 말해왔었는데,
아무래도 이것은 S3D API의 오류인것 같습니다.
Hexagon PPM에 SR을 날려야 겠습니다.
참고로 S3D 2016버젼 입니다.
역시 API가 잘못된게 아니었습니다. 저의 오류였습니다.
API를 사용하려면 API에서 제공하는 문서를 꼼꼼히 읽어보아야합니다.
OrientedRangeBox 생성자에서 받는 벡터들은 오른손 법칙을 따라야 한다고 합니다.
따라서 위에서 입력으로 사용한 3번째 벡터의 Z값은 -가 되어야 합니다.
new Vector(0, 0, 5.2151600000000045)); --> new Vector(0, 0, -5.2151600000000045));
new Vector(0, 0, 1.5020000000000024)); --> new Vector(0, 0, -1.5020000000000024));
댓글
댓글 쓰기