【pymxs】max文件导出fbx文件 您所在的位置:网站首页 3的max安装 【pymxs】max文件导出fbx文件

【pymxs】max文件导出fbx文件

2023-07-11 13:08| 来源: 网络整理| 查看: 265

1. 前言

.max格式是Autodesk公司下的3dsmax软件的通用格式,许多软件出于商业考虑都有自己的格式,例如网易云下载的音乐。

这也就意味着.max文件只能用Autodesk的产品打开,即3dsmax或maya。

Autodesk的产品均是非开源、封闭式的,导致它的生态不佳,为后续操作带来很多的不方便。

2. 软件准备

要读取一个.max文件,不仅需要建模软件,还需要数个渲染软件,建模软件公司和渲染软件公司是独立存在的。这些渲染软件以插件的形式结合到建模软件里。由于这些软件彼此之间独立存在,他们之间注定存在兼容性问题。

安装:

3dsmax可以去官网申请30天试用版

chaos公司出品的vray和corona渲染软件也可以去官网申请30天试用版

注意如果建模软件用的是3dsmax,那么渲染软件就得下载**‘vray/corona for 3dsmax’**

3dsmax试用版似乎只能下最新版的,那么渲染软件也全部下最新版即可。

3. 前置知识

(1) 不同渲染软件使用的引擎不同,导致即使同属material对象,不同的渲染软件生成的材质也具有完全不同的属性,这就是不兼容的体现。也就是说,不同渲染软件生成的材质,不能互相转换。

(2) 3ds Max导出fbx的导出工具是由Autodesk公司开发的,这也就导致了他没有义务去支持第三方渲染软件的材质格式,实际上很可能不仅是材质,任何地方使用了三方公司的插件,都可能导致不兼容。而第三方渲染软件也没有义务去改进Autodesk开发的导出工具。结果就是,只要.max文件里含有第三方公司产生的内容,在导出fbx时就可能出问题。

(3) .fbx格式也是Autodesk开发的格式,所以第(2)点说的“出问题”,大多是指用别的建模软件打开会出问题,用3ds Max本身打开还是可以的。

(4) 为了解决导出的fbx的材质问题,必须事先就将第三方公司的材质转换成3ds Max的标准材质,由于两边材质属性完全不同,这个转换过程基本相当于重新把材质画了一遍,所幸这个过程可以用其他插件完成。虽然转换前后看起来差别不大,但转换后的材质和原本材质的底层数据肯定不一样了。

(5) 3ds Max提供了Python的SDK pymxs,但是只能在3ds Max打开的情况下,在它内部使用Python。

4. 3ds Max

认识一些基本按钮。

打开.max文件

image-20230627135103065

导入导出fbx等其他格式的文件

image-20230627135152523

导出时必须勾选Embed Media以保留material;可以更改Type选择Binary/ASCII格式

image-20230627135604645

新建/打开脚本

image-20230627135225159

查看material

image-20230627135311167

image-20230627135346471

渲染为图像和渲染配置

image-20230627135451377

5. pymxs

说明文档

这个文档最大的问题是关于Python的案例、教程很少,详细的参数说明得查看接口文档。

为了将Python和3ds Max自带的Max脚本结合,pymxs内所有对象全部经过了封装,直接查看对象的属性什么都查不到。

可能是因为版本迭代了太多次,属性、方法名混杂着大驼峰命名、小驼峰命名、蛇形命名

使用rt操作所有的接口 import pymxs rt = pymxs.runtime 使用stringStream获取说明 # 获取rt的所有可操作接口 res = rt.stringStream('') rt.apropos('', to=res) print(res) # 也可以直接dir(rt)获取rt对象的属性和方法

使用rt.showProperties(object, to=res)可以获取其他对象的属性

其他的看了就会: INPUT_PATH = r"D:\sprite\PythonProject\main\o1_max_to_fbx\max_files" OUTPUT_PATH = r"D:\sprite\PythonProject\main\o1_max_to_fbx\fbx_files" import os import sys import json import pymxs def list_dir( cur_path, ext_filter ): """ 列举文件根目录下各文件的路径. Parameters ---------- cur_path: str 根目录. ext_filter: Optional[List], default None 用作筛选的后缀名. Returns ------- List 文件路径列表. """ file_paths = [] for root, dirs, files in os.walk(cur_path): for file in files: file_paths.append(os.path.join(root, file)) if ext_filter: file_paths = list(filter(lambda x: os.path.splitext(x)[-1] in ext_filter, file_paths)) return file_paths rt = pymxs.runtime max_files = list_dir(INPUT_PATH, ['.max']) for mf in max_files: output_folder = os.path.join(OUTPUT_PATH, os.path.splitext(os.path.basename(mf))[0]) if not os.path.exists((output_folder)): os.makedirs(output_folder) # 读取3ds Max文件 max_file = rt.loadMaxFile( os.path.join(INPUT_PATH, mf), quiet=True, # 无视任何提示 useFileUnits=False, ignoreMissingExternalFiles=True ) # 获取灯和相机 lights_cams = [x for x in rt.lights] + [x for x in rt.cameras] # 获取场景中的所有对象 for i, obj in enumerate(rt.rootNode.Children): # 灯和相机非实体,不用导出 if obj in lights_cams: continue # 选中object对象 rt.select(obj) # 在FBX导出配置里设置EmbedTextures为True, 还有很多别的参数可以配置 rt.FBXExporterSetParam("EmbedTextures", True) # 导出fbx, 以下就是exportFile全部参数了 rt.exportFile( os.path.join(output_folder, f"{obj.name}_{i}.fbx"), rt.name('noPrompt'), # 无视任何提示 selectedOnly=True, # 只导选中物体 using=rt.FBXEXP # 使用FBX导出工具 )

当然,pymxs里还提供了非常多的功能,object对象也有很丰富的属性可以查看,只是目前这样已经足够完成导出fbx的需求了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有