在目前的進度中,我是採用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)