max导出fbx参数设置

1. 前言 .max格式是Autodesk公司下的3dsmax软件的通用格式,许多软件出于商业考虑都有自己的格式,例如网易云下载的音乐。 这也就意味着.max文件只能用Autodesk的产品打开,即3dsmax或maya。 Autodesk的产品均是非开源、封闭式的,导致它的生态不佳,为后续操作带来很多的不方便。 2.

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的需求了。

知秋君
上一篇 2024-08-29 17:36
下一篇 2024-08-29 17:02

相关推荐