【pymxs】max文件导出fbx文件

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
问题描述: 在使用UE4导出FBX文件时,可能会发现导出FBX文件丢失了一些材质或纹理等信息,导致在其他软件中无法正确显示或渲染。 解决方法: 1. 检查导出设置 在导出FBX文件前,需要确认导出设置是否正确。在导出窗口中,勾选需要导出的内容,例如材质、纹理等,并设置好导出路径和文件名。确保导出文件格式和其他软件的兼容性。 2. 检查资源路径 在UE4中,资源路径是非常重要的。如果导出FBX文件中缺少资源路径信息,其他软件就无法正确显示或渲染。在导出文件时,需要确认资源路径是否正确,并将相关资源一起导出。 3. 检查模型格式 在UE4中,模型格式也会影响导出FBX文件。如果模型格式不正确,导出文件可能会缺失一些信息。在导出文件前,需要确认模型格式是否正确,并将其转换为需要的格式。 4. 检查材质和纹理 如果导出FBX文件缺少材质或纹理,可能是因为这些资源在UE4中没有正确设置。在导出文件前,需要确认材质和纹理设置是否正确,并将其一起导出。 5. 更新UE4版本 如果以上方法都无法解决问题,可以尝试更新UE4版本。新版本的UE4可能会修复一些导出问题,并提供更好的导出功能。 总结: 在使用UE4导出FBX文件时,需要注意导出设置、资源路径、模型格式、材质和纹理等方面的问题。如果遇到导出问题,可以尝试以上方法解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sprite.Nym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值