tripocli v2.0.0:Tripo AI 3D 生成与加工 CLI(面向 Agent 与开发者,纯 Python 标准库、零第三方依赖)

覆盖文生 3D、图生 3D、多视图、批量生成,以及重拓扑、绑定、动画、智能分割、
纹理、PBR、智能 UV、部件补全、格式导出与下载。

代码组织:一个功能一个模块(tripo/features/),入口薄壳 tripocli.py。
This commit is contained in:
Mrpzx committed 2026-10-13 19:22:54 +08:00
commit 977f97995a
60 files changed
+5622

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
"""导入自己的模型 — register a local 3D model as a studio project.
tripocli import -i ./my_model.glb --wait -o my.glb
The file goes straight to S3, then ``import_user_model`` turns it into a project,
after which every post-process operator (remesh / rig / animate / segment / ...)
works on it. Verified body:
``{format, model:{bucket,key}, name, transform_matrix, use_original_uv}``.
The UI lets you rotate the mesh before importing — that is what
``transform_matrix`` carries; the CLI imports as-is with the identity matrix.
Note the studio drops custom materials and deep node hierarchies on import.
"""
from . import _common
NAME = "import"
HELP = "导入自己的 3D 模型(glb/obj/fbx/stl)为项目,之后可继续后处理"
IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
def add_arguments(parser):
parser.add_argument("-i", "--input", required=True, help="本地模型文件 (glb/obj/fbx/stl)")
parser.add_argument("--name", help="项目显示名(默认用文件名)")
parser.add_argument("--matrix", help="16 个数的 4x4 变换矩阵(默认单位矩阵),逗号分隔")
parser.add_argument("--no-original-uv", action="store_true", help="不保留原始 UV(默认保留)")
_common.add_wait_options(parser, "导入完成后保存到该路径(可选)")
def parse_matrix(text):
if not text:
return IDENTITY
values = [float(part) for part in text.replace(" ", "").split(",")]
if len(values) != 16:
raise ValueError("--matrix 需要恰好 16 个数字(4x4,逗号分隔)")
return values
def run(ctx):
args = ctx.args
ctx.out.line(f"📤 上传模型: {args.input}")
payload = ctx.client.upload_model(args.input)
body = {
**payload,
"name": args.name or payload["name"],
"transform_matrix": parse_matrix(args.matrix),
"use_original_uv": not args.no_original_uv,
}
data = ctx.client.get_data("POST", "/v2/studio/operation/import_user_model", body=body)
if isinstance(data, list):
data = data[0] if data else {}
return _common.finish_single(ctx, data or {}, output=args.output, wait=args.wait, label="导入")