【我的渲染技术进阶之旅】解决Cinema 4D制作的3D模型无法导入Blender的问题

news2025/1/17 6:48:40

文章目录

  • 一、问题描述
  • 二、分析问题
    • 2.1 查看material材质的mtl文件
    • 2.2 mtl文件介绍
    • 2.3 对比mtl文件和mtl语法并修改
      • 2.3.1 norm不对
      • 2.3.2 map_Ka、map_Kd 、map_Ks、map_Bump 的格式不对
    • 2.5 重新导出obj格式和mtl文件
  • 三、总结

一、问题描述

今天UI输出了个3D模型给我,
在这里插入图片描述

然后我导入到Blender的时候出错,如下所示:

  1. 选择导入-> Wavefront(.obj) 去导入obj格式的3D模型
    在这里插入图片描述
  2. 选择对应的obj文件,然后点击【导入OBj】按钮
    在这里插入图片描述
  3. 好嘛,直接报错,如下所示:
    在这里插入图片描述
  4. 错误一闪而过,不慌,错误窗口消失之后,点击下面这个X按钮,即可查看详情
    在这里插入图片描述
  5. 查看详情,看起来像是加载material材质出错了
    在这里插入图片描述
Python: Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\addons\io_scene_obj\__init__.py", line 135, in execute
    return import_obj.load(context, **keywords)
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\addons\io_scene_obj\import_obj.py", line 1233, in load
    create_materials(filepath, relpath, material_libs, unique_materials,
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\addons\io_scene_obj\import_obj.py", line 428, in create_materials
    load_material_image(context_material, context_mat_wrap,
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\addons\io_scene_obj\import_obj.py", line 171, in load_material_image
    _generic_tex_set(mat_wrap.base_color_texture, image, 'UV', map_offset, map_scale)
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\addons\io_scene_obj\import_obj.py", line 165, in _generic_tex_set
    nodetex.translation = translation
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\modules\bpy_extras\node_shader_utils.py", line 20, in wrapper
    return func(self, *args, **kwargs)
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\modules\bpy_extras\node_shader_utils.py", line 792, in translation_set
    self.node_mapping.inputs['Location'].default_value = translation
ValueError: bpy_struct: item.attr = val: sequences of dimension 0 should contain 3 items, not 2

二、分析问题

2.1 查看material材质的mtl文件

打开rabbit.mtl查看内容如下所示,从第一行注释我们可以看出来是由Cinema 4D制作的3D模型
在这里插入图片描述

# WaveFront *.mtl file (generated by Cinema 4D)

newmtl AnimalFace_Rabbit
Ka 0 0 0
map_Ka -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Kd 0.80000001192093 0.80000001192093 0.80000001192093
map_Kd -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Ke 0 0 0
map_Ke -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Ks 0.25 0.25 0.25
Ns 40
illum 7
norm -o 0.000 1.000 AnimalFace_Rabbit_Normal.png

2.2 mtl文件介绍

在我的博客 【我的OpenGL学习进阶之旅】关于3D模型知识之:什么是obj文件和mtl文件 里面有介绍了mtl文件的格式,这里重新介绍一下:


# Blender MTL File: 'None'
# Material Count: 1

newmtl Scene_-_Root
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.0 0.0 0.0
Ni 1.450000
d 1.000000
illum 2
map_Kd diffuse.jpg
map_Bump normal.png
map_Ks specular.jpg

mtl 文件结构说明:

  1. newmtl xxx表示定义一个名为 xxx 的材质;如我们代码使用了Scene_-_Root这个材质
  2. Ns 表示材质的反射指数,反射指数越高则高光越密集,取值范围在一般为 [0,1000];
  3. Ni 表示材质的折射值(折射率),定义当前材料中的光密度(也称为折射率)。值的范围可以从 0.001 到 10。值 1.0 表示光在穿过对象时不会弯曲。玻璃的折射率为 1.5 ;
  4. d 表示指定溶解因子(dissolve),即这种材料溶解到背景中的程度。 1.0 的因子是完全不透明的。 0.0 的因子是完全透明的。
  5. Tr 表示材质的透明度(与 d 的取值相反),默认值为0.0(完全不透明);
  6. Tf 表示材质的滤光折射率,三维向量表示;
  7. illum 表示材质的光照模型;使用数值指定照明模型。有关 illum 关键字的更多详细信息,请参见下面的注释。值 0 表示最简单的照明模型,依赖于由 map_Kd 语句中指定的纹理贴图修改的材质的 Kd(如果存在)。该资源的编译器认为照明模型的选择与 3D 打印用途无关,并且在某些软件应用程序导入时会被忽略。例如,threejs Javascript 库中的 MTL Loader似乎忽略了 illum 语句。
  8. Ka 表示材质的环境光(Ambient Color)(r,g,b);以说明整个场景中分散的光(有关phong反射模型的Wikipedia条目),使用RGB组件的0到1之间的值。
  9. Kd 表示材质的散射光(Diffuse Color)(r,g,b);它通常将大部分颜色贡献给对象参见 [Wikipedia entry for Diffuse Reflection]。在此示例中,Kd 表示灰色,它将被 map_Kd 语句中指定的彩色纹理贴图修改
  10. Ks 表示材质的镜面光(Apecular Color)(r,g,b);表面闪亮且镜面状的颜色[有关镜面反射的Wikipedia条目]。
  11. Ke 表示材质的发射光,它与环境光,散射光和镜面光并存,代表材质发出的光量;
  12. map_Ka 表示为材质的环境反射指定纹理文件(纹理采样值与环境光相乘作为输出颜色的一部分加权);
  13. map_Kd 表示为材质的漫反射指定纹理文件;
  14. map_Ke 表示为材质的发射光指定纹理文件;
  15. map_d 表示为材质的透明度指定纹理文件;
  16. bump 表示指定材质的凹凸纹理文件,凹凸纹理修改表面法线,用于凹凸纹理的图像表示相对于平均表面的表面拓扑或高度(没用过)。

MTL Files Material Definitions for OBJ Files
在这里插入图片描述
在这里插入图片描述

2.3 对比mtl文件和mtl语法并修改

2.3.1 norm不对

通过对比,我们发现有个属性似乎不是mtl的语法,即norm,如下所示:
在这里插入图片描述
通过对比,感觉norm应该对应的是map_Bump , 修改代码如下:

在这里插入图片描述

# WaveFront *.mtl file (generated by Cinema 4D)

newmtl AnimalFace_Rabbit
Ka 0 0 0
map_Ka -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Kd 0.80000001192093 0.80000001192093 0.80000001192093
map_Kd -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Ke 0 0 0
map_Ke -o 0.000 1.000 AnimalFace_Rabbit_Albedo.png
Ks 0.25 0.25 0.25
Ns 40
illum 7
map_Bump -o 0.000 1.000 AnimalFace_Rabbit_Normal.png



改完之后重新让Blender导入,还是有问题

2.3.2 map_Ka、map_Kd 、map_Ks、map_Bump 的格式不对

标记的代码不需要,删了
在这里插入图片描述
修改之后代码如下:
在这里插入图片描述

# WaveFront *.mtl file (generated by Cinema 4D)

newmtl AnimalFace_Rabbit
Ka 0 0 0
map_Ka  AnimalFace_Rabbit_Albedo.png
Kd 0.80000001192093 0.80000001192093 0.80000001192093
map_Kd  AnimalFace_Rabbit_Albedo.png
Ke 0 0 0
map_Ke  AnimalFace_Rabbit_Albedo.png
Ks 0.25 0.25 0.25
Ns 40
illum 7
map_Bump  AnimalFace_Rabbit_Normal.png

改完之后重新让Blender导入,至于可以导入了,如下所示:
在这里插入图片描述

2.5 重新导出obj格式和mtl文件

发现Cinema 4D生成的obj格式和mtl文件有问题,虽然改为之后可以导入到Blender中,但是感觉怪怪的,那么我就重新导出Blender生成的obj格式和mtl文件。

  1. 选择导出-> Wavefront(.obj) 去导入obj格式的3D模型
    在这里插入图片描述

  2. 选择保存的目录和自定义保存的模型名称
    在这里插入图片描述

  3. 点击【导出OBJ】,这样就导出来了
    在这里插入图片描述

  4. 对比两个目录
    在这里插入图片描述
    对比mtl文件发现,Blender重新导出的格式看着排版舒服多了
    在这里插入图片描述
    obj文件也重新输出,对比如下:
    在这里插入图片描述

  5. 复制纹理图片
    先将两个遗漏的纹理图片复制到新目录
    在这里插入图片描述
    在这里插入图片描述
    复制完后,只有obj和mtl文件不一样
    在这里插入图片描述

  6. 修改mtl文件
    我们发现重新导出的mtl文件,还引用的老目录的那两个纹理图片,而且路径还是绝对路径,这得修改,因为我们最终是要将这个obj模型渲染到手机上。

在这里插入图片描述
修改完后代码如下:

# Blender MTL File: 'None'
# Material Count: 1

newmtl AnimalFace_Rabbit.004
Ns 39.999995
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.250000 0.250000 0.250000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Bump AnimalFace_Rabbit_Normal.png
map_Kd AnimalFace_Rabbit_Albedo.png
map_Ke AnimalFace_Rabbit_Albedo.png

在这里插入图片描述
路径是相对路径,直接指向复制过来在同一个目录下的两个纹理图片
在这里插入图片描述
7. 重新导入Blender验证

将修改后的mtl文件保存,然后重新导入obj文件,展示如下,正常
在这里插入图片描述
好吧,这样我们就保存了一份由Blender输出的3D模型。

三、总结

Cinema 4D制作的3D模型无法导入Blender的问题,这一次是因为材质.mtl文件有语法问题,通过分析解决并重新导出由Blender制作的3D模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring是如何解决循环依赖的?

一、什么是循环依赖? 循环依赖:说白了就是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了一个环形调用。 第一种情况:自己依赖自己的直接依赖 第二种情况:两个对象之间的直接依赖 第三种情况…

Android 深入系统完全讲解(11)

9 framework 内容组成 狭义的 framework,主要讲的就是 SystemServer 里面的所有服务,这些是在 framework, 而广义的就是包含了 rec,native 服务,系统 app 等一切分不出去的模块,所以 framework 要能做好&a…

睿尔曼 RM65-B 机械臂 WIN 示教软件测试

大家好,我是虎哥,最近开始接触机械臂,尤其是协作机械臂,小,轻、还价格便宜一点,由于我师兄弟强烈推荐的睿尔曼 RM65-B机械臂,所以总结一下自己的开箱测试经验,主要是在WIN下 示教器软…

Protobu编译本地环境搭建

1 windows下安装Protobuhttps://github.com/protocolbuffers/protobuf/releases2 安装cmakehttps://cmake.org/download/3选择选择你的VS版本4生成pb运行程序5 protoc --cpp_out生产pb文件将刚才编译后的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下,按住sh…

express中间件

文章目录中间件定义一个最简单的中间件自定义中间件中间件的五个使用注意事项Express 基于 Connect 构建而成,因此,它也保持了重用中间件来完成基础任务的想法。这就意味着,通过 Express 的 API 方便地构建 Web 应用地同时,又不失…

基于vgg16和pytorch框架进行cifar10数据集的图像分类

vgg16网络模型的实现 这里只讲怎么实现 百度搜到vgg16的网络模型图,用pytorch框架进行实现 图是这样,用pytorch实现就行,pyotrch不太熟悉的话可以去看小土堆的视频 命名mode.py 也可以使用其他名字,在后面的train.py里面改一下也…

【C语言进阶】内存函数和结构体内存对齐

目录一.strerror函数1.错误码变量errno2.strerror函数的使用3.perror函数二.memcpy函数1.函数介绍2.模拟实现三.memmove函数1.函数介绍2.模拟实现四.结构体的内存对齐一.strerror函数 1.错误码变量errno 规定: C语言库函数如果出现运行错误,会将对应错误信息的错误…

联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 示例

联合学习 (FL) 是一种出色的 ML 方法,它使多个设备(例如物联网 (IoT) 设备)或计算机能够在模型训练完成时进行协作,而无需共享它们的数据。 “客户端”是 FL 中使用的计算机和设备,它们可以彼此完全分离并且拥有各自不…

基于Java springmvc+mybatis酒店信息管理系统设计和实现

基于Java springmvcmybatis酒店信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

程序员接私活的几个平台和建议,避免掉坑!

大家对于程序员接私活这件事的看法,褒贬不一。但是你如果确实用钱,价格又合适,那就大胆去接。 如果不那么缺钱,那么接私活之前先考虑清楚,如果自己将空余时间用在接私活所产生的价值是不是大于提升自己。如果是的话&a…

2022年 大学生工程训练比赛[物料搬运]

本人和团结参加了2022年大学生工程训练(简称工训赛)校赛选拔,准备了几个月的时间和花费了较多的资金,由于疫情等多种情况,很遗憾未能参加湖南省省赛,过了这么久还是写个博客记录参赛准备和调试过程。 目录 一、比赛要求 二、整体…

第十章面向对象编程(高级部分)

10.1 类变量和类方法(关键字static) 10.1.31类变量快速入门 思考: 如果,设计一个 int count 表示总人数,我们在创建一个小孩时,就把 count 加 1,并且 count 是所有对象共享的就 ok 了! package com.hspedu.static_;public class ChildGame {…

MS【1】:Metric

文章目录前言1. Dice Loss1.1. Dice coefficient1.2. F1 score - Dice1.3. Dice Loss2. Sensitivity & Specificity2.1. Sensitivity2.2. Specificity3. Hausdorff distance3.1. 概念3.2. 单向 Hausdorff distance3.3. 双向 Hausdorff distance3.4. 部分 Hausdorff distanc…

使用ResNet18实现CIFAR100数据集的训练

如果对你有用的话,希望能够点赞支持一下,这样我就能有更多的动力更新更多的学习笔记了。😄😄 使用ResNet进行CIFAR-10数据集进行测试,这里使用的是将CIFAR-10数据集的分辨率扩大到32X32,因为算力相关的…

二、数据仓库模型设计

数据仓库模型设计一、数据模型二、关系模型三、维度模型1、事实表(1)事务事实表(2)周期快照事实表(3)累计快照事实表(4)无事实的事实表2、维度表3、维度模型类型(1&#…

LVGL学习笔记16 - 进度条Bar

目录 1. Parts 2. 模式 2.1 LV_BAR_MODE_SYMMETRICAL:对称模式 2.2 LV_BAR_MODE_RANGE:范围模式 3. 动画 4. 样式 4.1 方向 4.2 渐变色 4.3 增加边框 4.4 滚动条方向 进度条有一个背景和一个指示器组成,通过lv_bar_create创建对象。…

mysql多表查询

一、关联查询(联合查询) 1.1 什么是关联查询 关联查询:两个或者多个表,一起查询。 前提条件: 这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段&#x…

初识IL2CPP

在Unity中进行打包时,有两种打包方式选择:Mono和IL2CPP Mono和IL2Cpp是Unity的脚本后处理方式,通过脚本后处理实现Unity的跨平台 1.Mono (1). Mono组成组件: C#编辑器,CLI虚拟机,以及核心类别程序库 (2).跨平台过程 Mo…

【Linux】多线程概念

目录🌈前言🌸1、Linux线程概念🍡1.1、概念🍢1.2、线程的优点🍧1.3、线程的缺点🍨1.4、线程的异常和用途🌺2、Linux下进程 vs 线程🌈前言 这篇文章给大家带来线程的学习!…

PID算法入门(一)

1.简介 PID是Proportional(比例), Integral(积分), Differential(微分)的首字母缩写,他是一种结合比例,积分,微分三个环节于一体的闭环控制算法. 2.PID各环节 2.1比例环节 成比例地反应控制系统的偏差信号,即输出&a…