level 7
在上次的教学中,我们已经学会了载入模型。
但是,还记得上例中的skull.LoadTVM中的两个true吗?没错,这表示材质和贴图我们使用的是TVM模型中记录的设置。如果我们想要自己去设定,应该怎么做呢?
今天首先介绍的是TV3D中的TVTextureFactory类
还是使用上一个例子,我们接着来完善。
2011年04月07日 08点04分
1
level 7
首先在声明部分加入:
1.public TVTextureFactory TexFact;
复制代码
然后记得要:
1.TexFact = new TVTextureFactory();
复制代码
这个TextureFactory实际上是TV3D引擎的贴图管理器,通过它可以载入贴图,从而应用到我们的模型上。
本例中,因为不需要使用默认的贴图材质,这一句就可以改成这样:
1.skull.LoadTVM(@"D:\\Program Files\\TV3D SDK 6.5\\media\\skull\\skull.TVM", false, false);
复制代码后面两个参数都false掉。
之后:
1. int TexIndex;
2. TexIndex = TexFact.LoadTexture(@"C:\\Program Files\\TV3D SDK 6.5\\media\\kam1.jpg");
3. skull.SetTexture(TexIndex);
复制代码贴图我用的是下面这张:
你也可以使用任意的图片,注意修改路径和文件名。
运行程序:
2011年04月07日 08点04分
3
level 7
看到没有,贴图已经设置好了。
代码中,我使用了一个TexIndex变量来保存这张贴图的序号,这样就可以用这个变量来表示这张贴图了。当然,每个人的习惯不一样,你可能会觉得用这么个序号不够形象。那么你还可以这样:
1. skull.SetTexture(TexFact.LoadTexture(@"D:\\Program Files\\TV3D SDK 6.5\\media\\kam1.jpg","myFirstTexture"));
复制代码
一行程序就搞定了。因为LoadTexture会直接返回一个int值(即该贴图的序号),只不过没有保存在另一个变量里罢了。注意,这里在LoadTexture中,不但有图片的路径,我还写了一个"myFirstTexture"的String值。这代表这张贴图的名称,并非必要,你可以试试,去掉"myFirstTexture"程序一样可以正常运行。只是说,如果我们后面还要使用到这张贴图,就可以通过这个名称来访问,不需要再一次LoadTexture了。
至于如何通过名称来获取贴图,很简单,用TVGlobals对象就可以了。我们之前已经声明了一个名为Globals的TVGlobals,这里可以直接使用:
1.Globals.GetTex("myFirstTexture");
复制代码
就可以获得这张名为"myFirstTexture"的贴图的序号。
那有的同学就问了,说:“哎呀,这个贴图为什么是一块一块的吖?” 嗯哼,这就要结合一些三维美术的知识来解释了。其实这是因为.......哎呀,懒得打字了,大家自己到百度上搜索一些关于UV的介绍吧,我懒得解释了。
其实贴图还有很多东西可以说,但是这一次就先到此为止吧。下面来看看材质的设置。
和刚才类似,在声明部分加一行:
1.public TVMaterialFactory MatFact;
复制代码记得要:
1.MatFact = new TVMaterialFactory();
复制代码然后:
1. int MatIndex;
2. MatIndex = MatFact.CreateMaterial("myFirstMaterial");
3. MatFact.SetAmbient(MatIndex, 0.1f,1f,0.3f,1f);
4. MatFact.SetDiffuse(MatIndex,0.5f,1f,1f,1f);
5. MatFact.SetEmissive(MatIndex,1f,1f,1f,1f);
6. MatFact.SetOpacity(MatIndex, 1f);
7. MatFact.SetSpecular(MatIndex, 1f, 1f, 1f, 1f);
8. MatFact.SetPower(MatIndex,50f);
复制代码
具体操作方法和贴图基本相同,不再一一解释。关于材质,可以设置的参数比较多,常用的上面都列出来了。英文好的同学应该一目了然的看懂了每一项设置的意义,英文不好的自己去查一查、再结合自己的实践就知道了。
2011年04月07日 08点04分
4