英吋 XNA

XNA – 攝影機與地形

在目前的進度中,我是採用mindshifter所發佈的camera & input Library。
它提供了三種攝影機:LookAt、Orbit和Quaternion。
LookAt就是最基本的定點攝影機嚕~
Orbit就是MMORPG常用的,環繞在玩家旁邊的攝影機。
Quaternion白話一點就是Free攝影機!
基本上我覺得這三個就很夠用,真是太感謝這位大大,可惜我不會用英文表達感激

其實一開始是使用書本上給的Camera套件,但搞了老半天還是不太懂怎樣運作的…
也就是前陣子發的那篇不知所云的文章XDD
剛好這位大大Lib
架構(界面上)很相似,很順利的取代之。

至於這篇文章主要是在說Orbit攝影機與地形的碰撞。
(LookAt沒必要、Free相機應該也只在Debug用吧~)
這裡的地形是指對應HeightMap的類型,就算不是,只要能取到高度就可以了。


就是很簡單的把高度向上提升而已~很簡單吧!

嘗試在遊戲邏輯中限制,效果完全不如預期,根本就不理我…
想了很久,還是得要回到攝影機更新時做判斷才是最佳選擇。
本來打算把地形的類別丟去給攝影機使用,想想又太過於麻煩,而且地形類別還不太穩定。
再來就是想說弄個介面(interface)給它,這樣就不用怕太大的更動。
這樣又太容易被牽制,還要顧慮到兩邊界面的同步,麻煩!

最後,想到目前最少更改的方式。
給Orbit攝影機加上偵測高度的開關(bool)和目前所在點的高度(float)。

 /// <summary>
 /// 是否要檢查高度
 /// </summary>
 bool mIsCheckHeight = false;
 public bool IsCheckHeight
 {
     get { return this.mIsCheckHeight; }
     set { this.mIsCheckHeight = value; }
 }
 /// <summary>
 /// 限制高度的最低點
 /// </summary>
 float mTerrainHeight = 0f;
 public float TerrainHeight
 {
     get { return this.mTerrainHeight; }
     set { this.mTerrainHeight = value; }
 }

從遊戲邏輯中不斷更新高度,再讓攝影機內部去判定。

 // 加入地型碰撞
 if (this.mIsCheckHeight && this.Position.Y < this.mTerrainHeight)
 {
     this.mEyeSpring.Origin = new Vector3(this.Position.X, this.mTerrainHeight, this.Position.Z);
 }

這樣未來地形有改變也不用特別去更改攝影機的部分了~

 // 攝影機與地形碰撞
 if (this.myTerrain.IsOnHeightmap(cam.Position))
 {
     this.camera.TerrainHeight = this.myTerrain.GetHeight(cam.Position) + 10f;
 }

嘛~其實和HeightCollision範例的攝影機做法差不多。
這邊要注意一點,不要讓攝影機剛好放在地面上,最好加入一點修正值。
像是我先暫時讓它向上修正10個單位(公分),來避免貼在地上。


這樣處理之後的效果算是很不錯,終於可以不用被地形擋倒視線了
(加上簡單的天空包取代藍色背景整個就差很多呢XDD)

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.