> ## Content Index
> Fetch the complete content index at: https://blog.frostk.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# sand3d로 부품과 관절을 만들고, 물리 설정은 따로
- URL: https://blog.frostk.com/sand3d-assembly-boundary/
- Published: 2026-11-10T01:00:00.000Z
- Updated: 2026-11-10T01:00:00.000Z
- Description: sand3d는 짧은 Python 코드로 부품을 조립하고 관절까지 내보내는 Blender 기반 라이브러리예요. 내보내기 코드를 ROS 예제와 대조하니, 충돌 형상과 질량은 따로 설계해야 했어요. 관절이 있는 모형을 만들 때 어디까지 맡길 수 있는지 짚었어요.
- Author: Cat
- Tags: IT, 오픈소스, 개발도구

세탁기 문과 서랍을 각각 움직이는 부품으로 만들고 싶다면, 모양뿐 아니라 어디에 연결되고 어느 방향으로 움직이는지도 적어야 해요. sand3d는 이 관계를 짧은 Python 코드로 쓰게 해요. 다만 내보내기 코드를 읽어 보니 **URDF에는 보이는 형상과 관절을 쓰되, 충돌 형상과 질량·관성은 쓰지 않아요.** 물리 시뮬레이션에 도입할 때 남는 작업이에요.

Sandflow가 공개한 Apache-2.0 라이브러리로, 확인한 버전은 1.6.3이에요. Blender의 Python 모듈인 `bpy` 위에서 돌아가며 Python 3.13 또는 3.11을 지원해요. 여기서는 실행 결과 대신 공개 코드와 ROS 예제를 대조했어요.

## 문, 유리, 손잡이를 한 부품처럼

sand3d는 사각 단면을 두께만큼 밀어 입체로 만들거나, 구멍을 뚫는 작업을 `extrude`, `hole` 같은 함수로 표현해요. 부품을 다룰 때도 일일이 좌표를 계산하기보다 면과 부품의 이름을 써요.

세탁기 예시에서는 문 테두리, 유리, 손잡이를 `door`라는 그룹으로 묶어요. 여기에 경첩 관절을 붙이면 셋이 함께 움직이는 구조가 돼요. 드럼과 다이얼에는 계속 회전하는 관절을, 서랍에는 직선으로 미끄러지는 관절을 따로 적어요.

