文档章节

Balder 3D开发系列之--给自定义基本体进行贴图操作

卧雪Sirk
 卧雪Sirk
发布于 2016/03/19 08:54
字数 1410
阅读 12
收藏 0

一、本篇要点

      续文章创建自己的primitives,在之前这篇文章中,我们介绍了如何自制balder中基本体的过程,我们一步步完善基本体,从最开始的只有线构成,到接下来的实体,到最后的具有颜色的实体,本篇将在此基础上,结合之前对balder内的基本体的贴图过程,我们来看看它们之间有什么区别,又有什么相同之处。

二、温故知新

      在之前,我们已经讲到过,如要对3D模型进行贴图,那么你需要用到DiffuseMap属性,在我之前的文章中,主要是通过xaml进行声明式的引用到了本地资源,而另一种方式则是在后台代码中加载资源文件,生成ImageMap对象,进行对DiffuseMap的赋值即可,虽然之前文章中没写具体过程,但是在文章的评论中已经和一位朋友以讨论的方式给出的过程,另外,Nowpaper前辈也在他的这篇文章中http://www.cnblogs.com/nowpaper/archive/2011/01/23/1942354.html,给出了详细过程。请参考之~接下来,我就假设你已经明白并且已经成功的给balder内基本体成功贴图。除此之外,也假设你已经会自己做自己的基本体了,如果都ok了,那么继续往下看,马上就进入正题(废话好像有点多,年纪大了没办法)。

三、给自己的基本体进行贴图操作

        先打开上次完成的那个工程,我上次做的是一个三棱锥,当然,你做的可能还有更高级复杂些,反正有现成的就行,如果没有的话就得动手从开始做了,这里就不再多讲之前的知识了,好了,还记得在上次中我们是这样开始的:

1.public class MyMesh:Geometry 我们的基本体继承了Geometry类

2.然后我们的所以操作都在 public override void Prepare(Balder.Display.Viewport viewport)函数中进行的

3...

第三步就是今天要做的了,之前我们已经封装了三个函数,一个用来产生顶点,一个用来产生线,一个用来产生面。那我们今天再加一个,再一个产生纹理,然后取个名字叫做:private void GenerateTextureCoordinates()

然后,先上代码
1 private void GenerateTextureCoordinates()
 2 {
 3 FullDetailLevel.AllocateTextureCoordinates(4);
 4 FullDetailLevel.SetTextureCoordinate(0, new TextureCoordinate(0, 1));
 5 FullDetailLevel.SetTextureCoordinate(1, new TextureCoordinate(1, 1));
 6 FullDetailLevel.SetTextureCoordinate(2, new TextureCoordinate(1, 0));
 7 FullDetailLevel.SetTextureCoordinate(3, new TextureCoordinate(0, 0));
 8
9 FullDetailLevel.SetFaceTextureCoordinateIndex(0, 0, 1, 2);
10 FullDetailLevel.SetFaceTextureCoordinateIndex(1, 0, 2, 3);
11 FullDetailLevel.SetFaceTextureCoordinateIndex(2, 0, 1, 2);
12 FullDetailLevel.SetFaceTextureCoordinateIndex(3, 0, 2, 3);
13
14
15
16 }

      这就是今天的关键,如果,你没有这一步操作,也就是没有生成纹理,那么你的贴图操作就会失败,当然,如果你有纹理生成,但是中间过程出错,那么贴图的结果会令你大吃一惊。在生成纹理的方法中,主要用到了三个东西:

1.FullDetailLevel.AllocateTextureCoordinates()

2. FullDetailLevel.SetTextureCoordinate()

3.FullDetailLevel.SetFaceTextureCoordinateIndex()

你看着是不是觉得有点眼熟?没错,它们长得和之前我们处理顶点,线和面的那些个家伙确实有点像,那么它们到底是怎么用的呢?就以对三棱锥的纹理生成为例子,首先,我们需要做的是分配纹理一些顶点,这里我们的三棱锥是四个顶点所以我们就这样做:

 FullDetailLevel.AllocateTextureCoordinates(4);

接着,我们来设置纹理的坐标:

            FullDetailLevel.SetTextureCoordinate(0, new TextureCoordinate(0, 1));

            FullDetailLevel.SetTextureCoordinate(1, new TextureCoordinate(1, 1));

            FullDetailLevel.SetTextureCoordinate(2, new TextureCoordinate(1, 0));

            FullDetailLevel.SetTextureCoordinate(3, new TextureCoordinate(0, 0));  
