混合的谜团(2009)

2021-06-24 22:20:44

Jeroen(阿姆斯特丹,荷兰,33岁)在演示场景中担任编码器。他对开源和3D动画感兴趣。目前,他正在研究支持影响分析和变更管理的产品围绕完全自动化的渲染管道。

i' m工作在产品上,通过使用Blender命令行和Blend-Files(.blend)集成了Blayende在渲染管道中的内容。命令行不是一个问题,因为它通常使用,但在搅拌机外的混合文件很难,因为它没有良好的记录。在互联网上,我只在搅拌机架构页面上发现了一些关于它的线索[ref:http://www.blerder.org/development/architecture/]。这些是不够的。真正了解我必须经过搅拌机的文件格式' s源代码。在本文中,我将描述融合文件格式,并请求刀具制作者来支持Blend文件。

第一个i' ll描述了搅拌器如何使用融合文件。您' ll注意为什么Blend-File-Format没有记录,从Blender'透视图不需要。我们查看Blend文件的全局文件结构(文件标题和文件块)。在此解释中,我们深入了解混合文件的核心,DNA结构。它们持有Blend-File的蓝图和了解Blend-Files的关键资产。当它完成时,我们可以使用这些DNA-Structures从Blend文件中的其他地方读取信息。

在本文中,我们' ll使用Blender 2.48的默认混合文件,目标是从场景中读取输出分辨率。这篇文章是编写的编程语言,独立和我和#39; VE设置了一个网站支持。

