Collada 快速入门 - 图文
更新时间:2023-12-14 12:21:01 阅读量: 教育文库 文档下载
- collada是什么文件推荐度:
- 相关推荐
Collada 快速入门
感谢(“度郎”:“值班人员请注意”)收集
说明:Collada的文件格式,中文版的很少,在csdn上看到了一个Sleepy的,感觉也不是全面特别是没有图让我很伤感,所以我在这里加上了图,希望对大家有帮助。 一步一步的使用C++和OPENGL实现COLLADA骨骼动画
第一部分
英文原作者:waZim
原文标题:Step by Step Skeletal Animation in C++ and OpenGL, Using COLLADA 原文地址:http://www.wazim.com/Collada_Tutorial_1.htm Sleepy译 译注:
这是一篇详细介绍COLLADA文件(也就是DAE文件,3D模型文件的一种)格式的文章。之所以翻译这篇文章的原因,一是这篇文章的确写得很好很详细,另一方面关于DAE文件格式的中文资料非常的少,每次看E文的也累,所以正好翻译出来一了百了。
我是从看dancingwind(周炜)与AKER翻译的NEHE Opengl教程开始学习Opengl的,对这些将外国的优秀文章和教程汉化的人,我向他们致以由衷的感谢,同时也以此译文向他们致敬。
另外,本人E文水平有限,有些词翻译得不是很准(但我相信应该不会对阅读的人造成误导),如果发现错误和不完善的地方(估计会有很多),大家可以通过邮件与我交流,我会在第一时间更正错误。 Sleepy介绍:HI,欢迎来到第一篇骨骼动画的教程。这一系列教程由两部分组成: 1.了解如何读取COLLADA文件(概括的介绍COLLADA文件)。 2. 用C++和OPENGL去真正实现第一部分所讲的内容。
第一部份:
阅读与理解COLLADA文件
正如在前面的介绍部分里所说,这篇教程分为两个部份。第一部分的一般性的讲解并不考虑和涉及任何编程语言。但是如果你想直接跳到第二部分去看程序实现的话,你非常可能会感到完全无法理解从而无法继续下去。所以强烈建议对于COLLADA文件一无所知的初学者来说,还是耐心看完第一部分的介绍再去看第二部分的实现。 废话不多说,让我们开始吧。 COLLADA文件
在我们准备开始深入挖掘COLLADA文件的意义之前,我希望你们先下载一个实例文件,这个文件我们将做为此教程从头到尾讨论的对象(所以大家还是下载回来对照参看吧)。大家可以在COLLADA模型中心中找到它。它的名字叫“astroBoy_walk.dae”,如果你到处都找不到这个文件,那么好吧,你可以到这篇教程所在网页的“下载”部分找到它。(我怎么找不到)
就像我们之前所说的,COLLADA文件以XML的形式存储。现在大家可以打开前面所说的示例文件看看,你可以用你最喜欢的文本编辑器打开这个文件(IE就不错)。你会看到一个根结点名为“COLLADA”,如果你所用的文本编辑器支持展开与折叠XML结点的话(IE就可以),你可以通过点击+-号把各个结点展开收起来成这个样子:
图1:COLLADA文件的概览
在.dae文件或.xml文件的根结点
首先,为了让问题变得简单,正如我说的这是篇入门教程,所以我们不会讨论COLLADA文件的每一个方面,为了在教程中除去其中的复杂的部分,我们来设定几个前提条件。 前提条件:
1.虽然无论COLLADA文件从Max中导出还是从Maya中导出照理说应该是一样的,但实际上在某些情况下总会有那么一点不同。我们只讨论从Max中导出的COLLADA文件,当然这并不是说用Maya的人就杯具了。因为我仍可以肯定的是,如果COLLADA从Maya中导出时,在弹出的COLLADA导出选项对话框中将“triangulate”这个选项钩上,并且以“背向矩阵”(backed matrices,我没用过Maya,也不知道是什么)方式导出的话,则与Max导出的是一样的。但是因为我有用过Maya,所以不知道我的导出器载入Maya导出的文件时会失败在什么地方。
2. COLLADA文件中必须仅仅只有一个mesh,这意味着任何在max文件中有用的数据都已经记录下来了(原文:which means, anything in the asset's Max file, should be attached.不知道该怎么译,不过好像对文章的内容并没影响)。所以我们在COLLADA文件中的
3. COLLADA里的几何图形是以三角形的方式记录的,因为这即使不是最好的,也是比较好的记录方式,我们可以直接提供三角形数据给OPENGL,所以我们让Max帮我们将图形导出为三角形记录的方式。 4.在稍后的实现部分,我们还假定我们所分析的COLLADA中只包含一个贴图文件。
5. COLLADA中的动画至少含有一个骨骼—--至少一个根骨骼(这是很典型的)。嗯,我想,我们能实现骨骼动画,我们简直是英雄般的人物。(原文:And I think that’s why we are here, to implement skeletal animation.)
6.导出到COLLADA中的硬动画必须以矩阵的形式保存,从本质上来说,在某些情况下这个形成一个动画的通道而其它情况下则会生成16个动画通道(什么是通道,我们稍后解释)。(原文:Animation exported to COLLADA must be baked in matrices, which essentially in some cases makes 1 channel of animation and in others 16 channels of animation (Now what is channel? It should be explained later).)
7.动画只在通道向对象实体施加变化影响时才有效,请把它们相像得尽量简单和清晰。如果你固化了矩阵,那么前面所说的事就理所当然的被完成了,所以不用担心这些。(原文:Animations can only be valid if the channel targets the \of the targeted entity, just to keep things clear and easy. When you will bake matrices, then you will have this automatically, so don't need to worry about that.) 8.动画不能包含嵌套的动画。
9. 只支持骨骼动画(没有硬动画)(译注:那你前面说一大堆硬动画的事干毛啊。)
10. 层次中的每个骨头都必须对某些皮肤产生影响,换句话说,它们都必须关联到皮肤上。
请大家在脑中从头到尾一直保持上面所列的这些假设,让我们开始一个一个部分为你讲解。你会觉得一切都很容易,如果你立即跳到实现部分去看你也会发现这些原来并不难。下面的每一节中都会给出相应实现代码的链接
从COLLADA文件中读取几何数据
这是COLLADA文件中最重要的一个library了,如果你需要一个绘制一个角色动画,在这里你能找到它的几何数据。
这个library中包含许多
我们会在这个被称为“网格”的结点中找到我们想要的几何数据。如果你试着分析这一结点,你会看到至少1到2个
图2:Max导出COLLADA时的设置
请记住,我们所讨论的所有的XML结点都有一个相应的ID号,这个ID用来定位这个结点在COLLADA文件中的位置,当其它地方需要引用这个结点时,就需要使用这个ID。Source这个结点也并不例外。现在
现在我们来看看
好了我希望我不是在讲天书,我们来直接看图表吧,这个图表解释了COLLADA的source指示的意义。(在此吐糟一下,原文:hope I am not talking Chinese but let's explain it with a figure and example COLLADA source. 嗯,没错,现在你们现在看到的就是Chinese) [html] view plaincopyprint?
1.
3.
5.
7. 8.
9. 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20. 21.
正如你们在图3中所看到的,这是浮点型的数组(注:数据组,不是C语言的数组哈),其中数量是6个
(count=\(注:仔细看float_array),其中每三个一组(stride=\)共有2组(count=\)(注:仔细看accessor),分别表示XYZ,它们的类型都是浮点型(注:仔细看param)。现在我们看到在下有3个子结点,所以我们每个顶点数据是3个一组(x, y, z)(同样的法线和纹理坐标也可能是3个一组)。理解这些信息非常的重要,因为在我没有COLLADA的文件说明的时候,只是理解这些就花费了我大量的时间(也许我比较笨吧),所以如果你仍没理解的话,请再仔细读一遍。
简单来说,这个source说明了以下的意思:“我有2组顶点数据,其中每3个一组,它们都存在
好了,这就是source里面的所有东西了。这个示例文件共有3个
现在我们可以对
现在正如我们所假设的一样,我们只考虑由三角形几何元素组成的COLLADA文件,所以你在
要解码节点我们必须读取它们的子结点,其中的和
结点是最重要的。结点的数量表明每个顶点所具有的属性的个数。而
结点则是顶点相应属性在相应的
[html] view plaincopyprint?
1.
3.
5.
7.
11.
13. 14.
15. 16.
17. 18.
19. 20.
21. 22.
23. 24. 25.
26.
27. 0 0 1 3 2 1 28.
29. 0 0 2 1 3 2 30. 31.
32.33. 34. 35.
正如你从上面的例子中看到的,
如果你读取的子结点,你会读到3个结点,它们的”semantic”属性的值分别是\\和 \。这实际上是说,我们三角形数据每个顶点有一个值,第一个是顶点的位置(注:坐标),第二个是顶点的法线,第三个是顶点的纹理映射坐标。我们怎么知道在
里面哪个是哪个呢,我们来看看:
结点有semantic属性= \它的偏移是 offset = \ 结点有 semantic属性 = \它的偏移是offset = \ 结点有 semantic属性 = \它的偏移是offset = \
所以我们从
中为每个三角形每个顶点读值的时候:
第一个值是\也就是三角形顶点位置在名为\的 这个结点下读出来的值都是“索引”而不是实际的数据值,所有三角形的所有数据的值都以索引的形式保存是为了在有重复属性的情况下节省存储空间。为了找到真实的数据值我们必须引用相关的 构造三角形现在变得非常容易了。你要做的事情就是从 这个结点下一次读取3 * (结点下结点的数量)个值,然后以这些值为索引从相应的 中读取三个数字作为索引,然后在相应的名为\的 0 3 2 0 2 1 还有一件我们需要知道的事情就是结点的\属性,这个属性引用了 从COLLADA文件中读取贴图文件名 正如大家所知道了,我们在开始做了一些假设,其中之一就是一个COLLADA只对应着一张纹理贴图,这让寻找贴图的文件名变成非常容易。 图6左边部分的红点就是我们从COLLADA中读出来的关节,连接这些点的线是假想的骨头,它们可以使皮肤运动起来。在图的右边你可以看到另一帧皮肤附着在骨骼上的图像。 你可能还记得我们的一些假设,其中之一就是,所有的关节都关联到皮肤上,这样会使得 那么我们怎么能找到根骨骼呢?因为我们假定一个COLLADA文件中只有一个模型,所以我们不用去读 如果你看了COLLADA文件中的 到现在为止,你应该能够读取骨骼和通过从每个 从COLLADA文件中读取蒙皮信息 迄今为止我们已经完成了读取了几何数据(顶点信息、材质、纹理贴图文件名)甚至是模型的骨骼数据。我们还需要知道的就是骨骼是怎么关联皮肤(几何数据)的。我们已经读取了骨骼中的许多关节。但我们仍然不知道哪个关节关联哪个顶点。一些关节可能根本不关联任何的顶点。但如果你们还记得我曾经作过的假设,那就是所有的关节必须附加到皮肤上的话,那么我们讨论的情况的前提是所有的关节都必须关联到皮肤上。 为了正确的关联所有的皮肤(几何数据),我们需要皮肤的数据,这一节中我会试着让你了解我们从COLLADA文件中的什么地方能获取皮肤数据。 再我们进一步的说明之前,有件事情我必须解释一下。如果我们的人物模型每个顶点只关联到一个关节上的话,当这个关节移动那么这部分皮肤当然也相应的会移动,只不过这样的动画效果看起来非常的僵硬。这并不是我们实际中所采用的方法,几乎所有的顶点都会关联到不止一个关节上。我们通过所谓的“权值”来表达每个关联的关节对相应皮肤的影响。每个关节对一个顶点有一定百分比的影响,总量是100%。所以权值在皮肤的信息来说是非常重要的的一个。 1. 3. 5. 7. 8. 9. 10. 11. 12. 13. 14. 15.
如果你回头看看
要完全读取皮肤数据,首先我们得先读取
如果你看看
当我们需要读取每一个顶点的权值的时候,我们循环N次(N =
第一个是之前读出的名为\的
第二个是”semantic”=\中\属性指出的
(注:如果我翻译得你实在看不懂的话,我用纯正的中文来解释一下:我们把
1.
3. 4.
5. 6.
7.
8. 9.
11. 1 0 0 1 1 2 12. 13. 1 3 1 4 14. 15. 1 3 2 4 16.
17. 1 0 3 1 2 2 18. 19. 20.
21.
在这个例子里你可以看到
到了现在这一步为止,你应该能够读取COLLADA文件中的几何数据、骨骼数据和蒙皮数据。并且你能够以原始三角形绘制模型甚至能够绘制出它的骨骼。尽管我还没有讨论你怎样可以为每个关节叠加它们的世界矩阵然后将其以世界坐标的形式来绘制从而方便调试使用。但我想我可以给你一个提示,我们必须将父关节的世界矩阵乘以当前关节的矩阵然后将它作为当然关节的世界矩阵保存起来。我们必须从根关节开始做这件事。从而我们不会从父节点中获取污染了的矩阵,而且根关节的世界矩阵同时也是根关节本身的变换矩阵,因为根关节没有任何的父关节(注:也就是说把开始绘制当然模型时的世界矩阵当作根关节的矩阵,而不要重新的维护一个自己的,整个骨骼每次都从根关节的矩阵也就是当前模型的世界矩阵开始重新计算一遍,这样也不会造成矩阵重复叠加的错误。尽管这里做了一个很复杂的解释,但我想实际上他不说大家也都是这么做的不是吗)。如果你同时还在读COLLADA的1.5版规范说明,你可以找到蒙皮的公式,所以你也可以自己将模型摆成文件中定义好的各个形状(注:动画数据其实就是一个一个的POSE和摆出这个POSE的时间,只不过按时间的流逝不停的摆出POSE并且还计算出两个时间点之间的中间POSE从而让动画看起来更平滑而已,这是后文)。到现在我们还没讨论到怎么让这个模型动起来,我们会在下一节讨论这点。 点击打开本节代码
读取COLLADA文件中的动画数据
迄今为止我们已经可以读取静态模型的所有数据了,还剩下的唯一的事情就是理解和读取动画部分的数据。COLLADA的动画并不是非常成熟,可以说它还处在幼年时期,过一段时间后说不定它的动画会变得更成熟更好。但就从实现我们的目的这点来看,我们还有许多值得担心的地方。
在这个library里保存了所有的动画数据。对于每个关节的动画,你会看到一个结点,它包含了相关关节的详细动画数据。请记住,一个通道(注:也就是它下面所关联的一系列数据)会改变它所作用的目标原来的形状,它的作用目标一般而言是关节(注:而不是所谓的骨骼,骨骼是假想的东西)。 在下有三种类型的子结点,第一种通常是一系列的记录数据的
在
下面的例子是不不会出现在我们的示例COLLADA文件中的,因为我们假定文件记录用的是背向矩阵(backing matrices)。但这样的例子比较容易理解。
[html] view plaincopyprint?
1. Example: 2. 3. 4.
5.
7.
9. < technique_common> 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20.
21.
23.
25.
27. 28.
29. 30.
31. 32.
33. 34.
35.
36.
37.
39.
41.
43. < accessor source=\ count=\ stride=\> 44.
45. 46.
47. 48.
49. 50.
51. 52. 53. 54.
55.
57. 58.
59. 60.
61. 62.
63. 64. 65. 66.
67.
现在我们从底部的
这表示在场景中有一个叫做\的实体(对我们来说这实体就是关节),它的动画其中的“X方向变换”(trans.X)是由叫做\的采样器控制的。
所以我们需要知道\采样器是怎样对实体坐标的进行X变换的,我们需要读取
为了获得动画数据,你需要读取3种输入信息(也就是)结点。
第一种
当我们开始读取
属性”semantic” = \
当我们读取这一堆
而
最后一个source(注:就是插值的那个)是什么意思呢,比如对应两个时间点,我们可以相应的从OUTPUT中取出两个值。那么如果这个时间正好落在这两个时间点之间呢,我们怎么做它的动画?于是我们通过插值来得到那个中间时间的OUTPUT值。如之前所说的,我们可以用简单的线性插值来实现。
你所看到的名为TIME的source,实际上是动画的关键帧。OUTPUT中所对应的数据,就是关键帧的数据。具体来说在这里就是控制实体的X坐标变换的关键帧数据了。
所以在你的代码中不断的获取时间相应的OUTPUT值,并将其作为X变换因子作用于实体上,那么你的模型的动画就实现了。用线性插值计算关键帧之间的插值数据,会让你的动画看起来更加的平滑。 插值是什么意思?
插值就是计算一个值或多个值间的任意中间值。
比如我们有值X和Y,我们要计算它们两个的“中间”的值(注:也就是1/2处的值),我们使用0.5作为插值因数,这个插值因数我们称之为“T”。如果我们要找到X和Y间3/4处的值,我们使用的插值因数T=0.75,以此类推(注:原文3-Quater应为3-Quarter即四分之三)。
你可以让T以不同增量比如0.001、0.01、0.05等等做一个从0.0到1.0的循环,然后你就可以得到它们之间的很多很多插值。
线性插值是一种很简单的插值方法,它的公式如下所示:
float Interpolate( float a_Value1, float a_Value2, float a_T) {
return ((a_Value2 * a_T) + ((1 - a_T) * a_Value1)); }
这个公式表明,如果\为0,那么它会返回给你的值;如果它是1,那么会返回给你的值;如果它是0到1之间的值,那么它会返回一个a_Value1到a_Value2之间的值。
实际上还有其它更好的插值方法。比如贝塞尔插值,三次方插值等。它们有更为复杂的公式,而且它们的插值是基于多于两个值的情况。但我们只使用线性插值,这也是为了简单考虑。
现在正如我们之前所说的,这个例子并不是我们的示例文件中所出现的实际内容,所以让我们来看看实际内容是怎么样的。
谨记我们的假设,我们只有两种类型的结点,同时我们有16*3=48个
这种情况:
第二种情况,我们获得的矩阵的值,是不属于那三种source之中任意一种的,这和我们在控制器的反向矩阵中遇到的情况是一样的。而第一种情况下组成4X4矩阵的每一个值来自不同的source,因此当我们读数据的时候,必须把它们组合起来。 如果你记得我们从 好了,这就是所有的东西了(原文:And that’s all pretty much it.这是什么鸟语)。如果你从头到尾读完了这篇教程,我猜你已经可以写出你自己的COLLADA文档导出工具了。而且现在你可以准备去读这篇教程的下一部分了,如果你之前还没有看过的话。 这个公式表明,如果\为0,那么它会返回给你的值;如果它是1,那么会返回给你的值;如果它是0到1之间的值,那么它会返回一个a_Value1到a_Value2之间的值。 实际上还有其它更好的插值方法。比如贝塞尔插值,三次方插值等。它们有更为复杂的公式,而且它们的插值是基于多于两个值的情况。但我们只使用线性插值,这也是为了简单考虑。 现在正如我们之前所说的,这个例子并不是我们的示例文件中所出现的实际内容,所以让我们来看看实际内容是怎么样的。 谨记我们的假设,我们只有两种类型的结点,同时我们有16*3=48个 这种情况: 第二种情况,我们获得的矩阵的值,是不属于那三种source之中任意一种的,这和我们在控制器的反向矩阵中遇到的情况是一样的。而第一种情况下组成4X4矩阵的每一个值来自不同的source,因此当我们读数据的时候,必须把它们组合起来。 如果你记得我们从 好了,这就是所有的东西了(原文:And that’s all pretty much it.这是什么鸟语)。如果你从头到尾读完了这篇教程,我猜你已经可以写出你自己的COLLADA文档导出工具了。而且现在你可以准备去读这篇教程的下一部分了,如果你之前还没有看过的话。
正在阅读:
Collada 快速入门 - 图文12-14
发展预备党员谈话记录及注意事项09-08
2012—2013(下)《鸟岛》教案309-18
智商高的孩子有这20种表现12-21
关于公司介绍信的样本12-10
工作简报优秀范文_农村工作简报范文08-06
安全意识之我见作文1000字07-14
人类最大的难题读后感03-12
自动喷灌系统组态设计说明书11-07
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 入门
- Collada
- 快速
- 图文
- 供应室年度工作计划(共10篇)
- 导数中证明不等式技巧 - 构造、切线放缩、二元变量、凹凸反转,唯手熟尔!
- 武大考研(国家重点实验室和遥感院)地理信息系统专业真题2003-2013年
- 2016年牛津译林版八年级英语上册Unit5单元试卷含答案
- 课程文本
- 一年级奥数题(精心整理)
- 鲁滨孙漂流记教学设计
- 《发展汉语(第二版)初级读写》全套教案
- 电焊工技师理论考试题2
- 冲孔灌注桩在施工中常见的问题和处理措施
- 员工满意度调查公司+个人
- 汽车电器基础与设计复习题(12车辆)
- 2013年中考语文一轮复习九年级下册第一单元助学方案
- 施工抽放钻孔安全技术措施
- 热力学第一定律的应用
- 金融开放与中国经济结构转型 - 基于pugno修正模型的实证研究 - 张楠
- 高考英语感谢信
- 误会,满分作文
- 党建工作责任书自查报告
- 网络整合营销的六个要求