보기 좋은 자산에서 실험 가능한 자산으로
앞선 P3는 로봇의 예약·점유·정지·수납 사건을 구분했다. 이제는 그 사건을 만들어 낼 가상 환경 자체의 입력을 점검한다. 작업대나 상자가 화면에 보인다는 사실만으로 실제 크기·충돌·질량·재질과 센서의 반응까지 구성됐다고 말할 수 없다. 잘못된 자산을 그대로 쓰면 정책보다 먼저 실험 환경이 달라진다.
그림 M25.01-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
자산(asset)은 메시만이 아니라 재사용할 장면 구조·재질·물리 속성과 참조 파일을 묶은 입력이다. SimReady는 시뮬레이션 용도에 필요한 자산의 속성·의미·검사 조건을 다루는 체계다. 공식 FAQ는 USD 파일에 값을 넣는 것과 다른 도구가 해석/검사할 수 있는 명세를 구분한다. “USD로 저장했다”나 “SimReady라는 이름을 붙였다”만으로 모든 물리 엔진과 과업에서 검증된 것은 아니다.
이 단위는 공식 인증을 수행하지 않는다. 목적과 소비 런타임을 정하고 구조·단위·물리 입력·검사 근거를 연결하는 기본 검토를 연습한다. 실제 규격 검사는 대상 profile과 버전, 요구 항목, 도구/런타임을 고정해야 한다. SimReady Foundation의 문서도 이 구분을 확인하는 출발점이다.
계층은 변환과 속성의 적용 범위다
USD의 Stage는 여러 파일/레이어를 합성해 읽는 장면이고, Prim은 /World/Crate/Visual처럼 경로로 식별하는 구성 요소다. 부모의 변환이 자식에 적용되므로 메시의 로컬 숫자만 보고 최종 크기나 위치를 판단하지 않는다. reference는 다른 자산을 연결하는 방법이고, override는 원본과 구분해 장면별 변경을 기록하는 방법이다. 합성 결과에서 어떤 값이 실제로 적용됐는지까지 확인해야 한다.
아래는 조립된 하나의 동적 상자를 설명하는 교육용 구조다. 경로 이름은 의무 규칙이 아니며 기능은 실제 schema와 바인딩으로 결정된다.
| 경로/역할 | 확인할 내용 | 이름만 보고 알 수 없는 것 |
|---|---|---|
/World/Crate 루트 | 부모 변환, 참조 원본/개정, 강체와 질량 적용 범위 | 이름이 Crate라고 실제 강체가 되는 것은 아님 |
/World/Crate/Visual | 렌더 메시와 시각 재질 | 보인다고 충돌 형상이 존재하는 것은 아님 |
/World/Crate/Collision | 충돌 근사, 강체와의 관계, 실제 활성 상태 | 숨겼다고 충돌 계산에서 빠지는 것은 아님 |
/World/Materials/CrateVisual | 색·roughness 등 외관 | 마찰/반발을 자동으로 결정하지 않음 |
/World/Materials/CratePhysics | 마찰/반발과 collider의 물리 재질 바인딩 | 값만 존재한다고 해당 collider에 적용됐다고 할 수 없음 |
정적 작업대에는 충돌 형상이 필요해도 움직이는 강체 설정을 똑같이 붙일 필요는 없다. 반대로 움직일 상자는 강체·충돌·질량과 중력/초기상태를 함께 검토한다. 여러 자식을 한 강체로 묶을지 관절로 연결할지는 다른 모델링 결정이다. 바퀴/서랍과 Articulation은 다음 M25.02에서 다룬다.
단위 메타데이터는 좌표 숫자를 자동으로 고치는 버튼이 아니다
metersPerUnit은 장면의 길이 단위가 몇 m인지 나타낸다. 0.01이면 한 단위가 1cm다. upAxis는 위쪽 축을 나타내며 길이 단위와 별개다. 원본이 cm이고 소비 장면이 m라면 참조를 합성할 때 단위/축 차이를 보정해야 한다. OpenUSD의 Linear Units 문서는 이 보정을 조립자의 책임으로 설명한다. 미기입 값의 fallback도 있으므로 “안 적혀 있으니 m”로 처리하지 않는다.
이번 예에서 원본 상자의 부모 변환 적용 전 크기는 20×10×5이고 원본 단위는0.01m다. 원본에 추가 스케일은 없다. 의도 크기는0.2×0.1×0.05m다. m 단위 소비 장면에서 참조 루트에 균일 scale0.01을 한 번 적용하면 이 크기가 된다. 소비 장면의 길이 단위만1로 바꾸고 참조 숫자20×10×5를 그대로 두면 의도보다 각 축이100배 크다.
여기서 u는 m/단위다. 이 식은 추가 변환이 없는 현재 예의 길이 변환이다. 실제 계층에서는 누적 스케일/회전·최종 world bound를 확인한다. 이미 보정된 파일에 다시0.01을 곱하면 이중 보정으로 길이가0.002m가 된다. upAxis 차이는 스케일이 아니라 방향 보정으로 다룬다.
크기·밀도·질량의 출처를 함께 읽는다
위 상자를 내부가 찬 균일 재료로 가정하고 밀도를500kg/m³로 주면 부피는0.2×0.1×0.05=0.001m³, 질량은500×0.001=0.5kg다. 밀도 숫자500을 질량 속성에 그대로 넣으면500kg이 되어 의도 질량의1000배다. 빈 상자나 복합 재료에는 같은 계산을 그대로 쓰지 않는다.
USDPhysics 명세의 질량 단위와 물리 속성도 길이 메타데이터와 함께 확인한다. 크기를 고쳤다고 명시 질량·관성·질량중심이 의도대로 모두 바뀐다고 가정하지 않는다. 관성은 kg·m² 단위와 기준 프레임/축을 갖는다. 자동 추정 경로라면 사용한 형상·밀도와 런타임 규칙, 명시값의 우선순위를 기록한다.
음수 질량은 현재 교육용 양의 유한 질량 계약에 맞지 않는다. 값0이나 누락은 도구에 따라 자동 추정/특수 의미가 있을 수 있으므로 임의로 실제0kg라고 읽거나 경고를 없애기 위해 작은 값으로 바꾸지 않는다. 동적 물체의 실제 적용 질량을 확인하지 못했으면 미확인으로 남긴다.
외관 재질과 물리 재질을 따로 검증한다
roughness는 표면이 빛을 어떻게 반사하는지를 다루는 렌더 속성이다. 접촉의 미끄러짐과 튕김을 다루는 마찰/반발은 물리 재질 속성이다. 거칠어 보이게 바꾸는 것만으로 접촉 마찰이 커졌다는 근거를 만들 수 없다. SimReady의 재질 안내는 외관 외에 비시각 센서와 물리 재질의 요구를 구분한다. RGB에서 비슷해 보여도 LiDAR/레이더 반응까지 같다고 보장하지 않는다.
먼저 대상 collider가 어떤 물리 재질을 실제로 참조하는지 확인하고, 그다음 고정된 초기조건·시간 스텝·접촉 설정에서 관찰을 비교한다. 마찰 수치가 존재함, 올바르게 바인딩됨, 그 런타임에서 기대한 접촉이 관찰됨은 서로 다른 근거다. 접촉 파라미터 보정은 M25.04에서 확장한다.
자산 검수는 단계와 미확인을 함께 남긴다
다음은 교육용 세 명세이며 실제 파일/시뮬레이터를 실행한 결과가 아니다.
| 후보 | 제공 정보 | 현재 판정과 다음 행동 |
|---|---|---|
| A | 렌더 메시/사진만 있음 | 외관 입력만 확인. 단위·충돌·강체·질량·물리 재질을 확인하기 전 동적 시험 입력으로 승인하지 않음 |
| B | cm 원본을 m 장면에 무보정 참조, 질량500kg 입력, roughness만 변경 | 크기100배/질량1000배 오류를 수정하고 실제 collider의 물리 재질 바인딩 확인 |
| C | scale0.01, 질량0.5kg, 분리된 충돌/재질과 계층·지문 기록 | 이 표의 정적 계약은 충족. 실제 참조 해석/동적 접촉·실물 일치와 공식 profile 통과는 미확인 |
검수표에는 목적·자산/override 지문·최종 Prim 경로·길이/질량 단위/축·바인딩·검사 도구/버전·항목별 근거·누락/미확인을 적는다. 미해결 참조가 있으면 그 자산이 완전한 것으로 집계하지 않는다. 동적 시험에서는 초기 pose/속도·중력·physics step/엔진·평가기준과 관찰을 추가한다. 정적 경고0개와 동적 성공, 실제 현장 적합성은 따로 판정한다.
기존 2장 Stage 규칙은 장면 구성으로 확장하는 보충 자료다. 다음 M25.02에서는 자산을 관절로 연결할 때 바퀴/서랍의 자유도·축·루트가 어떻게 달라지는지 확인한다.