在搅拌机中加载和保存是非常快的,并且已知搅拌机具有出色的向下和向上兼容性。 Ton Roosendaal展示了2008年12月,使用Blender 2.48a加载1.0融合文件[ref:http://www.blendernation.com/2008/12/01/blender-dna-rna-and -backward-compatibility/ 。

在几秒钟内完成搅拌机中的复杂场景。 Blender通过将内存中的数据保存到磁盘而没有任何转换或翻译。 Blender仅为此数据添加文件块标题。文件块标题包含有关如何解释数据的线索。数据后,存储所有内部搅拌机结构。当Blender加载文件时,这些结构将充当蓝色打印。在存储在不同的硬件平台或搅拌机版本上时,Blend文件可能不同。没有努力使融合文件二进制相同。 Blender自版本1.0以来以这种方式创建Blend文件。保存文件时未实现向后和向上兼容性,这在加载期间完成。

当Blender加载混合文件时,首先读取DNA结构。 Blender创建了这些DNA结构的目录。 Blender将此目录与文件中的数据一起使用,搅拌机的内部搅拌机结构释放您'重新使用和大量的转换和翻译逻辑来实现向后和向上兼容性。在Blender的源代码中,实际上可以逻辑转换并转换搅拌机释放到释放的每个结构,并使用[ref:http://download.blender.org/source/blender -2.48a.tar.gz /blender-2.48a/source/blender/blenloader/intern/readfile.c行4946-7960]。释放之间的差异越多,逻辑就越多。

Blend-File-Format未妥善记录,因为它与内部使用的结构没有不同,并且该文件可以真正解释自己。

让我们看看全局文件结构。 Blend-File始终以文件标题始终以文件块开头。 Blender 2.48的默认混合文件包含超过400个这些文件块。每个文件块都有一个文件块标题和数据。本节介绍如何读取全局文件结构。

每个混合文件的前12个字节是文件头。文件标题有关于Blender(版本号)的信息,并且Blend文件的PC保存(指针 - 大小和endianness)。这是必需的,因为融合文件中的所有数据都按此顺序排序,因为在保存期间没有进行翻译或转换。下表描述了文件标题中的信息。

指针的大小;文件中的所有指针都以此格式存储。 ' _'意味着4个字节或32位和' - '意味着8个字节或64位。

Endianness地址以字节序列排序的方式处理值[ref:http://en.wikipedia.org/wiki/endianness]。搅拌机支持小endian和Big-Endian。在一个大的endian排序中,值的最大部分被放置在第一个字节上,并且该值的最低部分放置在最后一个字节上。在一点endian排序中,值的最大部分放置在最后一个字节上,并且该值的最小部分放置在第一个字节上。示例:编写整数0x4a3b2c1dh,将在大endian排序为0x4ah,0x3bh,0x2ch,0x1dh,并在小endian中排序为0x1dh,0x2ch,0x3bh,0x4ah。

Endianness可以在Blend-File和PC之间存在不同。当这些不同时,搅拌机将其更改为PC的字节排序。如今,小endian是最常用的。

下一个十六进制转储描述了在具有32位指针长度的小型硬件上使用Blender 2.48创建的文件标头。指针尺寸版本-150000 0000 0000:[42 4C 45 4e 44 45 52] [5f] [5f] [76] [32 34 38] blen der_v248标识符endianness

文件块包含文件块 - 标题和数据。文件块的开始始终以4个字节对齐。文件块标题描述了数据的总长度,存储在文件块中的信息类型,此信息的项目数量和数据的旧存储器指针写入磁盘。根据存储在文件头中的指针大小,文件块标题可以长20或24个字节。下一个表描述了如何构建文件块标题。

代码描述了不同类型的文件块。代码根据必须读取数据的逻辑确定。这些代码还允许快速查找库,场景,对象或材料等数据,因为它们都具有特定代码。

大小包含文件块标题后的数据总长度。数据后,新文件块开始。文件中的最后一个文件块有代码' endb'

旧内存地址包含上次存储时的内存地址。加载文件时,可以将结构放在不同的内存地址上。 Blender将指向这些结构的指针更新到新的内存地址。

SDNA索引包含在读取此文件块数据时要使用的DNA结构中的索引。关于此主题的更多信息将在读取场景信息部分中解释。

计数告诉数据中可以找到特定SDNA结构的多少元素。

下一节是文件块标题的示例。代码' sc' + 0x00h标识它是一个场景。数据的大小是1376字节(0x05H x 256 + 0x60h = 1280 + 96);旧指针是0x0a042fa0h,SDNA索引为139(8 x 16 + 11)。该部分包含一个场景。在我们解释此文件块的数据之前,我们首先必须读取文件中的DNA结构。截面结构截号将显示如何做到这一点。 [53 43 00] [83 4 00 00] [8b 00 00] [8b 00 00 00] sc ..'.. .... .... 0000 4430:[01 00 00 00 ] [xx xx xx xx xx xx xx xx xx xx xx xx .... xxxx xxxx xxxx

结构DNA与代码' DNA1' DNA1'它可以只是在&#39之前; endb'文件块。它包含文件中创建的Blender释放的所有内部结构。此文件块中的数据必须如本节中所述解释。在使用Blender 2.48a创建的Blend文件中,本节是43468字节长,包含43468字节309结构。这些结构可以描述为C结构。它们可以将字段,阵列和指针保持到其他结构,就像普通的C结构一样。结构场景{ID ID; // 52字节长(ID是不同的结构)对象*相机; // 4个字节长(指向对象结构)世界*世界; // 4个字节长(指向世界结构的指针)...浮动光标[3]; // 12字节长(3个浮点数)...}

下一节介绍如何在&#39的数据中订购该信息; DNA1'文件块。

如您所见,结构存储在4个阵列中:名称,类型,长度和结构。每个结构也包含一系列字段。字段是类型和名称的组合。根据此信息,可以构建所有结构的目录。名称存储为C-Developer如何定义它们。这意味着该名称还定义了指针和数组。(当名称以&#39开头时; *'它用作指针。当名称包含例如#39; [3]'它用作3个长的数组。)在您的类型中' ll找到简单类型(如:'整数',' char'' float'' float' 39;),但也像&#39一样复杂类型;场景'和#39; Metaball' ' tlen'部分描述了类型的长度。 A' char'是1字节,一个'整数'是4个字节和A'场景'是1376字节长。

注意:读取DNA' LL将遇到一些奇怪的名字,如'(* doit)()'这些是方法指针和搅拌机将它们更新为正确的方法。

注意:字段'类型标识符&#39 ;,'长度标识符'和#39;结构标识符'以4个字节对齐。

Blender 2.48混合文件中的DNA结构可以在http://www.atmind.nl/blender/blender-sdna.html中找到。如果我们理解文件的DNA部分,现在可以从其他部件文件块中读取信息。下一节将告诉我们如何。

让我们看看我们之前见过的文件块。代码是' sc' + 0x00h和sdna索引是139. DNA中的139结构是类型&#39的结构;场景'相关类型('场景')的长度为1376字节。这与文件块中的数据完全相同。我们可以在文件块的数据上映射场景结构。但在我们能做到之前,我们必须平息场景结构。

场景结构中的第一个字段是类型' ID'名称' id'在DNA结构列表中,存在为类型&#39定义的结构; ID' (结构指数17)。该结构中的第一个领域具有类型'空隙'和名字' *下一个'寻找结构列表,没有为类型&#39定义的结构;空隙'这是一种简单类型,因此应该读取数据。 ' *下一个'描述一个指针。数据的前4个字节可以映射到' id.next'使用此方法我们' LL将结构映射到其数据。如果我们想读取特定领域,我们知道它所在的数据中的偏移量以及需要多少空间。

下表显示了场景结构某些部件的这种平坦过程的输出。并非所有行都在表格中描述,因为场景结构中存在很多信息。

我们现在可以读取x和y分辨率的场景。 X分辨率位于文件块数据的偏移量326上,并且必须读取短。 Y分辨率位于偏移328上,也是短暂的。

注意:一系列字符可以指2件事。该字段包含可读文本,也包含一个标志数组(不是人性可读)。

注意:包含列表的文件块是指DNA结构,并且具有大于1的计数。例如,以这种方式存储顶点和面。

在搅拌机中的实施很容易,但加载很难。在自定义工具中实现加载和保存融合文件时,难度是相反的。在一个自定义工具中加载混合文件很容易,并且难以保存混合文件。如果要保存Blend-Files,我建议首先了解全局文件结构并解析文件的DNA部分。在此完成,应该很容易地从现有的混合文件等信息,如场景数据,材料和网格等现有混合文件。当您熟悉此时,您可以使用特定版本的内部搅拌机结构开始创建Blend-Libraries。如果你不想潜入搅拌机源代码,你可以在http://www.atmind.nl/blender/blender-sdna.html上找到它们。

有一个功能请求有关在Blender中支持基于XML的导入/导出系统。我不支持请求,但是要看可以实现如何实现这一点。 XML导出可以用力以低成本实现,因为XSD可以用作DNA结构,并且数据可以写入XML [查看http://www.atmind.nl/blender/blender-file.zip下载Java示例包括源代码]。实现XML导入系统使用很多内存和CPU。如果您真的想实现它,我希望最简单的方法是将XML文件转换回正常混合文件,然后使用当前实现加载它。一个实际缺点是解析基于XML的混合文件使用很多内存和CPU和文件都会变得非常大。

此时,在自动渲染管道中使用此信息,我' m使用此信息。 渲染管道围绕Web服务器和SVN构建。 当艺术家在SVN中提交一个新的Blend-File时,它被Web服务器拾取,它将提取分辨率,框架文件框架文件框架文件。 此信息与SVN中的其他文件匹配,并将Blend文件放在渲染管道中。