![공식 세탁기 예시. 문 아래에 테두리·유리·손잡이가 묶이고, 드럼과 다이얼은 연속 회전, 문은 0~143도, 서랍은 0~200mm로 움직여요. 아래에는 GLB, URDF, USDA 출력의 관계가 표시돼 있어요.](https://blog.frostk.com/content/images/2026/11/88562025.png)

출처: Sandflow sand3d README. 부품·관절·출력 구조를 설명하기 위한 공식 그림 인용이며, 직접 실행한 결과가 아니에요.

같은 조립 구조를 내보내도 담기는 상태는 달라요. README에 따르면 GLB는 현재 자세의 메시와 재질, 관절 정보를 담아요. 관절 정보는 노드에 붙는 추가 데이터인 `extras`에 들어가요. URDF와 USDA는 관절을 기준 자세로 되돌린 구조를 써요. 문을 열어 놓은 모습을 공유할지, 연결 구조를 다른 도구에 넘길지에 따라 고를 부분이에요.

## URDF 파일에 무엇이 빠질까요

README는 URDF의 용도로 ROS, PyBullet, MuJoCo, Isaac을 나열해요. 실제로 무엇을 만들어 넘기는지 `write_urdf()`를 따라가 봤어요.

링크, 즉 함께 움직이는 몸체마다 `<visual>`을 만들고, 그 안에서 옆 폴더에 저장한 OBJ 메시를 참조해요. 이어서 관절의 부모와 자식, 축과 범위를 기록해요. 이 함수에는 `<collision>`이나 `<inertial>`을 만드는 부분이 없어요. 충돌 판정용 형상, 질량과 관성 정보를 생성하는 단계가 빠져 있는 셈이에요.

범위가 있는 회전·직선 관절은 `<limit>`에 상한과 하한을 쓰면서 `effort="0"`, `velocity="0"`을 넣어요. 이는 힘과 속도를 계산한 결과가 아니에요. 파일 작성부의 설명에도 동역학은 sand3d의 범위 밖이며, 해당 두 값을 0으로 쓴다고 명시돼 있어요. 실제 장치의 구동 한계로 그대로 받아들이면 곤란해요.

USD 쪽도 경계가 비슷해요. 강체와 관절에 해당하는 구조를 기록하지만, 작성부는 질량·구동·충돌체를 제공하지 않는다고 밝혀요. 재질 이름이 `steel`이라고 해서 그에 맞는 질량이나 충돌 설정까지 생기는 구조는 아니에요.

![sand3d가 만드는 부품·관절 구조와 도입자가 보완할 충돌 형상·질량·관성·구동 설정을 나눈 그림](https://blog.frostk.com/content/images/2026/11/hf-43028370.png)

관절을 표현하는 작업과 물리 속성을 정하는 작업이 나뉘어요.

## 기존 ROS 예제와 비교하면

ROS의 공식 `urdf_tutorial`에는 이 차이가 파일로 드러나요. `06-flexible.urdf`는 관절로 움직이는 모델을 표현해요. 다음 `07-physics.urdf`에서는 몸체에 `<visual>`과 별도로 `<collision>`을 두고, `<inertial>` 안에 질량과 관성 값을 적어요.

이 항목 구성을 sand3d의 작성부와 대조하면 도입 범위를 정하기 쉬워요. sand3d는 부품의 모양과 연결 관계를 코드로 반복 생성하는 쪽에 맡기고, 물리 실험에 쓸 파일은 충돌 형상과 질량·관성, 목적에 맞는 구동 설정을 별도로 보완하는 흐름이에요. ROS 예제의 숫자를 다른 물체에 그대로 복사하라는 뜻은 아니에요.

제 생각엔 문·서랍 같은 관절형 모형의 초안을 코드로 관리하려는 사람에게 먼저 살펴볼 만해요. 반면 접촉이나 하중을 다루는 실험이 목적이라면, 내보낸 파일 뒤에 물리 속성을 붙이는 작업까지 도입 비용에 넣어야 해요. **sand3d가 줄여 주는 것은 모양과 조립 구조를 쓰는 일이고, 물체의 물리 특성을 정하는 일은 남아요.**

## 확인한 범위

- 기준일: 2026-11-10
- 직접 한 것: sand3d 1.6.3 고정 커밋의 URDF·USD 작성부를 읽고, ROS 공식 관절 예제와 물리 속성 예제의 XML 항목을 대조했어요. 공개 세탁기 구조 그림도 판독했어요.
- 읽은 것: 프로젝트 README, API·조립 가이드, 내보내기 구현, ROS `urdf_tutorial` 예제예요.
- 확인하지 못한 것: 모델 생성과 파일 내보내기는 실행하지 않았어요. 각 시뮬레이터의 가져오기 동작과 기본 물리값 처리, 접촉·구동 결과는 확인하지 못했어요.

## 출처

[GitHub - Sandflow-ai/sand3d: 3D modeling in Python, built for LLMs.3D modeling in Python, built for LLMs. Contribute to Sandflow-ai/sand3d development by creating an account on GitHub.![](https://blog.frostk.com/content/images/icon/favicon-60e93aa3-b7f0-41c8-9272-605f55a548b7.png)GitHub![](https://blog.frostk.com/content/images/thumbnail/7a64aba4-338b-4e47-9698-ad0112cbc8e4-258e1f88-23f7-48f9-a623-e38236daa87b.png)](https://github.com/Sandflow-ai/sand3d?ref=blog.frostk.com)

[urdf\_tutorial/urdf/07-physics.urdf at 050f1e47cfdb2c5f3eb0746bc15c57e6a870faef · ros/urdf\_tutorialContribute to ros/urdf\_tutorial development by creating an account on GitHub.![](https://blog.frostk.com/content/images/icon/favicon-4d2a41d2-f0b3-47e3-8bb6-1859badfe6b4.png)GitHub](https://github.com/ros/urdf%5Ftutorial/blob/050f1e47cfdb2c5f3eb0746bc15c57e6a870faef/urdf/07-physics.urdf?ref=blog.frostk.com)

구현 근거: [URDF 작성부](https://github.com/Sandflow-ai/sand3d/blob/84c980a523adcb0474420ed4e3990681d403dce3/src/sand3d/urdf.py?ref=blog.frostk.com#L325-L375), [USD 작성부](https://github.com/Sandflow-ai/sand3d/blob/84c980a523adcb0474420ed4e3990681d403dce3/src/sand3d/usd.py?ref=blog.frostk.com#L193-L274), [ROS 관절 예제](https://github.com/ros/urdf%5Ftutorial/blob/050f1e47cfdb2c5f3eb0746bc15c57e6a870faef/urdf/06-flexible.urdf?ref=blog.frostk.com).