1、本篇要點html
續文章建立本身的primitives,在以前這篇文章中,咱們介紹瞭如何自制balder中基本體的過程,咱們一步步完善基本體,從最開始的只有線構成,到接下來的實體,到最後的具備顏色的實體,本篇將在此基礎上,結合以前對balder內的基本體的貼圖過程,咱們來看看它們之間有什麼區別,又有什麼相同之處。vim
2、溫故知新ide
在以前,咱們已經講到過,如要對3D模型進行貼圖,那麼你須要用到DiffuseMap屬性,在我以前的文章中,主要是經過xaml進行聲明式的引用到了本地資源,而另外一種方式則是在後臺代碼中加載資源文件,生成ImageMap對象,進行對DiffuseMap的賦值便可,雖然以前文章中沒寫具體過程,可是在文章的評論中已經和一位朋友以討論的方式給出的過程,另外,Nowpaper前輩也在他的這篇文章中http://www.cnblogs.com/nowpaper/archive/2011/01/23/1942354.html,給出了詳細過程。請參考之~接下來,我就假設你已經明白而且已經成功的給balder內基本體成功貼圖。除此以外,也假設你已經會本身作本身的基本體了,若是都ok了,那麼繼續往下看,立刻就進入正題(廢話好像有點多,年紀大了沒辦法)。函數
3、給本身的基本體進行貼圖操做htm
先打開上次完成的那個工程,我上次作的是一個三棱錐,固然,你作的可能還有更高級複雜些,反正有現成的就行,若是沒有的話就得動手從開始作了,這裏就再也不多講以前的知識了,好了,還記得在上次中咱們是這樣開始的:對象
1.public class MyMesh:Geometry 咱們的基本體繼承了Geometry類
2.而後咱們的因此操做都在 public override void Prepare(Balder.Display.Viewport viewport)函數中進行的blog
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中調用,其他就很少講了,我對這些也是外行,真怕講錯,你們若是仍是不清楚的地方能夠查看紋理相關的資料,我若有講得不對的地方,但願你們提出來,我一定虛心接受,不知不覺又熬夜了,今天偷懶下,不發運行效果了,就截個圖了,實在是太困了,準備睡覺:)效果見下面: