ModelTranslator: 减面默认 RizomUV 展开(三步编排,失败/不达标回退 seam)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
"""FBX 减面 CLI:减到指定三角面数并重展 UV(默认锐边 seam 整岛展开),输出 <名>_low.fbx。
|
"""FBX 减面 CLI:减到指定三角面数并重展 UV(默认 RizomUV 自动展开),输出 <名>_low.fbx。
|
||||||
用法:python model_decimate.py src/well1500.fbx --tris 5000 [-o dir] [--blender exe]"""
|
用法:python model_decimate.py src/well1500.fbx --tris 5000 [-o dir]
|
||||||
|
[--unwrap rizom|seam|smart] [--rizom exe] [--blender exe]"""
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@@ -11,8 +12,10 @@ def main():
|
|||||||
ap.add_argument("input", help="FBX 文件")
|
ap.add_argument("input", help="FBX 文件")
|
||||||
ap.add_argument("--tris", type=int, required=True, help="目标三角面数")
|
ap.add_argument("--tris", type=int, required=True, help="目标三角面数")
|
||||||
ap.add_argument("-o", "--out", default=None, help="输出目录(默认源文件同目录)")
|
ap.add_argument("-o", "--out", default=None, help="输出目录(默认源文件同目录)")
|
||||||
ap.add_argument("--unwrap", choices=("seam", "smart"), default="seam",
|
ap.add_argument("--unwrap", choices=("rizom", "seam", "smart"), default="rizom",
|
||||||
help="UV 展开方式:seam=锐边接缝整岛展开(默认),smart=Smart UV Project")
|
help="UV 展开:rizom=RizomUV 自动切缝(默认,不可用回退 seam),"
|
||||||
|
"seam=锐边接缝整岛展开,smart=Smart UV Project")
|
||||||
|
ap.add_argument("--rizom", default=None, help="rizomuv.exe 路径(默认自动发现)")
|
||||||
ap.add_argument("--blender", default=None)
|
ap.add_argument("--blender", default=None)
|
||||||
args = ap.parse_args()
|
args = ap.parse_args()
|
||||||
if args.tris <= 0:
|
if args.tris <= 0:
|
||||||
@@ -22,8 +25,24 @@ def main():
|
|||||||
name = os.path.splitext(os.path.basename(args.input))[0]
|
name = os.path.splitext(os.path.basename(args.input))[0]
|
||||||
outdir = args.out or os.path.dirname(os.path.abspath(args.input))
|
outdir = args.out or os.path.dirname(os.path.abspath(args.input))
|
||||||
out_fbx = os.path.join(outdir, name + "_low.fbx")
|
out_fbx = os.path.join(outdir, name + "_low.fbx")
|
||||||
s = run_blender_script(blender, "bl_decimate.py",
|
|
||||||
[args.input, out_fbx, str(args.tris), args.unwrap])
|
if args.unwrap == "rizom":
|
||||||
|
# 三步:Blender 减面(不展UV)-> RizomUV 展开 -> Blender 质量门(不达标就地 seam 重展)
|
||||||
|
s = run_blender_script(blender, "bl_decimate.py",
|
||||||
|
[args.input, out_fbx, str(args.tris), "none"])
|
||||||
|
warnings = list(s["warnings"])
|
||||||
|
from rizom_unwrap import RizomError, find_rizomuv, rizom_unwrap
|
||||||
|
try:
|
||||||
|
rizom_unwrap(out_fbx, find_rizomuv(args.rizom))
|
||||||
|
except RizomError as e:
|
||||||
|
warnings.append("RizomUV 不可用:%s" % e)
|
||||||
|
g = run_blender_script(blender, "bl_uvgate.py", [out_fbx, "rizom"])
|
||||||
|
s["uv"] = g["uv"]
|
||||||
|
s["warnings"] = warnings + g["warnings"]
|
||||||
|
else:
|
||||||
|
s = run_blender_script(blender, "bl_decimate.py",
|
||||||
|
[args.input, out_fbx, str(args.tris), args.unwrap])
|
||||||
|
|
||||||
print("== %s: %d -> %d 面(目标 %d)-> %s" %
|
print("== %s: %d -> %d 面(目标 %d)-> %s" %
|
||||||
(s["src"], s["tris_before"], s["tris_after"], s["target"], out_fbx))
|
(s["src"], s["tris_before"], s["tris_after"], s["target"], out_fbx))
|
||||||
u = s["uv"]
|
u = s["uv"]
|
||||||
|
|||||||
Reference in New Issue
Block a user