里面有两个参数,前一个是纹理坐标的索引,在下一个方法中将会使用它们,而第二个参数是一个 TextureCoordinate对象,这里我通俗的讲,纹理其实就是一幅二维的图像(当然是个人理解,不一定正确),当我们把本地的图片贴到基本体上去时,就是通过纹理来进行测量,纹理坐标就是图片中每一个像素的坐标,举个例子:

比如把一个纹理的都整个设置给了一个primitive,然后(0.5, 0.7)这个点的颜色就是(0.5*texture_width, 0.7*texture_height)的颜色值,当然啦,如果取出来的坐标不是一个整数,那么就最近取一个点的色值了。 通过这种方法达到给primitive中的每个点赋值来达到显示效果。所以,这里我们打算把整个纹理给基本体,所以,纹理的坐标是第0个坐标(0,1),第一个坐标(1,1),第二个坐标(1,0),第三个坐标(0,0)。

接下来,我们就通过使用上面的纹理坐标来进行映射:

            FullDetailLevel.SetFaceTextureCoordinateIndex(0, 0, 1, 2);

            FullDetailLevel.SetFaceTextureCoordinateIndex(1, 0, 2, 3);

            FullDetailLevel.SetFaceTextureCoordinateIndex(2, 0, 1, 2);

            FullDetailLevel.SetFaceTextureCoordinateIndex(3, 0, 2, 3);   
这里我们对三棱锥的四个面进行了映射,如果你把其中的一句注释掉,你就会发现有一个面的贴图就会失败,不信可以试试。完成这些后,把这个函数也加到Prepare中调用,其余就不多讲了,我对这些也是外行,真怕讲错,大家如果还是不清楚的地方可以查看纹理相关的资料,我如有讲得不对的地方,希望大家提出来,我必定虚心接受,不知不觉又熬夜了,今天偷懒下,不发运行效果了,就截个图了,实在是太困了,准备睡觉:)效果见下面:  
 
   
 

 


 

© 著作权归作者所有

卧雪Sirk

卧雪Sirk

粉丝 0
博文 60
码字总数 23226
作品 4
杭州
技术主管
私信 提问
Balder 3D开发系列之--创建天空盒

一、天空盒的概念 天空盒是一种让计算机游戏屏幕背景具有更广阔视野的一种方法,当使用天空盒的时候,水平画面被限制在一个立方体当中,背景中遥远的山川,远处的建筑,还有天空等等都被投射...

卧雪Sirk
2016/03/19
28
0
《Genesis-3D游戏引擎系列教程-进阶篇》3:转动的球体

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 转动的球体 资源下载 工程文件 当我们掌握了一些Genesis-3D编辑器的操作技巧之后,现在来尝试着做一个非常简单的游戏,一个转动的球体...

Genesis-3D
2014/01/20
0
0
《Genesis-3D游戏引擎系列教程-入门篇》三:资源的导入

注:本系列入门教程仅针对引擎编辑器:v1.2.2及以下版本 1、FBX文件的导入 模型导入是所有3D程序最基本的功能,但常常也是让很多新手最头疼的问题之一,现在就让我们来学习一下FBX文件导入的...

Genesis-3D
2014/01/17
0
0
游戏美术风格的归类与划分

导语:   关于游戏美术风格,必须结合着游戏美术文化和游戏引擎的发展来谈,任何把这两者剥离开就大谈风格的,无视游戏美术这门文化的皮毛论者,都是耍流氓。   第【I】【II】节,我们先...

XartDESIGN
2015/08/10
1K
2
从0到1思考与实现iOS-Widget

2017.03.22 讲述之前首先看下demo效果图: 然后再展示几个效果不错的 Widget app demo 地址在此!欢迎star 一、Widget总览 Widget 是 iOS8 推出第一版,在iOS 10 进行大幅度的优化 Widget可以...

si1ence
2018/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
29分钟前
3
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
37分钟前
3
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
45分钟前
2
0
想说再见不容易,win7最新市占率依然超36%

微软正在通过努力让Windows 7用户升级至Windows 10,不过从目前的市占率来看,他们还是要加把劲了。 据最新的市场份额看,Windows 10在本月的市场份额有所提升,从43.62%增长到44.10%。另一...

linuxCool
56分钟前
4
0
SQL的优化

对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建了索引。 应尽量避...

咸鱼-李y
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部