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

來源:互聯網
上載者:User

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

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

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

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

那麼,現在我們可以看看攝像機和物體之間的概念和關係,先看:

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

承接上一個部分的代碼(Silverlight C# 遊戲開發:L2 自訂模型匯入)只需要修改一部分就可以了,我們先創造一個座標軸類:

 

/// <summary>
/// 遊戲的座標軸類
/// </summary>
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遊戲作為結束。

原始碼:點擊這裡下載工程

工程中如果缺少Balder.dll請在這裡快速下載:SL4_Balder.rar

推薦Silverlight遊戲開發部落格:深藍色右手 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.