天天看點

Silverlight C# 遊戲開發:L3 遊戲的3D空間

在國中數學中我們學到過平面坐标系(笛卡爾坐标系),2D的坐标系最好了解,它隻有兩個軸,用來表示的數字相當簡單,3D的空間比2D多了一軸,但是卻多出了很多2D空間沒有的概念。有趣的是,2D空間的很多概念卻是3D空間的基礎,通過推論得到3D空間的結論。

3D坐标系有一個很重要的概念是左右手的坐标系定義,決定了軸向的正負方式,在不同的領域中是完全不同的,如果将一個左手坐标系制作出來的3D模型放在一個右手坐标系中,那麼他們的左右是相反的,下圖來自《3D數學基礎》對左右手坐标系有了一個比較清晰的表示:

<a target="_blank" href="http://blog.51cto.com/attachment/201111/113844695.jpg"></a>

我看過DirectX的左右手坐标系的介紹,一直一知半解,然而這圖卻直接解惑了,對應的坐标系方向清單,請參看下表:

<a target="_blank" href="http://blog.51cto.com/attachment/201111/113855549.jpg"></a>

可是,我在這裡說了這麼多概念化的基礎知識,有什麼用呢?有很大的作用,這将幫助我們了解遊戲的3D空間,最根本解決的就是大小、位置、距離、移動等等的一系列問題,比如說,我們從3D軟體中導出的模型就需要考慮這些基本的問題。當然,最主要的是通過這裡進行控制3D遊戲世界中的一草一木。

那麼,現在我們可以看看錄影機和物體之間的概念和關系,先看下圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201111/113908553.jpg"></a>

在前面的3D介紹中,我們一直沒有在控制坐标,Balder中使用的是Position屬性, 這個屬性被封裝很好,可以使用故事闆來控制,然而真正的3D世界中我們一般使用的是向量(Vertex),下面我們通過一段代碼來看看3D空間中的坐标軸,同時我們一起來學習最基本的世界組成部分:點和線。

/// &lt;summary&gt; 

/// 遊戲的坐标軸類  

/// &lt;/summary&gt; 

public class Game_Axis : Balder.Objects.Geometries.Geometry  

{  

public Game_Axis(Vertex v_start, Vertex v_end, Balder.Color color)   

//配置設定頂點數量,決定下面的SetVertex的索引  

FullDetailLevel.AllocateVertices(2);  

//設定頂點,以向量為參數,第一個是索引值  

FullDetailLevel.SetVertex(0, v_start);  

FullDetailLevel.SetVertex(1, v_end);  

//配置設定線的數量,決定了SetLine的索引  

FullDetailLevel.AllocateLines(1);   

//new一條線出來,參數a和b分别表示上了上面頂點的索引  

Balder.Objects.Geometries.Line l1 = new Balder.Objects.Geometries.Line(0, 1);  

//添加這條線  

FullDetailLevel.SetLine(0, l1);   

//顔色設定  

base.Color = color;  

}  

現在将控件的構造函數修改如下,請注意注釋L3的下面部分:

Lesson03構造函數

public Lesson03()  

InitializeComponent();  

//L1  

Game game = new Game() { Width = 600, Height = 400 };  

game.Camera = new Camera();  

game.Camera.Position = new Coordinate(100, 120, 150);  

game.Camera.Target = new Coordinate(0, 0, 0);  

game.Children.Add(new OmniLight() { Position = new Coordinate(0, 0, 0) });  

//L3  

Game_Axis axis_x = new Game_Axis(new Vertex(-300, 0, 0),new Vertex(300, 0, 0),Colors.Red);  

Game_Axis axis_y = new Game_Axis(new Vertex(0,-300, 0), new Vertex(0,300, 0), Colors.Blue);  

Game_Axis axis_z = new Game_Axis(new Vertex(0, 0,-300), new Vertex(0, 0,300), Colors.Green);  

game.Children.Add(axis_x);  

game.Children.Add(axis_y);  

game.Children.Add(axis_z);  

//L2  

Mesh Teapot = new Mesh();  

//設定坐标  

Teapot.Position = new Coordinate(0, 0, 0);  

//開啟互動操作(可使用滑鼠旋轉)  

Teapot.InteractionEnabled = true;  

//讀取檔案的名字,目前支援ase的檔案格式  

Teapot.AssetName = new Uri("/Balder_Studio;component/Res/teapot.ase", UriKind.Relative);  

//将茶壺添加到Game當中  

game.Children.Add(Teapot);  

LayoutRoot.Children.Add(game);  

本篇主要介紹了坐标系概念和3D空間,同時使用點和線顯示了一個坐标軸,但是這看起來越來越複雜了,有什麼好的方法簡化嗎?在後面,我會專門介紹模型組,更加深層了解Silverlight3D遊戲世界,最終會開發一個3D遊戲作為結束。

本文轉自nowpaper 51CTO部落格,原文連結:http://blog.51cto.com/nowpaper/712297