【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 13451|回复: 13

Ogre3D 引擎評估

[复制链接]
发表于 2006-10-25 14:54:42 | 显示全部楼层 |阅读模式

Last edited Sep 6, 2006
More by ShepJeng »

1. 速度還不錯



OGRE 在免費、開源的引擎中評價最高,一個原因是作為一個圖形渲染引擎,它支持的圖形特性最多,所以渲染質量也不錯;另一個原因是設計模式的清晰;最後,速度也不錯。看下面的截圖,100個飛龍,200000個三角形,能跑60FPS。

這個還沒有應用到 LOD 層次細節技術,已經能跑這麼快了,況且它有模型和場景的 LOD 支持。
LOD 在製作複雜宏大的遊戲的時候,實在是最受歡迎的一個特性。

2. 魔族部隊之如火如荼



15*15 個飛龍,場面好壯觀。
一切都還是靜態模型,如果是角色動畫,放不了這麼多。
不帶投影,但帶自身陰影。


知識點:

Sky Dome (天空穹)

void Ogre::SceneManager::setSkyDome  (
bool enable, // 是否啟用
const String & materialName, // 材質名稱
Real curvature = 10, // 曲率:天空穹的曲率
Real tiling = 8, // 鋪嵌:天空材質的鋪嵌回數
Real distance = 4000, // 距離:與中央鏡頭的距離
bool drawFirst = true, // 是否首先繪製:確保天空在其它一切物體之外
const Quaternion & orientation = Quaternion::IDENTITY // 方向:一致
) [virtual]


天空穹,像一個罩在大地上的罩子,「天似穹廬」,看上去它是個切去了底部的球體,實際上它是由一個切去了底部的立方體盒子來模擬,跟天空盒(Sky Box)的區別就是它沒有底部。在 OGRE 的 Demo_SkyDome 示例運行中按 [R] 看線框就能看到天空穹的線框。
天空穹的好處不止是省了一個面,而且它只需要一張材質,所以,它比天空盒更方便靈活的地方就是它可以利用材質的循環運動模擬天空中的雲彩飛揚,在這個例子中,雲彩就是飛動的。


天空穹的兩個主要屬性在於曲率(curvature)和鋪嵌(tiling),曲率越大天空穹看上去越彎曲,鋪嵌越大材質的重複越多。

3. 官網及代理



OGRE 官方網站:
Http://www.ogre3d.org/


有的地方連不上這個網址,可以嘗試使用代理,給一個代理列表:

http://www.cybersyndrome.net/plr.html

按速度排序,除了灰色的別的都是匿名代理。

我是用這個代理來上的(韓國代理):
210.90.9.129:80

4. 絢爛的粒子特效



OGRE 最基本的粒子系統,從我現在的初步了解來看,包含三個層次的控制:

ParticleSystemManager --> ParticleSystem --> ParticleEmitter
粒子系統管理器-->粒子系統-->粒子發射器

三個層次各自具有相關控制,我目前僅了解最下層的粒子發射器屬性的控制。粒子發射器的屬性控制主要包括下列方法:

setPosition                設置發射器位置
setDirection 設置發射口方向
setAngle 設置粒子發散角
setParticleVelocity 設置粒子速度
(可設置為一個統一速度或一個由最小值與最大值確定的隨機範圍)
setEmissionRate 設置發射速率
setTimeToLive 設置粒子壽命
(可設置為一個統一壽命或一個由最小值與最大值確定的隨機範圍)
setColour 設置粒子顏色
(可設置為一個統一顏色或一個由最小值與最大值確定的隨機範圍)
setEnabled 設置發射器的啟用與關閉
setStartTime 設置開始時間
setDuration 設置每一次發射的持續時間
(可設置為一個統一持續時間或一個由最小值與最大值確定的隨機範圍)
setRepeatDelay 設置重複延時
(可設置為一個統一持續時間或一個由最小值與最大值確定的隨機範圍)
setParameter 設置具體參數



粒子發射器的最基本的控制方法就是這些,更具體的控制,例如顏色、紋理、力場、角度、尺寸的變化,以及點狀、盒、環、柱、球、空心球各種發射器形狀的控制,通過粒子影響車間(ParticleAffectorFactory)和粒子發射車間(ParticleEmitterFactory)兩個類來實現,這兩個類的結構圖如下所示:

OK ,先看今天的 Demo 圖片,改裝自 Demo_SkyBox :

天空盒(Ske Box) 是個很熟悉的概念了,看它的函數原形:

void Ogre::SceneManager::setSkyBox  (
bool enable, // 是否啟用
const String & materialName, // 材質名稱
Real distance = 5000, // 與中心鏡頭(位於世界原點)的距離
bool drawFirst = true, // 是否首先繪製
// (確保天空盒位於一切物件之後)
const Quaternion & orientation = Quaternion::IDENTITY // 方向
) [virtual]


天空盒需要六張不同的貼圖用來貼在盒子的六個面上,相對於天空穹(Ske Dome),它適用於營造更真實的、具有地平線遠景的、固定不動的、或者需要營造全方向的宇宙空間時。

不管是天空盒還是天空穹還是天空板(Sky Plane),它們共同的實現原理是:
(1) 不管照相機怎麼動,他們與照相機的相對位置總是不變;
可以想像天空盒是個大盒子,不管鏡頭移動到哪裡,它的圓心總是與鏡頭的位置重合;
(2) 天空總是被首先繪製以確保天空位於一切物體之後;
(3) 天空的材質不受光照影響;
如果受光照影響,天空盒就會有明暗,盒子的內棱就會有陰影,各個面的明暗差別也會明顯,天空看上去就不再混圓一體了。

 楼主| 发表于 2006-10-25 14:55:23 | 显示全部楼层
5. 機器人大閱兵


16*16 個機器人,每個機體 330 個三角形,帶骨骼動畫,動畫使用平滑的非線性插值。未使用 LOD 技術。
用上模型和紋理的 LOD ,用來創建千軍萬馬的壯闊場面再合適不過了。越來越喜歡這個引擎了。

InterpolationMode 插值模式
IM_LINEAR 線性插值
IM_SPLINE 樣條插值,產生平滑的角度過渡
RotationInterpolationMode 旋轉插值模式
RIM_LINEAR 線性插值,快速但不一定生成理想的結果;
RIM_SPHERICAL 球性插值,更精確但是耗費較高;
6. 實時反射與紋理混合


實時反射(Realtime Reflection)通常使用渲染到紋理(Render to Texture)技術來實現,這個技術需要使用一個虛擬的鏡頭,這個虛擬鏡頭與真實鏡頭相對於反射面呈鏡面對稱,把虛擬鏡頭拍攝下來的場景渲染到紋理上,把這個紋理賦給反射表面的材質,同時使用多層紋理的混合技術,使反射紋理與反射表面的本身紋理適當混合以表現鏡面的質感或者營造特別的反射效果。

下面是 OGRE 製造實時反射的效果截圖,128個動畫人物,人物被賦予了特殊材質。速度還是不錯:

這個示例的技術實現還是比較複雜,現在還沒有全部搞懂,但是裡面反射紋理與反射表面的本身紋理的混合模式比較好玩。紋理混合通過 setColourOperationEx 來實現,這個方法的原型是:

void Ogre::TextureUnitState::setColourOperationEx  (
LayerBlendOperationEx op, // 混合操作模式
LayerBlendSource source1 = LBS_TEXTURE, // 用於混合操作的源紋理 1
LayerBlendSource source2 = LBS_CURRENT, // 用於混合操作的源紋理 2
const ColourValue & arg1 = ColourValue::White, // 用於手動混合模式的混合顏色 1
const ColourValue & arg2 = ColourValue::White, // 用於手動混合模式的混合顏色 2
Real manualBlend = 0.0 // 手動混合係數
)


其中的第一個參數 LayerBlendOperationEx op 指定混合模式,具體的混合模式在命名空間 LayerBlendOperationEx 中枚舉,有如下一些模式,附上圖示:

LBX_SOURCE1 直接使用源紋理 1
LBX_SOURCE2 直接使用源紋理 2


LBX_MODULATE 源紋理 1 與 源紋理 2 顏色值相乘

LBX_MODULATE_X2 類似於 LBX_MODULATE 但是更亮 (x2)

LBX_MODULATE_X4 類似於 LBX_MODULATE 但是更亮 (x4)

LBX_ADD 源紋理 1 與 源紋理 2 顏色值相加

LBX_ADD_SIGNED 類似於 LBX_ADD 但是從結果中減去 0.5

LBX_ADD_SMOOTH 類似於 LBX_ADD 但是從結果中減去它們的乘積

LBX_SUBTRACT 源紋理 1 與 源紋理 2 顏色值相減

LBX_BLEND_DIFFUSE_ALPHA 使用頂點的 Alpha 插值乘以源紋理 1 的顏色值,使用 (1-Alpha) 乘以源紋理 2 的顏色值,然後相加
LBX_BLEND_TEXTURE_ALPHA 類似於 LBX_BLEND_DIFFUSE_ALPHA 但是使用紋理的 Alpha 值
LBX_BLEND_CURRENT_ALPHA as LBX_BLEND_DIFFUSE_ALPHA, but use current alpha from previous stages


LBX_BLEND_MANUAL 類似於 LBX_BLEND_DIFFUSE_ALPHA 但是使用一個手動混合常量(0.0-1.0)
下面的截圖是手動混合係數 0.05 的效果,也就是反射效果變得很淡、不明顯。

LBX_DOTPRODUCT 源紋理 1 與 源紋理 2 顏色值的點積
 楼主| 发表于 2006-10-25 14:56:00 | 显示全部楼层
7. 資源腳本


OGRE 裡面的圖形、聲音等資源,包括紋理、材質、模型、骨骼動畫、粒子特效,字體、界面等等,全部可以使用腳本來組織和定義,然後在程序中讀取和放置、調整參數,這比在程序中直接創建這些東西要簡單省力得多。

我現在仍然沒有全面了解 OGRE 的粒子系統,目前所看過的示例,大部分是對粒子腳本的直接調用。查看 OGRE\Samples\Media\particle\ 下面的粒子定義腳本(*.particle 文件),可以對 OGRE 的腳本系統有一個直觀的印象,下面是 Example.particle 中一段粒子定義腳本的示例:

Examples/PurpleFountain               // 粒子系統的名稱
{
material Examples/Flare2 // 材質
particle_width 20 // 粒子寬度
particle_height 20 // 粒子高度
cull_each false // 逐個剔除(目前意義不甚明了)
quota 10000 // 限額(粒子總數限制)
billboard_type oriented_self // 公告板類型:公告板表面的朝向類型

// Area emitter
// 區域發射器
emitter Point // 點狀發射器
{
angle 15 // 粒子發散角
emission_rate 75 // 發射速率(粒子個數/秒)
time_to_live 3 // 粒子壽命
direction 0 1 0 // 發射器方向
velocity_min 250 // 最小速度
velocity_max 300 // 最大速度
colour_range_start 0 0 0 // 顏色範圍下限
colour_range_end 1 1 1 // 顏色範圍上限
}

// Gravity
// 重力
affector LinearForce // 線形力場
{
force_vector 0 -100 0 // 力場速度
force_application add // 立場應用方式:相加
}

// Fader
// 淡入淡出
affector ColourFader // 顏色淡入淡出
{
red -0.25
green -0.25
blue -0.25
}
}


下面是經過改造的 OGRE\Samples\ParticleFX 示例的截圖:

查看 OGRE\Samples\Media\materials\scripts 裡面的材質定義腳本,可以幫助了解 OGRE 的材質組織方式。

用腳本來定義資源,再用程序來調用,無疑是個很聰明的辦法。
8. 動態光照


動態光照,光照的「動態」,不止包括它的位置變化,還包括它的顏色的變化,被光源所照亮的物體,隨著光源位置和亮度、顏色的變化,它的自身陰影和投影都會相應的變化。

下面是 OGRE\Samples\Lighting 示例的截圖:

9. 讀取 Quake 3 的 BSP 場景


Quake III Arena (簡稱 Q3A )由於 ID 公布了它的關卡編輯器的源代碼,使得它的 BSP 關卡文件格式能夠被大多數開源、免費或廉價的 3D 引擎所支持。在我摸過的引擎中,TrueVision3D 、Irrlicht 、NeoEngine 都能夠讀取 Q3A 的 BSP 關卡,但是,它們都不能像 OGRE 這樣對 BSP 的特性有相當全面的支持。TrueVision3D 對 BSP 的讀取尚存在 BUG ,它提供的示例在我的機器上不能讀取 BSP ;Irrlicht 對 BSP 的特性支持非常貧乏,在讀取的場景中,沒有了天空、沒有了粒子構成的火焰只剩下被火焰照亮的牆壁,沒有了材質的高級屬性:動態貼圖、紋理混合和特效,只剩下死氣沉沉的關卡,NeoEngine 相對 Irrlicht 似乎要好些,但是仍然不及 OGRE 這樣強大。在 OGRE 中, BSP 場景的天空穹、粒子特效、高級材質屬性,乃至 BSP 的空間分割規則,也就是當鏡頭處在一個分區,該看到哪幾個分區、不該看到哪幾個分區,都會被正確識別、自動實現,而在另外幾個引擎中, 部分 BSP 分割規則似乎被無視。下面看 OGRE 和 Irrlicht 的幾張對照效果:

OGRE: 材質的 Alpha 和混合疊加都被完美表現:

這個是 Irrlicht 同一個場景的同一個地方,…… :


下午用 OGRE 把 Q3A 的場景幾乎看了個遍,共享幾張場景截圖:

粒子火焰和動態貼圖:

Alpha 貼圖:

縮在牆角的東西,好像是關卡中的物件:

複雜紋理和反射貼圖:

迫力十足的摩界大門:

材質效果:


OGRE 調用 BSP 場景支持的代碼很簡單:

   // Scene creation
// 重載場景創建方法
void createScene(void)
{

// 讀取世界物體
mSceneMgr->setWorldGeometry(mQuakeLevel);

// 修改鏡頭屬性使之適合近拍
mCamera->setNearClipDistance(4); // 近切面
mCamera->setFarClipDistance(10000); // 遠切面

// 還能更改位置、設置為 Quake 類型的坐標系
ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true);
// 從關卡中隨機獲取現成視角
mCamera->setPosition(vp.position); // 使鏡頭位置與之重合
mCamera->pitch(Degree(90)); // 轉換為 Quake 使用的 Z up 坐標系
mCamera->rotate(vp.orientation); // 使鏡頭方向與之重合
// 不要沿不確定的方向搖鏡頭,可能會導致鏡頭傾斜
mCamera->setFixedYawAxis(true, Vector3::UNIT_Z); // 指定鏡頭縱軸

}

支持 Q3A 的 BSP ,意味著我們可以使用 Q3A 的關卡編輯器來為我們的 OGRE 編輯場景。有一個通用的關卡編輯器叫做 GtkRadiant ( http://www.qeradiant.com/ ) ,除了 Q3A ,它還可以作為下列遊戲的關卡編輯器:
RTCW
Half-Life
Jedi Knight II
Star Trek Voyager: Elite Force
Soldier of Fortune II
Enemy Territory
Quake II
Jedi Academy
Heretic II

感興趣的當然要拿來玩玩了。
Quake 和 Unreal (虛幻競技場) 兩個遊戲的關卡編輯器,在 3D 遊戲製作中有著至高無上的地位,當年我還在家種地的時候,就有一個叫 puzzy3d 的 3D 大牛對我說:只要掌握 Q3A 或 Unreal 關卡編輯器的任何一個,不愁找不到工作,如果沒人要,去他那裡,他要!
Unreal 的編輯器和它的腳本系統,在技術和自由度上,應該說遠超 Quake ,只是因為它沒有像 Quake 那樣開放源代碼,所以,它的關卡不像 Quake 這樣受到廣泛支持,雖然在畫面上看起來, Unreal 顯然要更勝一籌。Q3A 的 BSP 場景在現在看來,已經漸顯破落老邁,支持的特效並不是太多。
但是不管怎麼說,有時間的時候學學這兩個編輯器,你會對 3D 遊戲的開發技術,有一個更直觀更形象的認識,天空盒和天空穹是怎麼實現的?錯綜複雜的地形是怎麼生成的?天花亂墜的粒子特效是怎麼製作的?所謂的 BSP 、 Portal 到底是怎麼一回事?……所有的這些疑問,在深入接觸這兩個引擎之後都會變得明朗。
 楼主| 发表于 2006-10-25 14:56:32 | 显示全部楼层
10. 投影


OGRE 本體支持三種投影模式:


SHADOWTYPE_STENCIL_MODULATIVE 調製模版陰影 模版陰影技術之一,在所有不透明區域渲染完畢之後對所有陰影體積進行調製運算。在存在著多個光源的時候這個技術相對於疊加模版陰影逼近對速度的提升十分顯著,但是相比之下它還不是太真實。
SHADOWTYPE_STENCIL_ADDITIVE 疊加模版陰影模版陰影技術之一,它對每一個光源分別使用一個附加的通道渲染到場景。這個技術對系統的佔用非常大,因為它至少需要兩個通道來渲染整個場景,如果存在多個光源它還需要更多的通道。但是,相對於調製模版陰影逼近,它更真實,尤其是在使用彩色光源或凹凸貼圖的時候。
SHADOWTYPE_TEXTURE_MODULATIVE 調製紋理陰影 基於紋理的陰影技術,它包括一個單色的投影器渲染材質( render-to-texture ) 和一個把這個渲染材質投影到陰影接受者之上的調製通道。
SHADOWTYPE_NONE 無陰影

以上是翻譯的。

基本上總結一下:
(1)
論質量:疊加模版陰影 > 調製模版陰影 > 調製紋理陰影
論速度:疊加模版陰影 < 調製模版陰影 < 調製紋理陰影
參考下面三張圖的 FPS :
疊加模版陰影

調製模版陰影

調製紋理陰影

(2)
兩個模版陰影模式似乎都不支持16位顯示器色深,在 16 位色深下它們不顯示投影或顯示不正常;
紋理陰影支持 16 位和 32 位色深;


(3)
在 BSP 場景中放進動畫角色,角色的投影似乎只支持調製模版陰影模式;


下面是 Q3A 最大的 BSP 場景的一偶, 16 個「秦俑」在走路,使用了調製模版陰影逼近:

OGRE 使用到陰影尤其是動畫物體的陰影的時候,從渲染速度上來說,並不是太滿意,Irrlicht 似乎比它快一些,但也快不了多少。
免費引擎與商業引擎的最大一個區別,應該就是在速度上。

但是很多OGRE支持的優化技術, 多紋理( MipMap ) 、細節層次( LOD )等等,目前一直還沒有用到,如果靈活使用,速度應該有相當大的提升餘地。
11. 軌跡動畫


軌跡動畫(Animation Track),是 OGRE 所支持的幾種動畫模式(包括骨骼動畫)中的一種。通過讓節點(node)沿著一條預設了關鍵幀(Key Frame)的軌跡移動來實現節點的動畫。

OGRE 中創建和實施軌跡動畫的步驟大致如下:

1. 在主程序類的 Application :: createScene ( ) 場景創建方法中進行以下工作:

Animation * Ogre::SceneManager::createAnimation  (
const String & name, // 動畫名稱
Real length // 動畫長度(秒)
) [virtual]

(2) 使用 createTrack 方法為動畫創建軌跡動畫:
AnimationTrack * Ogre::Animation::createTrack (
unsigned short handle, // 分配給軌跡動畫的索引句柄,用於以後可能的調用
Node * node // 指定要沿著這條軌跡運動的節點
)

(3) 使用 createKeyFrame 方法為軌跡動畫創建一系列關鍵幀:
KeyFrame * Ogre::AnimationTrack::createKeyFrame (
Real timePos // 時間位置
)

(4) 使用 setTranslate 、 setScale 、 setRotation 三個方法來設置關鍵幀每個時間位置上節點的位置、縮放、旋轉屬性:
void Ogre::KeyFrame::setTranslate ( const Vector3 & trans )
void Ogre::KeyFrame::setScale ( const Vector3 & scale )
void Ogre::KeyFrame::setRotation ( const Quaternion & rot )

(5) 使用 createAnimationState 方法創建一個動畫狀態來追蹤這個軌跡:
AnimationState * Ogre::SceneManager::createAnimationState ( const String & animName ) [virtual]

(6) 使用 setEnabled 方法來激活動畫狀態:
void Ogre::AnimationState::setEnabled ( bool enabled )


2. 在接收器類的 Listener::frameStarted(const FrameEvent& evt) 方法中刷新動畫狀態:
void Ogre::AnimationState::addTime ( Real offset )

本章例程(OGRE\Samples\CameraTrack):
點擊下載此文件
12. 卡通渲染


這些材質,還是通過材質腳本來定義的,卡通材質是作為一種高級材質來定義的。
實際上現在隨著顯卡性能的提升, 圖形接口的更新換代、HLSH、GLSL、CG 等硬件材質腳本的誕生和發展,材質這東西做起來越來越簡單了。時代越發展,遊戲程序員所要考慮的底層的東西,一定會越來越少。


忍者的動畫模型,已經用膩了,以後試一下從 3dsmax 輸出模型和動畫、材質。
 楼主| 发表于 2006-10-25 14:57:58 | 显示全部楼层
13. 簡單路徑


通過創建簡單樣條曲線 (SimpleSpline) , OGRE 可以實現簡單的路徑動畫。在下面的示例截圖中,所有的角色都沿著各自的簡單路徑各自行走:

Ogre:: SimpleSpline 是個比較簡單的類,在文件 OgreSimpleSpline.h 中定義。它的使用辦法很簡單:

1. 首先要聲明一個 Ogre:: SimpleSpline 對象實例的數組或向量,用來保存一條路徑的全部節點信息,包括位置和切線;
同時要定義一個每段樣條曲線長度的變量或常量,在路徑動畫中這個每段樣條曲線長度通常用時間來表示,它定義角色需要幾毫秒從這個節點走到下一個節點。

2. 使用下列各種方法來創建這個 SimpleSpline 數組:

(1) 使用 addPoint 方法來添加路徑節點;
void Ogre::SimpleSpline::addPoint ( const Vector3 & p )
(2) 使用 clear 方法,可以刪除全部節點;
void Ogre::SimpleSpline:: clear ( void )
(3) 使用 setAutoCalculate 方法,可以決定是否讓 OGRE 在每添加一個路徑節點之後自動重新計算整個樣條曲線每個節點的曲率:
void Ogre::SimpleSpline:: setAutoCalculat e ( bool autoCalc )

(4) 如果節點很多,每加一個節點就要重新計算曲率的話浪費時間,可以關閉 setAutoCalculate ,在全部節點添加完畢之後,使用 recalcTangents 方法來手動重新計算整個路徑每個節點的曲率:
void Ogre::SimpleSpline:: recalcTangents ( void )

(5) 你還可以重新調整一個現有節點的位置並更新該點的樣條曲線曲率,使用 updatePoint 方法:

void Ogre::SimpleSpline::updatePoint  (
unsigned short index, // 節點的下標編號
const Vector3 & value // 節點的位置坐標
)
2. 樣條曲線路徑的調用,很簡單,使用 interpolate 方法,它有兩個重載:
Vector3 Ogre::SimpleSpline::interpolate  (  Real  t   ) 

Vector3 Ogre::SimpleSpline::interpolate (
unsigned int fromIndex, // 起始節點
Real t
)

裡面這個參數 Real t 是一個比率:從樣條曲線的上一個節點走到目標點(目標點在曲線上,但不一定是節點),所經過的曲線的長度與上一個節點到下一個節點之間的總長度的比率。比方說目標點的位置正好在前後兩個節點之間,這個比率就是 0.5 。
在使用簡單樣條曲線作為動畫路徑的時候,因為我們已經在第一步中定義了每段樣條曲線,也就是經過前後兩個節點需要的時間,所以我們定義一個動畫時鐘,每遇到一個節點就把時鐘清零重新累計,這樣假設現在我們從上一個節點開始已經走了 m 秒,而從上一個節點到下一個節點需要 n 秒,這個比率就等於 m/n ,然後使用 interpolate( m/n ) 就可以計算出我們現在的位置向量和切線向量(也就是我們面朝的方向)。

下面附上示例代碼。實例代碼的使用和編譯辦法,可以參考本站 《OGRE 一起學》的前幾章的設置和編譯辦法。

點擊下載此文件

本系列以前的幾章所使用的代碼也將陸續整理,在原文篇末上傳。
14. 貝塞爾曲面


Ogre:: MeshManager 基類存在著幾個基本幾何體的創建方法,包括:

createPlane               // 創建平面
createCurvedIllusionPlane // 創建"看上去彎曲"的平面(天空盒和天空穹用的就是這種技術)
createCurvedPlane // 創建真正彎曲的"平面"
createBezierPatch // 創建貝塞爾曲面
createPrefabPlane // 創建預製平面

這一節是關於貝塞爾曲面 ( BezierPatch ) :
貝塞爾曲面是一種基於少量幾個控制點 ( ControlPoint ) 創建的一個連續的平滑曲面,不管這些控制點的位置如何變化,它總能通過貝塞爾算法自動調整整個曲面的曲率使它總是保持連續和平滑,這是一種非常優美的曲麵類型。同時,貝塞爾曲面還可以通過增加或減少細分層次 (SubdivisionLevel) 來使整個曲面趨向於更平滑更細緻,或是趨向於更"粗獷"。在上面的截圖中,你可以看到整個曲面被細分成大量的網格,從而使它的外觀顯得非常平滑,但是實際上,它只存在 9 個控制點。也就是說,我們只需要定義 9 個控制點的數據,就能夠自動生成這麼平滑、有著大量網格的曲面,這比我們一個頂點一個頂點一個網格一個網格地定義這個曲面模型,顯然要更省力、更省空間。這一點,很像平面設計中,位圖和矢量圖的區別——逐點定義與控制點定義的區別。


創建貝塞爾曲面需要以下步驟:

1. 定義一個控制點的頂點數據結構,這點很像 DirectX 裡定義靈活頂點格式 (FVF: Flexible Vertex Format) ,定義一個頂點類型的結構體:
// 定義曲面控制點的頂點結構
struct PatchVertex {
Real x, y, z; // 控制點的位置向量
Real nx, ny, nz; // 控制點的法線向量
Real u, v; // 控制點的材質坐標
};
2. 上面雖然定義了一個頂點結構體,但是 OGRE 並不知道這個結構體中的每一組數據各自代表著什麼,不知道每一組數據的用途,所以緊接著,我們需要創建一個頂點聲明 ( VertexDeclaration ) 來告訴 OGRE 每組數據的含義或用途,具體步驟如下:

(1) 使用 HardwareBufferManager:: createVertexDeclaration 方法創建頂點聲明:
VertexDeclaration* patchDecl = HardwareBufferManager::getSingleton().createVertexDeclaration();

createVertexDeclaration (創建頂點聲明) 方法在頭文件 OgreHardwareBufferManager.h 中定義:
VertexDeclaration * Ogre::HardwareBufferManager:: createVertexDeclaration ( void ) [virtual]

(2) 使用 VertexDeclaration:: addElement (添加元素) 方法來為第 1 步所創建的頂點數據結構體建立功用描述,逐個描述每一個數據的意義和用途:
    // 聲明頂點位置(三維向量)
patchDecl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
// 聲明頂點法線(三維向量)
patchDecl->addElement(0, sizeof(Real)*3, VET_FLOAT3, VES_NORMAL);
// 聲明紋理坐標(二維向量)
patchDecl->addElement(0, sizeof(Real)*6, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0);

VertexDeclaration:: addElement 方法在頭文件 OgreHardwareVertexBuffer.h 中定義:
const VertexElement & Ogre::VertexDeclaration::addElement  (
unsigned short source, // (?)
size_t offset, // 該元素在頂點緩存中的位置偏移 (bytes)
VertexElementType theType, // 頂點元素類型
VertexElementSemantic semantic, // 頂點元素的意義或用途
unsigned short index = 0 // 可選索引,用於多端輸入元素例如紋理坐標
) [virtual]

其中, VertexElementType (頂點元素類型) 在頭文件 OgreHardwareVertexBuffer.h 中定義:
enum VertexElementType
    {
VET_FLOAT1,
VET_FLOAT2,
VET_FLOAT3,
VET_FLOAT4,
VET_COLOUR,
VET_SHORT1,
VET_SHORT2,
VET_SHORT3,
VET_SHORT4,
VET_UBYTE4
};
VET_FLOAT3 的意思是三維浮點數, VET_SHORT2 的意思是二維整數。

另一個, VertexElementSemantic (頂點元素意義) 也在頭文件 OgreHardwareVertexBuffer.h 中定義:
    enum VertexElementSemantic {        
VES_POSITION = 1, // 位置:每個頂點要使用三個實數 (Real) 來表示
VES_BLEND_WEIGHTS = 2, // 混合權重
VES_BLEND_INDICES = 3, // 混合索引
VES_NORMAL = 4, // 法線:每個頂點的法線要使用三個實數 (Real) 來表示
VES_DIFFUSE = 5, // 散射光的顏色值
VES_SPECULAR = 6, // 反射光的顏色值
VES_TEXTURE_COORDINATES = 7, // 紋理坐標
VES_BINORMAL = 8, // 副法線 (如果法線是 Z 軸,副法線就是 Y 軸)
VES_TANGENT = 9 // 切線 (如果法線是 Z 軸,切線就是 X 軸)
};

3. 建立一個控制點數組用於儲存所有控制點的頂點信息,然後逐點填充頂點信息:
        Real* patchCtlPoints = (Real*)( new PatchVertex[9] );    // 建立含有 9 個控制點的頂點緩存數組

PatchVertex *pVert = (PatchVertex*)patchCtlPoints; // 曲面頂點指針,指向曲面上的控制點

pVert->x = -500.0; pVert->y = 200.0; pVert->z = -500.0; // 定義控制點位置
pVert->nx = -0.5; pVert->ny = 0.5; pVert->nz = 0.0; // 定義控制點法線
pVert->u = 0.0; pVert->v = 0.0; // 定義控制點紋理坐標
pVert++;
pVert->x = 0.0; pVert->y = 500.0; pVert->z = -750.0;
pVert->nx = 0.0; pVert->ny = 0.5; pVert->nz = 0.0;
pVert->u = 0.5; pVert->v = 0.0;
pVert++;
// ... ...

4. 使用 MeshManager:: createBezierPatch (創建貝塞爾曲面) 方法,從已定義的控制點頂點緩存創建曲面:
patch = MeshManager::getSingleton().createBezierPatch( "Bezier1", patchCtlPoints, patchDecl, 3, 3, 5, 5, PatchSurface::VS_BOTH );
MeshManager:: createBezierPatch 方法在頭文件 OgreMeshManager.h 中定義:
PatchMesh * Ogre::MeshManager::createBezierPatch  (
const String & name, // 曲面名稱
void * controlPointBuffer, // 控制點緩存
VertexDeclaration * declaration, // 頂點聲明
size_t width, // 曲面寬度(控制點行數)
size_t height, // 曲面高度(控制點列數)
size_t uMaxSubdivisionLevel = PatchSurface::AUTO_LEVEL, // U 向最大細分層次
size_t vMaxSubdivisionLevel = PatchSurface::AUTO_LEVEL, // V 向最大細分層次
PatchSurface::VisibleSide visibleSide = PatchSurface::VS_FRONT, // 曲面可見側
HardwareBuffer::Usage vbUsage = HardwareBuffer::HBU_STATIC_WRITE_ONLY, // 硬件頂點緩存功用
HardwareBuffer::Usage ibUsage = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, // 硬件索引緩存功用
bool vbUseShadow = true, // 是否使用頂點陰影
bool ibUseShadow = true // 是否使用索引陰影
)
5. 使用 PatchSurface:: setSubdivisionFactor (設置細分係數) 方法設置貝塞爾曲面的細分層次:
patch->setSubdivision(0.0f);

PatchSurface:: setSubdivisionFactor 方法在頭文件 OgrePatchSurface.h 中定義:
void Ogre:atchSurface:: setSubdivisionFactor ( Real factor )


6. 創建一個基於這個貝塞爾曲面的實體並綁定到場景節點:
        patchEntity = mSceneMgr->createEntity("Entity1", "Bezier1");
mSceneMgr->getRootSceneNode()->attachObject(patchEntity);

查看 OgrePatchSurface.h 了解關於貝塞爾曲面的更多信息。


本節示例代碼:
點擊下載此文件
 楼主| 发表于 2006-10-25 14:59:23 | 显示全部楼层
16. OGRE + NovodeX



NovodeX 和 Havok 一樣是一個久負盛名的商業物理 (Physics) 引擎。《半條命 2 (Half-life 2) 》用的是 Havok ,《虛幻競技場 (Unreal Tournament) 》的最新版本將使用 NovodeX 。

NovodeX 的官方主頁在這裡:
NovodeX - game development technology
你可以去下載它的技術演示 Demo (需要安裝 DirectX 9c ):
NovodeX Rocket v 1.1 BETA (August 18, 2004)
你還可以下載它的 SDK ,這個 SDK 可以自由應用於 非商業版 的作品:
NovodeX Physics SDK v 2.1.1 (August 9, 2004)

Demo 酷到極致!自己看,我就不貼截圖了,下面我要貼的是 OGRE 外掛 NovodeX 的效果截圖。

OGRE 強大的擴展性,使得它可以外掛多種第三方物理引擎,包括 Tokamak ODE 以及這個最酷的 NovodeX 。作為一個商業品質的物理引擎, NovodeX 花樣多、速度快、運行穩定。你在 NovodeX 裡面可以放上上千個剛體速度都不會有影響, ODE 是最負盛名的免費物理引擎,它甚至被應用到 Softimage 這樣的大牌 3D 動畫工具,但是它的實時運算能力沒有那麼強,放兩三百個物體,就卡得進行不下去了。

有個老外製作了 OGRE 和 NovodeX 的接口,你可以去他的主頁下載 Demo 和 Source :
http://rocketman.f2o.org/nogredex/

也怪酷的,只是因為添加了材質的表現,它比 NovodeX 本體的例子運行要慢一些。如果關閉陰影 (按 Ctrl 鍵) ,速度會有很大提升。下面是它的截圖:

牆。

多米諾骨牌。

世貿大廈。

球垛的崩塌。

世貿姐妹塔。

不倒翁。

(高級特性) 各種限制屬性的軸承 (關節) :

(高級特性) 由關節連接的剛體薄片模擬布料:

(高級特性) 由彈性關節連接的剛體柱模擬毛髮 (不如說是辮子) :

(高級特性) 軸承,模擬蒸汽機的活塞:

(高級特性) 交通工具:

17. 地形



地形 (Terrain) 是室外場景渲染 (Outdoor Rendering) 中佔據重要地位的一個元素。 OGRE 對地形渲染的支持,一方面是提供了最簡單快捷的調用方法,一方面它也提供了強大、靈活、全面的具體參數控制,同時在渲染質量上也相當令人滿意,這一點要勝過 Truevision3D 。

OGRE 對地形的調用,最簡單的辦法是直接從一個地形的 *.cfg 配置文件中讀取地形設置,同時它會遵照這個配置自動生成整個地形。使用這種辦法,使得我們在 C++ 源程序中,僅僅需要這麼一條語句:
mSceneMgr->setWorldGeometry( "terrain.cfg" );


地形配置文件 terrain.cfg 位於 ogrenew\Samples\Common\bin\ 和它的 Debug 和 Release 兩個子目錄下。可以用文本編輯器打開這個文件,隨意修改它的具體配置。修改以後運行 Demo_Terrain.exe ,馬上就可以看到地形的變化。

要全面了解這個 *.cfg 文件的每一條配置指令,可以參看 TerrainSceneManager:: loadConfig () (讀取配置) 方法的定義。這個方法的定義在源文件 ogrenew\PlugIns\OctreeSceneManager\src\OgreTerrainSceneManager.cpp 中,下面引用定義的全文,可以借此了解它的全部配置關鍵字和對應的 API 指令和參數類型:

    //-------------------------------------------------------------------------
void TerrainSceneManager::loadConfig(const String& filename)
{
/* Set up the options */
ConfigFile config;
String val;

config.load( filename );

// 細節鋪嵌:細節紋理在每個地形塊 (Tile) 中重複平鋪的行列數
val = config.getSetting( "DetailTile" );
if ( !val.empty() )
setDetailTextureRepeat(atoi(val.c_str()));

// 最大多紋理層次:紋理 LOD 的多紋理層次限制
val = config.getSetting( "MaxMipMapLevel" );
if ( !val.empty() )
setMaxGeoMipMapLevel(atoi( val.c_str() ));

// 地形頁大小:每片地形頁 (Page) 的大小,用頂點個數來表示,必須是 (2^n)+1
// 地形頁 (Page) 是地形的最大單位,每個地形頁被劃分為若干地形塊 (Tile) 。
val = config.getSetting( "PageSize" );
if ( !val.empty() )
setPageSize(atoi( val.c_str() ));
else
Except(Exception::ERR_ITEM_NOT_FOUND, "Missing option 'PageSize'",
"TerrainSceneManager::loadConfig");

// 地形塊大小:每塊地形塊 (Tile) 的大小,用頂點個數來表示,也必須是 (2^n)+1
val = config.getSetting( "TileSize" );
if ( !val.empty() )
setTileSize(atoi( val.c_str() ));
else
Except(Exception::ERR_ITEM_NOT_FOUND, "Missing option 'TileSize'",
"TerrainSceneManager::loadConfig");

Vector3 v = Vector3::UNIT_SCALE;

// 地形頁的世界寬度:用世界單位來表示,就是我們看到的地形在場景中的實際寬度
val = config.getSetting( "PageWorldX" );
if ( !val.empty() )
v.x = atof( val.c_str() );

// 地形頁的最大高度:用世界單位來表示,就是我們看到的地形在場景中的最大實際高度
val = config.getSetting( "MaxHeight" );
if ( !val.empty() )
v.y = atof( val.c_str() );

// 地形頁的世界長度:用世界單位來表示,就是我們看到的地形在場景中的實際長度
val = config.getSetting( "PageWorldZ" );
if ( !val.empty() )
v.z = atof( val.c_str() );

// Scale x/z relative to pagesize
v.x /= mOptions.pageSize;
v.z /= mOptions.pageSize;
setScale(v);

// 最大像素錯誤:設置場景空間像素錯誤的最大值
val = config.getSetting( "MaxPixelError" );
if ( !val.empty() )
setMaxPixelError(atoi( val.c_str() ));

// 細節紋理名稱:細節紋理 (鏡頭近處的地形表面上浮現的紋理) 的文件名
mDetailTextureName = config.getSetting( "DetailTexture" );

// 世界紋理名稱:整個地形的表面紋理文件名
mWorldTextureName = config.getSetting( "WorldTexture" );

// 是否使用頂點顏色?
if ( config.getSetting( "VertexColours" ) == "yes" )
mOptions.coloured = true;

// 是否使用頂點法線?
if ( config.getSetting( "VertexNormals" ) == "yes" )
mOptions.lit = true;

// 是否使用頂點帶?
if ( config.getSetting( "UseTriStrips" ) == "yes" )
setUseTriStrips(true);

// 是否使用頂點程序變形?
if ( config.getSetting( "VertexProgramMorph" ) == "yes" )
setUseLODMorph(true);

// LOD 變形起點:設置 LOD 變形開始起作用的開始距離,表示為一個比率,
// 這個比率是 LOD 開始點與鏡頭的距離與整個鏡頭的遠視距離之比。
val = config.getSetting( "LODMorphStart");
if ( !val.empty() )
setLODMorphStart(atof(val.c_str()));

// 定製材質名稱:如果使用腳本定製的材質,會覆蓋上面的細節紋理和世界紋理的設定
// 通過使用定製材質,可以讓地形有更豐富更靈活的效果表現。
val = config.getSetting( "CustomMaterialName" );
if ( !val.empty() )
setCustomMaterial(val);

// LOD 變形係數參數名稱:傳遞給 LOD 變形係數的頂點處理參數名稱
val = config.getSetting( "MorphLODFactorParamName" );
if ( !val.empty() )
setCustomMaterialMorphFactorParam(val);

// LOD 變形係數參數索引:傳遞給 LOD 變形係數的頂點處理參數索引
val = config.getSetting( "MorphLODFactorParamIndex" );
if ( !val.empty() )
setCustomMaterialMorphFactorParam(atoi(val.c_str()));

// Now scan through the remaining settings, looking for any PageSource
// prefixed items
// 現在檢查剩下的設置,看是否存在前綴為 "PageSource" 的項
String pageSourceName = config.getSetting("PageSource");
if (pageSourceName == "")
{
Except(Exception::ERR_ITEM_NOT_FOUND, "Missing option 'PageSource'",
"TerrainSceneManager::loadConfig");
}
TerrainPageSourceOptionList optlist;
ConfigFile::SettingsIterator setIt = config.getSettingsIterator();
while (setIt.hasMoreElements())
{
String name = setIt.peekNextKey();
String value = setIt.getNext();
if (StringUtil::startsWith(name, pageSourceName, false))
{
optlist.push_back(TerrainPageSourceOption(name, value));
}
}
// set the page source
// 設置地形頁源
selectPageSource(pageSourceName, optlist);


}

最後的 PageSource , terrain.cfg 中出現了一段示例:


# 高度圖源
PageSource=Heightmap

# 高度圖源特殊設定:設置高度圖
Heightmap.image=terrain.png

 楼主| 发表于 2006-10-25 15:00:39 | 显示全部楼层
18. OGRE + CEGUI :強大的用戶界面


CEGUI ,全稱 "Crazy Eddie's GUI System" ,是一個專門的用戶界面庫,開源並且免費,它支持 DirectX8 、 DirectX9 ,除了可以作為 OGRE 的界面外掛,還支持另一個免費開源的 3D 引擎 Irrlicht 。由於它功能的相對強大和靈活, OGRE 的開發團隊一直在推薦 OGRE 用戶使用這個 CEGUI 來開發用戶界面,逐漸拋棄 OGRE 本身過於簡陋的 GUI 插件。尤其是在行將到來的新版本 OGRE 1.5 的聲明中特別強調了這一點,儘管這個版本仍然暫時保留內置 GUI 系統,但 OGRE 1.5 將會是最後一個保留內置 GUI 的版本。 OGRE 看來似乎將專注於向一個純粹的、然而富於協作和擴展性的圖形引擎發展,這應該得益於它的龐大的社群支持,使得很多事情可以通過外掛一些更專業的引擎來實現,物理引擎使用 ODE 、 Tokamak 、 NovodeX ,網絡引擎使用 openTNL 、 RakNet 、 eNet ,聲音引擎使用 FMod 、 OpenAL ,以及這個界面引擎,使用 CEGUI 。外掛現成模塊的好處就是可以專注於一個方面,開發一個五臟俱全的遊戲引擎並不是個容易的事情,市面上最負盛名的幾個商業引擎的開發, Unreal 、Renderware 、 Lithtech ,往往要耗費數百人年,並且在這些商業引擎中同樣會使用外掛的商業庫,在這個年代,沒有人可以從頭創建一切。

CEGUI 基於 Unicode ,所以它支持中文字體的顯示, 但是對中文字符的輸入現在尚未解決,因為不斷有來自中國的 OGRE + CEGUI 用戶的質詢和申請,對中文輸入的支持可能已在考慮中。

CEGUI 的官方主頁在這裡:
Crazy Eddie's GUI System


1. CEGUI 的 CVS 下載
使用 WinCVS ,使用方法參考 OGRE 一起學 (1) —— 獲取 OGRE

(1) 在 WinCVS 主界面左欄選中 "cvshome" ;

(2) 從主菜單選擇 [Admin]-[Command Line...] ,彈出 "Command line settings" 面板,在 "Settings" 選項卡的上部輸入框裡,輸入如下指令進行登陸:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/crayzedsgui login
當彈出對話框問訊密碼時直接按回車。

(3) 成功登陸以後, WinCVS 主界面的下部信息欄會顯示這樣一條信息:

***** CVS exited normally with code 0 *****

code 0 就表示登陸成功,如果不成功,顯示為 code 1 。

(4) 登陸成功以後,再次打開 "Command line settings" 面板,輸入並運行如下指令:

cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/crayzedsgui co cegui_mk2

CVS 源代碼就開始下載了。耐心等它下載完畢。

(5) 這時候在 WinCVS 主界面左欄的 「cvshome」 下邊,多了一個 "cegui_mk2" 的文件夾。你可以到硬盤的 F:\cvshome\cegui_mk2\ 看一下,所有的源代碼都在那裡了。


2. CEGUI 本體 lib 和 dll 的編譯:
最好使用 VS.Net 2003 的 VC7.1 來編譯,它對 OGRE 和 CEGUI 的支持都很好。 VC7.0 和 VC7.1 都可以。

(1) 首先要下載編譯 CEGUI 所需的依賴項,包括頭文件和庫,下載頁在這裡:
http://crayzedsgui.sourceforge.net/modules.php?name=Downloads&d_op=viewdownload&cid=6
首先下載 CEGUI Mk-2 Win32 Dependencies: Common Files ,這些是公用的頭文件;
其次根據你的編譯器版本選擇對應的庫,例如我使用 VC.Net 2003 ,就選擇下載 CEGUI Mk-2 Win32 Dependencies: Libs for MSVC 7.1 。
下載以後分別解壓縮,把頭文件 cegui_mk2-deps-common\dependencies\include 和庫文件cegui_mk2-deps-vc7.1\dependencies\lib 這兩個目錄全部複製到 cvshome\cegui_mk2\dependencies 目錄下。

(2) 現在設置工作環境。打開 VS.NET 或 VS.NET 2003 ,在主菜單中選擇 [工具]-[選項...] ,打開 "選項" 面板,在左邊目錄選擇 [項目]-[VC++ 目錄] ,在右欄的 Include 和 Lib 目錄下添加以下路徑:

包含文件:
X:\cvshome\cegui_mk2\dependencies\include
庫文件:
X:\cvshome\cegui_mk2\dependencies\lib
注意把這幾條目錄放在目錄列表的最上面。

(3) OK. 現在打開 cvshome\cegui_mk2\makefiles\win32\VC++7.1\CEGUI.sln ,從主菜單中選擇 [生成]-[批生成...] ,打開 "批生成" 面板,點擊右邊的 [全選] 按鈕,然後點擊 [重新生成] 按鈕開始生成,靜待生成結束。

編譯生成的 *.dll 文件在 cvshome\cegui_mk2\bin 目錄下, *.lib 文件在 cvshome\cegui_mk2\lib 目錄下。

編譯成功以後,為了編譯以後的 CEGUI 相關項目,我們要在 VS.Net 的工作環境中添加 CEGUI 的 include 和 lib 目錄:

包含文件:
X:\cvshome\cegui_mk2\include
庫文件:
X:\cvshome\cegui_mk2\lib


3. 編譯 CEGUI 示例

(1) 首先來這裡下載幾個 CEGUI 示例:
http://crayzedsgui.sourceforge.net/modules.php?name=Downloads&d_op=viewdownload&cid=5
其中的 CEGUI under Ogre - Demo 4 和 CEGUI under Ogre - Demo 7 是帶有源文件的,我們挑選 CEGUI under Ogre - Demo 4 來嘗試編譯。

(2) Demo 下載以後解壓縮,文件目錄不要亂放,要放到 cvshome 目錄下。
然後雙擊 cvshome\ogre_gui_demo4\CEGUIOgre_TestDriver1.sln 打開解決方案。
由於 CEGUI 作者的疏忽, Release 的項目設置裡有幾個多餘的 lua.lib ,會導致編譯時因找不到這些庫而失敗,所以我們需要刪除這幾個庫。打開 CEGUIOgre_Demo4 的項目屬性,刪除 Release 配置屬性的 [鏈接器]-[輸入]-[附加依賴項] 條目中的 liblua.lib liblualib.lib libluabind.lib 這幾個庫。

(3) 然後生成。
生成的 *.exe 文件在 cvshome\ogre_gui_demo4 的 Release 和 Debug 目錄下。但是你現在就打開運行肯定會失敗。

失敗的原因首先是因為這個 Demo 使用的是最新版本的 OGRE 的頭文件和庫來編譯,但是 Release 和 Debug 目錄下放的是老版本的 *.dll ,所以你需要把 cvshome\ogrenew\Samples\Common\bin 的 Release 和 Debug 目錄下的所有 *.dll 都複製到 cvshome\ogre_gui_demo4 的 Release 和 Debug 目錄下,用你的最新版本覆蓋舊版本,這是一個;

然後, CEGUI 的依賴項中需要一個 *.dll ,在 cvshome\cegui_mk2\dependencies\lib 中有兩個 *.dll ,把 xerces-c_2_5_0.dll 複製到 cvshome\ogre_gui_demo4\Release ,把 xerces-c_2_5_0D.dll 複製到 cvshome\ogre_gui_demo4\Debug 。

還有 CEGUI 本體的 *.dll ,在 cvshome\cegui_mk2\bin 目錄下,也要全部複製過來。 *.dll 文件名帶 _d 的是 Debug 版本。

OK. 現在示例可以運行了。

作為對 CEGUI 的一個應用實例,你可以下載下面這個 OGRE 粒子編輯器來體驗一下:

ParticleEditor_AlphaDemo


 楼主| 发表于 2006-10-25 15:01:16 | 显示全部楼层
19. 角色骨骼動畫強力輸出方案


兩個星期以來 OGRE 相關主題的更新進度比較緩慢,是因為一直被一個問題所困擾,就是 3dsmax 到 OGRE 的角色骨骼動畫的輸出問題。就這個問題我去 OGRE 官方論壇問那群老外,前後半個月都沒人能解決,帖子乾脆就沒人回,沒辦法只好自己想辦法了。

OGRE 的作者是個窮人,窮得連 3dsmax 都買不起,所以,他沒辦法親手為我們製作 3dsmax 輸出插件,現在的 Ogre3DSExporter 是別人開發的,技術並不成熟,可以說這個插件並不「強壯」,對骨骼動畫的製作過程有著相當苟刻的條件限制,所以在角色動畫比較複雜尤其是使用到 Character Studio 的時候,這個插件經常會出錯,它無法正確分辨 Character Studio 的 Biped 。

最終的解決問題的思路是這樣的:
(1) 使用一種「強壯」的插件,將角色動畫從 3dsmax 完整導出;
(2) 不使用 3dsmax ,而改用 MilkShape 3D ,讀入上一步導出的動畫,然後輸出到 OGRE 。

在第一步,嘗試各種可以順利導出角色動畫的插件,先後嘗試了 Kaydara FBX 插件和 Quake III MD3 等插件,但前者在 3dsmax 6 中的輸入輸出都存在問題,後者輸出的是沒有骨骼的純粹的頂點動畫文件,文件十分龐大。
最終鎖定的,是用於 Unreal 引擎的模型和動畫輸出插件 ActorX ,使用這個插件從 3dsmax 中輸出角色模型文件 *.PSK 和配套的骨骼動畫文件 *.PSA ,然後使用 MilkShape 3D 先後導入這兩個文件進行整合,然後就可以順利輸出 OGRE 的模型文件 *.mesh 和骨骼動畫文件 *.skeleton 了。

下面介紹一下詳細步驟。


0. 使用的工具:

(1) 3dsmax 4, 5, 6, 7
主要是因為下面的 Unreal ActorX 插件的強大,擁有對應 3dsmax 4, 5, 6, 7 各個版本的全部輸出插件,所以在這裡, 3dsmax 的版本不是問題。
我用的是 3dsmax 6

(2) Unreal ActorX for 3dsmax plugin
(2-1) 插件下載
你可以去 UND (Unreal Developer Network) 下載對應你的 3dsmax 版本的 ActorX 插件。下載頁面在這裡:
http://udn.epicgames.com/Two/ActorX
這裡還有 for Maya 4, 4.5, 5, 6 的 ActorX 插件。總之不管你使用 3dsmax 還是 Maya ,也不管你使用的是什麼版本,這個插件的強大性可以保證你能夠順利輸出,同時保證輸出後的模型和動畫文件遵守相同的規範,確保它們可以被 MilkShape 3D 順利讀取和最終輸出。
(2-2) 插件安裝
解壓縮 ActorX_216_Max6.zip ,把裡面的 ActorX.dlu 複製到 3dsmax 的 plugins 文件夾,例如 C:\3dsmax6\plugins
(2-3) 使用方法
插件的使用方法可以簡單閱讀一下這一頁:
http://udn.epicgames.com/Two/ActorXMaxTutorial

(3) MilkShape 3D 1.7.0 或 1.7.1
這是一個共享軟件,未經註冊無法輸出,考慮到燕塵小築的國際影響,堅決不在這裡放出註冊機或註冊碼,諸君可以自己尋找各種適用版本。它的官方網站在這裡:
http://www.milkshape3d.com

(4) Ogre Milkshape Exporter
(4-1) 插件下載
這是一個用於 MilkShape 3D 的 OGRE 模型和動畫插件,並且,製作得比 for 3dsmax 的更成熟更完美。這個插件在本站的置頂帖中常年提供下載:
http://www.yanchen.com/blogview.asp?logID=75
目前版本:OgreMilkshapeExporter-0.15.0.zip
(4-2) 插件安裝
解壓縮 OgreMilkshapeExporter-0.15.0.zip ,把裡面的一大堆 *.dll 全部複製到 MilkShap 3D 的安裝目錄下,例如 D:\Program Files\MilkShape 3D 1.7.0
但是這一步要注意系統提示,不要用舊的 *.dll 覆蓋較新的 *.dll 。


OK. 下面開始正式輸出。

1. 第一步,使用 Unreal ActorX 插件,從 3dsmax 中輸出角色模型 *.PSK 和骨骼動畫 *.PSA 。

(1) 使用 3dsmax 打開原始角色動畫文件 *.max 。

(2) 然後,你必須遵守一些必要的約束,對這個原始角色動畫文件進行一些必要的預加工:
(2-1) 一次只能輸出一個角色模型。 如果你希望一次輸出多個物體,比方說,你希望同時輸出角色本身和角色手中拿著的武器,你需要先把角色本身轉化為 Editable Mesh ,然後使用 Attach 功能將武器綁定為角色的子物體 (Sub Mesh) 。
(2-2) 角色的骨骼只能有一個根節點。 如果需要輸出的角色骨骼擁有多個根節點,你需要為它們新建一個共同的根節點。
(2-3) 最後是最重要的一點,忽略了這一點將會導致你輸出的模型的法線和紋理產生嚴重的異常。 你必須給你的模型的材質賦予一個「合法的」名字。 這一條,是 Unreal ActorX 輸出插件的一個嚴格規定, 它要求所有的材質都必須帶一個形如 「_Skin00」 、"_Skin01"、 "_Skin02" 這樣的後綴。
例如,如果你的模型帶有兩個材質,原來的名字分別是 "MBody" 和 "MFace" ,那麼,你需要把這兩個材質分別改名為 "MBody_Skin00" 和 "MBody_Skin01" 。
更改材質的名字可以使用 Material Editor :

(3) 然後,首先輸出角色的靜態模型,輸出為 *.PSK 文件。這個模型文件中,包含了角色的皮膚和骨骼信息。

(3-1) 首先要打開 ActorX 工具箱。
(3-1-1) 到 3dsmax 右欄,點擊小錘子圖標切換到 Utilities 面板,點擊 [More...] :

(3-1-2) 在彈出的 Utilities 窗口中,雙擊 "ActorX" :

(3-2) 在 ActorX 面板中,點擊 output folder (輸出文件夾) 一欄旁邊的 Browse 按鈕選擇模型文件的保存目錄,這同時也是稍後輸出動作文件的保存目錄;然後在 mesh file name (模型文件名) 一欄中給你要輸出的模型文件取個名字。

(3-3) 然後點擊 Save mesh/refpose (保存模型/參考姿勢) 按鈕來保存角色模型。在保存過程中會相繼彈出下面兩個對話框:

(3-4) 如果彈出錯誤信息,你需要根據錯誤提示做一些相應的糾正。很多情況下,可能是你的輸出選項沒有設置好,需要在 ActorX - Setup 面板中修改一些相應的選項:

每一個具體選項不再具體講解,詳細請參考這一頁的下半部:
http://udn.epicgames.com/Two/ActorXMaxTutorial

(3-5) 輸出的模型文件為 *.PSK 。


(4) 最後就是骨骼動畫文件 *.PSA 的輸出。這個功能相當強大。

(4-1) 首先, ActorX - Epic Games 面板的上部是模型輸出模塊,下部就是骨骼動畫輸出模塊。
(4-1-1) 在 animation file name (動畫文件名) 一欄中,給你要輸出的動作文件起個名字;
(4-1-2) 在 animation sequence name (動畫序列名) 一欄中,給你要輸出的這段動作起一個動作名,例如 dance 、 walk 、 run 、 attack 等等;
(4-1-3) 在 animation range (動畫範圍) 一欄中,給你要輸出的這段動畫序列指定一個輸出的幀的範圍,格式是 "開始幀-結束幀";
整個設置如下圖:

(4-2) 然後首先我們要做的,是動畫的採集 (Digest Animation) 。點擊 [Digest animation] 按鈕,看狀態欄的進度條走完,就完成了動畫的採集,但是這時候,僅僅是完成了這個動作序列的動畫的數據取樣,並沒有把它保存起來,所以還需要進行下一步,就是動畫的管理。

(4-3) 點擊 [Animation manager] 按鈕,打開 AcoorX animation manager (動畫管理器) 面板:

(4-3-1) 在這個面板的左欄,我們會看到已經有了一個動畫序列,名字是 "dance" ,我們可以使用中間的 move [-->] 、 [<--] 按鈕,把這個動畫序列移動到右邊的 Output Package 一欄,也就是準備輸出這個動作;

(4-3-2) 然後點擊右邊的 [Save] 按鈕,骨骼動畫序列就會被保存到指定的動作文件中:

保存成功後會彈出如下對話框:

(4-4) 就這樣,動作文件被保存為 *.PSA 。

(4-5) 這個Animation manager 的動畫管理功能十分強大,你可以做的不僅僅是保存單個動畫序列,你還可以分別採集 (Digest) 多個動畫序列然後把它們保存為一個動作文件,你還可以使用 [Load] 或 [Load As..] 按鈕來讀取一個現有的動作文件,對其添加或刪除動作序列,然後再使用 [Save] 或 [Save As..] 按鈕來保存修改過的動作文件。總之,這個動畫管理器很強大,多多學習。


2. 使用 MilkShape 3D ,讀取上一步生成的 *.PSK 和 *.PSA 文件,然後整合輸出到 OGRE 。

(1) 打開 MilkShape 3D 。

(2) 使用菜單 [File] - [Import] - [Unreal/UT PSK/PSA ..] , 首先輸入模型文件 *.PSK ,然後輸入動作文件 *.PSA :

(3) 你可能發現兩處毛病:首先,骨骼可能錯位了;其次,沒有紋理貼圖。這兩個問題都不難解決:
(3-1) 首先你必須詳細閱讀 MilkShape 3D 的 Help ,學會各種簡單操作;
(3-2) 紋理貼圖的問題,在 Materials 面板點擊這個按鈕就可以選擇貼圖:

(3-3) 骨骼錯位的問題,配合三視圖,利用 Model 面板,首先使用 [Select] 按鈕選擇全部頂點,然後使用 [Move] 和 [Rotate] 工具來使角色的皮膚對齊角色的骨骼。
注意一!不要動骨骼;
注意二!在對齊時,必須確保下方的 Animation 欄處於未激活狀態,也就是 [Anim] 按鈕未被按下,一排動畫播放鍵處於失效狀態。 等一切搞定後再點擊 [Anim] 按鈕播放動畫。

(3-4) 調好的模型和骨骼:

(4) 現在就該輸出了。

(4-1) 選擇菜單 [File] - [Export] - [OGRE Mesh / Skeleton ..] ,彈出 Ogre Ecport Options (OGRE 輸出選項) 面板:

(4-2) 你直接就可以按 OK 來輸出。輸出會讓你分別選擇模型文件 *.mesh 和動作文件 *.skeleton 的文件名。

(4-3) 各種選項不再具體解釋,總之,這個輸出插件也相當強大!嘗試適應各種選項。

(4-4) 如果你不選 split keyframe sequence into multiple ainmations ,則輸出的是一整個動畫序列,這個動畫序列的名稱為 "Default" 。使用 Unreal ActorX 輸出的動畫序列名稱並不被自動識別和保存。

(4-5) 如果你選中了 split keyframe sequence into multiple ainmations ,要從輸出的一整個動畫序列中定義出不同的動作序列,你需要用一個記事本,參照下面的格式來定義好動作序列,然後在輸出動畫的過程中,需要讀取這個動作序列的定義文件:

1,20,Walk
21,40,Run
41,60,Attack

3. 最後的遺留問題就是材質。不難解決。

(1) 把貼圖複製到 OGRE\Samples\Media\materials\textures ;
(2) 在 OGRE\Samples\Media\materials\scripts 目錄下找一個現有材質文件或新建一個材質文件 *.material , 向其中添加一個材質,材質名稱為角色模型在 3dsmax 裡面使用的材質的名稱,並為這個材質指定貼圖。例如:

material Body_Skin00
{
technique
{
pass
{
ambient 0.1 0.1 0.1
diffuse 1 1 1
specular 0 0 0 0
emissive 0 0 0

texture_unit
{
texture body.tga
}

}
}
}
4. 最後,要把模型文件 *.mesh 和動作文件 *skeleton 都放進 OGRE\Samples\Media\models 文件夾。

然後,你可以找一個帶有角色動畫的示例,在源代碼中修改它讀取的模型文件名和動作序列名,看看你輸出的模型在 OGRE 裡面的效果,或者我在近日推出角色動畫在 OGRE 裡的使用辦法。


好!本章結束。最後可以看看我今天的一掃數日之鬱悶的工作成果:

 楼主| 发表于 2006-10-25 15:01:38 | 显示全部楼层
20. 標準 3dsmax Exporter 插件的安裝


在 cvshome\ogrenew\Tools\3dsmaxExport 目錄下,是作為 OGRE 「官方工具」 的 3dsmax 輸出插件,使用這個插件,可以從 3dsmax 5 或 6 中輸出模型 (Mesh) 、骨骼動畫 (Skeleton) 和材質 (Material) 。雖然骨骼動畫對 Character Studio 的支持還很不好,但是輸出 Mesh 和 Material 還是沒問題,所以這個插件的安裝和使用方法還是必須掌握的,只在實在不行的時候我們才使用上一節講到的 Unreal ActorX 插件來輸出複雜骨骼動畫。

3dsmax Exporter 的英文文檔可以參看 cvshome/ogrenew/Tools/3dsmaxExport/readme.html ,基本上寫得已經很明白了,這一節,主要是寫給一些英文有困難的同志。


1. OGRE 3dsmax Exporter Plugin 的安裝

(1) 首先,你需要擁有 3dsmax 5.x 或 3dsmax 6.x 。
我用的是 3dsmax 6.0 。

(2) 把 cvshome\ogrenew\Tools\3dsmaxExport 目錄下的這幾個文件夾覆蓋到 3dsmax 的安裝文件夾,我的是 C:\3dsmax6 :
plugins
scripts
UI

(3) 現在進入 3dsmax 安裝文件夾下的 plugins 目錄,(例如 C:\3dsmax6\plugins )可以看到裡面有這兩個插件:
IPhysique_3dsmax5.gup
IPhysique_3dsmax6.gup
如果你用的是 3dsmax 5.x ,刪掉 IPhysique_3dsmax6.gup ;
如果你用的是 3dsmax 6.x ,刪掉 IPhysique_3dsmax5.gup ;

(4) OK. 現在打開 3dsmax 。

(5) 現在要在 3dsmax 中打開 ORGE Tools 工具條:
從 3damax 主菜單中選擇 [Customize|定製] - [Load Custom UI Scheme|讀取定製界面方案] ,會彈出下面的窗口,瀏覽到 3dsmax/UI 目錄下,然後我們要先在 "文件類型" 下拉菜單中選擇 "UI File(*.cui)" ,這樣我們就能看到我們將要讀取的定製界面文件 ogreTools.cui ,然後雙擊它:

打開以後我們的 3dsmax 界面上就會多出來一個名為 OGRE Tools 的工具條:

2. OGRE XML Converter 的安裝

OGRE 3dsmax 輸出插件需要配合一個關鍵工具來使用,這個工具叫做 OGRE XML Converter 。
這個工具的主要作用,一個是將 Mesh 和 Skeleton 的二進制文件轉換為 XML 文件,方便我們了解它們的層次結構;反過來它還可以把 Mesh 和 Skeleton 的 XML 文件轉換為二進制文件。因為 3dsmax 輸出插件輸出的是 XML 格式的文件,所以我們需要使用它來把 XML 轉換為二進制的、能夠為 OGRE 所識別和讀取的 *.mesh 和 *.skeleton 文件。

在 OGRE 的解決方案 Ogre.sln 中,有一個名為 XMLConverter 的項目,在你編譯成功整個 Ogre.sln 的時候這個也隨之成功編譯,生成的可執行文件 OgreXMLConverter.exe 在 cvshome\ogrenew\Tools\XMLConverter\bin 的 debug 和 release 文件夾下。
為了使這個工具能夠方便使用,我們要把它複製到合適的地方:

(1) 首先確認你的 Media 目錄的路徑, 從 3dsmax 輸出的 Mesh 、 Skeleton 、 Material 文件都需要輸出到這個目錄下然後才能被 OGRE 應用程序搜索到。例如我希望它們輸入到 E:\Desktop\Learning\OGRE\Samples\Media 目錄下,其中:
Mesh 和 Skeleton 輸出到:
E:\Desktop\Learning\OGRE\Samples\Media\models
Material 輸出到:
E:\Desktop\Learning\OGRE\Samples\Media\materials\scripts
還有 Texture 紋理貼圖,要複製到:
E:\Desktop\Learning\OGRE\Samples\Media\materials\textures
先要確認這些目錄。

(2) 然後,把 cvshome\ogrenew\Tools\XMLConverter\bin\release\ OgreXMLConverter.exe 和
cvshome\ogrenew\Samples\Common\bin\Release\ OgreMain.dll 兩個文件複製到上面確認的 OGRE\Samples\Media\models 目錄下。
因為運行 OgreXMLConverter.exe 需要 OgreMain.dll 所以要把它也複製過來。

(3) 下面用這個 OgreXMLConverter.exe 做一些測試,它是 16 位控制台程序,要用 DOS 命令在控制台下運行。
(3-1) 在開機菜單的 [開機]-[運行] 中敲入 "cmd" 並回車以打開命令提示符;
(3-2) 使用 "cd" 指令進入 OGRE\Samples\Media\models 目錄,例如:

(3-3) OgreXMLConverter.exe 可以實現 Mesh 與 Skeleton 的二進制文件與 XML 文件的互轉,它的指令格式是:
OgreXMLConverter 文件名
文件名要帶後綴,如果文件格式是 *.mesh 或 *.skeleton ,它們會被對應轉換為 *mesh.xml 或 *.skeleton.xml 文件;
相反如果後綴是 *mesh.xml 或 *.skeleton.xml ,它們會被對應轉換為 *.mesh 或 *.skeleton 。
現在我們隨便選中一些 *.mesh 文件來試一下,比方說 ninja.mesh 和 ninja.skeleton:

OgreXMLConverter ninja.mesh
OgreXMLConverter ninja.skeleton

現在我們可以看到 OGRE\Samples\Media\models 目錄下生成了兩個新文件: ninja.mesh.xml 和 ninja.skeleton.xml 。

有一個問題可能我們之前比較發愁,就是不知道 ninja.skeleton 文件中就包含了哪些動畫序列,不知道它們的名稱,現在你用記事本打開 ninja.skeleton.xml ,搜索 "<animation name=" ,就可以找到這個文件包含的所有動畫序列的名稱。其實在你轉換這個 ninja.skeleton 的時候 OgreXMLConverter 就已經給你顯示了一些摘要信息,其中就包括動畫序列信息:

Exporting animations, count=20
Exporting animation: Attack1
Animation exported.
Exporting animation: Attack2
Animation exported.
Exporting animation: Attack3
Animation exported.
Exporting animation: Backflip
Animation exported.
... ...

現在你可以試著把 *.xml 文件轉換回 *.mesh 和 *.skeleton 。

在命令提示符下輸入
OgreXMLConverter help
可以看詳細命令列表。

其實,不使用命令提示符,最簡單的辦法就是直接把要轉換的文件拖放到 OgreXMLConverter.exe 上,它會自動轉換:

3. OGRE 3dsmax Exporter 工作目錄設置

現在打開 3dsmax6\scripts\ogre\ogreScript.ini ,我們需要設置一下這個插件的工作路徑,對於跟 XML Converter 的配合作業來說這一步很重要。

[Directories]
XMLConverterPath=E:\Desktop\Learning\OGRE\Samples\Media\models
MediaPath=E:\Desktop\Learning\OGRE\Samples\Media

[Exe]
XMLConverterExe=OgreXMLConverter.exe

[Settings]
lastFile=E:\Desktop\Learning\OGRE\Samples\Media\models\test
lastAnimName=Walk
lastMaterialFile=E:\Desktop\Learning\OGRE\Samples\Media\materials\scripts\test.material

[Tools]
runXMLConverter=yes

下面逐條解釋每個參數:

XMLConverterPath
被覆制到 Samples\Media\models 目錄下的 OgreXMLConverter.exe 的絕對路徑。

MediaPath
Media 目錄的路徑。

XMLConverterExe
XMLConverter 可執行程序的名字: OgreXMLConverter.exe

lastFile
*.mesh 和 *.skeleton 文件的默認保存路徑和文件名,這裡起到一個快捷定位的作用;
上面的文件中定義為 lastFile=E:\Desktop\Learning\OGRE\Samples\Media\models\test ,其中的 test 不是一個目錄,而是一個文件名, Media\models\test 指的是會在 Media\models 目錄下生成一個 test.mesh 和一個 test.skeleton (如果有骨骼) 。

lastAnimName
要保存到 *.skeleton 文件中的骨骼動畫序列的默認名稱。

lastMaterialFile
*.material 材質腳本的默認輸出路徑和文件名,必須帶後綴 ".material" 。

runXMLConverter
是否啟動 XML Converter ?選擇 yes 或 no 。如果不啟動,將只輸出 *mesh.xml 和 *.skeleton.xml 文件。如果啟動,會在輸出 *.xml 之後自動調用 OgreXMLConverter.exe 將其轉換為 *.mesh 和 *.skeleton 。


End.

CEGUI ,全稱 "Crazy Eddie's GUI System" ,是一個專門的用戶界面庫,開源並且免費,它支持 DirectX8 、 DirectX9 ,除了可以作為 OGRE 的界面外掛,還支持另一個免費開源的 3D 引擎 Irrlicht 。由於它功能的相對強大和靈活, OGRE 的開發團隊一直在推薦 OGRE 用戶使用這個 CEGUI 來開發用戶界面,逐漸拋棄 OGRE 本身過於簡陋的 GUI 插件。尤其是在行將到來的新版本 OGRE 1.5 的聲明中特別強調了這一點,儘管這個版本仍然暫時保留內置 GUI 系統,但 OGRE 1.5 將會是最後一個保留內置 GUI 的版本。 OGRE 看來似乎將專注於向一個純粹的、然而富於協作和擴展性的圖形引擎發展,這應該得益於它的龐大的社群支持,使得很多事情可以通過外掛一些更專業的引擎來實現,物理引擎使用 ODE 、 Tokamak 、 NovodeX ,網絡引擎使用 openTNL 、 RakNet 、 eNet ,聲音引擎使用 FMod 、 OpenAL ,以及這個界面引擎,使用 CEGUI 。外掛現成模塊的好處就是可以專注於一個方面,開發一個五臟俱全的遊戲引擎並不是個容易的事情,市面上最負盛名的幾個商業引擎的開發, Unreal 、Renderware 、 Lithtech ,往往要耗費數百人年,並且在這些商業引擎中同樣會使用外掛的商業庫,在這個年代,沒有人可以從頭創建一切。

CEGUI 基於 Unicode ,所以它支持中文字體的顯示, 但是對中文字符的輸入現在尚未解決,因為不斷有來自中國的 OGRE + CEGUI 用戶的質詢和申請,對中文輸入的支持可能已在考慮中。

CEGUI 的官方主頁在這裡:
Crazy Eddie's GUI System


1. CEGUI 的 CVS 下載
使用 WinCVS ,使用方法參考 OGRE 一起學 (1) —— 獲取 OGRE

(1) 在 WinCVS 主界面左欄選中 "cvshome" ;

(2) 從主菜單選擇 [Admin]-[Command Line...] ,彈出 "Command line settings" 面板,在 "Settings" 選項卡的上部輸入框裡,輸入如下指令進行登陸:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/crayzedsgui login
當彈出對話框問訊密碼時直接按回車。

(3) 成功登陸以後, WinCVS 主界面的下部信息欄會顯示這樣一條信息:

***** CVS exited normally with code 0 *****

code 0 就表示登陸成功,如果不成功,顯示為 code 1 。

(4) 登陸成功以後,再次打開 "Command line settings" 面板,輸入並運行如下指令:

cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/crayzedsgui co cegui_mk2

CVS 源代碼就開始下載了。耐心等它下載完畢。

(5) 這時候在 WinCVS 主界面左欄的 「cvshome」 下邊,多了一個 "cegui_mk2" 的文件夾。你可以到硬盤的 F:\cvshome\cegui_mk2\ 看一下,所有的源代碼都在那裡了。


2. CEGUI 本體 lib 和 dll 的編譯:
最好使用 VS.Net 2003 的 VC7.1 來編譯,它對 OGRE 和 CEGUI 的支持都很好。 VC7.0 和 VC7.1 都可以。

(1) 首先要下載編譯 CEGUI 所需的依賴項,包括頭文件和庫,下載頁在這裡:
http://crayzedsgui.sourceforge.net/modules.php?name=Downloads&d_op=viewdownload&cid=6
首先下載 CEGUI Mk-2 Win32 Dependencies: Common Files ,這些是公用的頭文件;
其次根據你的編譯器版本選擇對應的庫,例如我使用 VC.Net 2003 ,就選擇下載 CEGUI Mk-2 Win32 Dependencies: Libs for MSVC 7.1 。
下載以後分別解壓縮,把頭文件 cegui_mk2-deps-common\dependencies\include 和庫文件cegui_mk2-deps-vc7.1\dependencies\lib 這兩個目錄全部複製到 cvshome\cegui_mk2\dependencies 目錄下。

(2) 現在設置工作環境。打開 VS.NET 或 VS.NET 2003 ,在主菜單中選擇 [工具]-[選項...] ,打開 "選項" 面板,在左邊目錄選擇 [項目]-[VC++ 目錄] ,在右欄的 Include 和 Lib 目錄下添加以下路徑:

包含文件:
X:\cvshome\cegui_mk2\dependencies\include
庫文件:
X:\cvshome\cegui_mk2\dependencies\lib
注意把這幾條目錄放在目錄列表的最上面。

(3) OK. 現在打開 cvshome\cegui_mk2\makefiles\win32\VC++7.1\CEGUI.sln ,從主菜單中選擇 [生成]-[批生成...] ,打開 "批生成" 面板,點擊右邊的 [全選] 按鈕,然後點擊 [重新生成] 按鈕開始生成,靜待生成結束。

編譯生成的 *.dll 文件在 cvshome\cegui_mk2\bin 目錄下, *.lib 文件在 cvshome\cegui_mk2\lib 目錄下。

編譯成功以後,為了編譯以後的 CEGUI 相關項目,我們要在 VS.Net 的工作環境中添加 CEGUI 的 include 和 lib 目錄:

包含文件:
X:\cvshome\cegui_mk2\include
庫文件:
X:\cvshome\cegui_mk2\lib


3. 編譯 CEGUI 示例

(1) 首先來這裡下載幾個 CEGUI 示例:
http://crayzedsgui.sourceforge.net/modules.php?name=Downloads&d_op=viewdownload&cid=5
其中的 CEGUI under Ogre - Demo 4 和 CEGUI under Ogre - Demo 7 是帶有源文件的,我們挑選 CEGUI under Ogre - Demo 4 來嘗試編譯。

(2) Demo 下載以後解壓縮,文件目錄不要亂放,要放到 cvshome 目錄下。
然後雙擊 cvshome\ogre_gui_demo4\CEGUIOgre_TestDriver1.sln 打開解決方案。
由於 CEGUI 作者的疏忽, Release 的項目設置裡有幾個多餘的 lua.lib ,會導致編譯時因找不到這些庫而失敗,所以我們需要刪除這幾個庫。打開 CEGUIOgre_Demo4 的項目屬性,刪除 Release 配置屬性的 [鏈接器]-[輸入]-[附加依賴項] 條目中的 liblua.lib liblualib.lib libluabind.lib 這幾個庫。

(3) 然後生成。
生成的 *.exe 文件在 cvshome\ogre_gui_demo4 的 Release 和 Debug 目錄下。但是你現在就打開運行肯定會失敗。

失敗的原因首先是因為這個 Demo 使用的是最新版本的 OGRE 的頭文件和庫來編譯,但是 Release 和 Debug 目錄下放的是老版本的 *.dll ,所以你需要把 cvshome\ogrenew\Samples\Common\bin 的 Release 和 Debug 目錄下的所有 *.dll 都複製到 cvshome\ogre_gui_demo4 的 Release 和 Debug 目錄下,用你的最新版本覆蓋舊版本,這是一個;

然後, CEGUI 的依賴項中需要一個 *.dll ,在 cvshome\cegui_mk2\dependencies\lib 中有兩個 *.dll ,把 xerces-c_2_5_0.dll 複製到 cvshome\ogre_gui_demo4\Release ,把 xerces-c_2_5_0D.dll 複製到 cvshome\ogre_gui_demo4\Debug 。

還有 CEGUI 本體的 *.dll ,在 cvshome\cegui_mk2\bin 目錄下,也要全部複製過來。 *.dll 文件名帶 _d 的是 Debug 版本。

OK. 現在示例可以運行了。

作為對 CEGUI 的一個應用實例,你可以下載下面這個 OGRE 粒子編輯器來體驗一下:

ParticleEditor_AlphaDemo


 楼主| 发表于 2006-10-25 15:02:00 | 显示全部楼层
21. 標準 3dsmax Exporter 插件的使用


首先你需要明白的是,這個插件目前並不完善,或者說是不健壯,對模型、骨骼、材質的輸出條件有很多苟刻的限制,僅支持很少的一些特性,所以如果你輸出的時候時時碰上一些五花八門的錯誤,請不要奇怪,做好這個思想準備。
而且這篇教程,我們會不管三七二十一,先學習輸出步驟,然後再講要注意些什麼。

一. 單個靜態模型 (Mesh) 和標準材質 (Standard Material) 的基本輸出方法

1. 單個靜態模型 (Mesh) 的輸出:

(1) 使用 3dsmax ,打開你要輸出的模型文件。
注意,模型必須被賦予材質才可以輸出。

(2) 點擊 OGRE Tools 工具條上的 [Skeleton Tools] 按鈕,打開 SkeletonTools 面板:

(3) 點擊 [Select a mesh...] 按鈕,彈出 Select Objects 面板,在左欄雙擊你要輸出的模型名稱來選擇它:

(4) 選中模型後,在 SkeletonTools 面板的 Selected object 欄中會顯示被選中的模型名稱。下面對一些選項作具體解釋:

Selected object :              所選對象:選中的模型名稱,也就是即將被輸出的模型的名稱;
Scale: 縮放係數:輸出縮放係數,用於調整輸出的模型的實際大小;
Export Mesh: 輸出模型:如果你需要輸出靜態模型 (Mesh) 必須勾選這個選項;
Flip normals: 翻轉法線:翻轉面法線;
Export texture information: 輸出紋理信息:輸出模型使用的材質名稱和每個頂點的紋理坐標 (UV) 信息,
默認選中;
Export colour information: 輸出顏色信息:輸出頂點顏色信息,
如果你沒有為頂點賦予顏色,不要勾選;
Export skeleton: 輸出骨骼:如果你希望輸出角色骨骼和動畫信息,勾選這個選項
This skeleton is a Biped: Biped 骨骼:如果你的角色使用的是 Character Studio 建立的 Biped 骨骼,
勾選這個選項;
Animation name: 動畫序列名稱:為你將要輸出的動畫序列起一個名稱;
First frame of animation: 動畫序列起始幀;
Last frame of animation: 動畫序列結束幀;
Real length in seconds: 動畫實際長度(秒):指定動畫播放一遍的實際描述,其實就是定義播放速度;
File: 文件名:為你將要輸出的模型 (Mesh) 和骨骼動畫 (Skeleton) 起一個名字;
注意不要帶後綴。例如你指定 test 為文件名,將輸出
test.mesh 和/或 test.skeleton ;
OK.選項解釋完畢。其中我們當前必須要做的是四件事:
(4-1) 勾選 Export Mesh 以輸出靜態模型;
(4-2) 勾選 Export texture information 以輸出紋理信息;
(4-3) 在 File 欄中為我們要輸出的 *.mesh 模型文件起一個名字,注意不要帶後綴;
(4-4) 點擊下方的 [Export] 按鈕進行輸出!

輸出的過程中會依次彈出下列對話框報告進程:

模型順利輸出!

已執行 XMLConverter ,生成的 *.mesh 文件已拷貝到 Media\models 文件夾:

現在看看你的 Media\models 文件夾下,會多出來一對 *.mesh 和 *.mesh.xml 文件,大功告成。

2. 標準材質 (Standard Material) 的輸出:

(1) 點擊 OGRE Tools 工具條上的 [Material Tools] 按鈕,打開 MaterialTools 面板:



(2) 點擊 [Pick Material] 按鈕,彈出 Material/Map Browser 面板,選中左欄的 [Scene] 單選按鈕,使得我們可以在右欄中看到場景中使用到的材質列表,也就是那個 "1 - Default" :

(3) 我們所看到的整個字符串 "1 - Default (Standard) [body]" ,其中的 "1 - Default" 是材質名稱; "(Standard)" 是材質類型, Standard 類型的材質是我們可以確切輸出的; "[body]" 是指這個材質被應用到一個名為 "bidy" 的模型 (Mesh) 上。
雙擊材質名來選擇它:

會彈出 Instance or Copy? 對話框,詢問你是作為一個實例 (Instance) 還是作為一個拷貝 (Copy) 來選擇它?選擇 Instance :

(4) 然後,在 MaterialTools 面板的 File 欄,為你將要輸出的這個材質取一個文件名,這裡必須包括後綴;
然後點擊下面的 [Export] 按鈕來最後輸出:

順利輸出後會彈出下面的對話框來報告結果:

材質順利輸出!

現在你再看看你的 Media\materials\scripts 文件夾,輸出的材質就在那裡了,可以自己打開來看看。

OGRE 的材質名稱不能含有空格,所以,如果 3dsmax 中的材質含有空格,在輸出時會自動使用下劃線 "_" 代替空格。

(5) 最後還有一件事情不能忘了,就是把這個材質使用到的那張紋理貼圖 (Texture) 複製到 Media\materials\textures 文件夾下,要不 OGRE 找不到貼圖。

二. 由多個子模型組成的靜態多子對象模型 (Multi/Sub-Object Mesh)和由多個標準材質組成的多紋理材質 (Multi/Sub-Object Material) 的輸出辦法

如果你在 3dsmax 中創建了多個模型,想把這些模型作為一個整體模型組一次輸出,然後還希望把它們使用到的多個材質也作為一個整體輸出,比方說你製作了一個由頭部、軀幹和四肢若干模型組成的一個機器人,各個部件擁有不同的材質,你想把這個機器人作為一個整體輸出,把這些材質也作為一個整體輸出,你需要這麼做:
(1) 首先分別做好這些部件;
(2) 然後將其中一個部件轉換為 Editable Mesh ,對這個 Editable Mesh 使用 Attach 工具,將其它所有的部件都附著到它上面,這些部件就成了一個由多個子對象構成的一個整體 Mesh ;
(3) 然後新建一個 Multi/Sub-Object Material ,在其中定義多個子材質,然後把這個多紋理材質賦給整個 Mesh ,再通過指定子材質 ID 的辦法分別把它的子材質賦給對應的子對象;
(4) 最後使用單模型和標準材質的輸出方法來輸出這個多子對象模型和多紋理材質。

三. 骨骼動畫的輸出

掌握了基本輸出方法之後骨骼動畫的輸出也很簡單,只是,這個插件對骨骼動畫的支持很不好,會時常讓人生氣。

(1) 首先建立角色、綁上骨骼、擺好動畫;
(2) 選擇角色的皮膚 (Skin 或 Physique) 來輸出;
(3) 在 SkeletonTools 面板中填好這些選項:

Export skeleton:                  輸出骨骼:如果你希望輸出角色骨骼和動畫信息,勾選這個選項
This skeleton is a Biped: Biped 骨骼:如果你的角色使用的是 Character Studio 建立的 Biped 骨骼,
勾選這個選項;
Animation name: 動畫序列名稱:為你將要輸出的動畫序列起一個名稱;
First frame of animation: 動畫序列起始幀;
Last frame of animation: 動畫序列結束幀;
Real length in seconds: 動畫實際長度(秒):指定動畫播放一遍的實際描述,其實就是定義播放速度;
(4) 然後輸出就行了。

注意:
(1) 插件對 Chrarcter Studio 的支持非常糟糕;
(2) 角色的骨骼必須擁有不多於一個根節點;
(3) 建立骨骼要小心,不能建立一個孤立的骨骼再鏈接它,也不能再對現有骨骼重新鏈接,因為一旦重新鏈接骨骼的 ID 就會發生變化,插件就不能正確識別了;
(4) 不能對骨骼進行鏡像 Mirror 操作;
(5) ……還有很多限制了。總之不推薦使用這個插件來輸出角色動畫,而推薦使用 Unreal ActorX Tools 插件。

最後,即使是靜態模型的輸出,使用 MilkShape 3D 插件也比使用 3dsmax 插件更成熟,在 MilkShape 3D 中使用插件輸出時,可以選擇為靜態模型生成 LOD 、生成邊列表以對應陰影技術、生成法線數據以保留表面平滑狀況等等,這些都是 3dsmax 的輸出插件所沒有的,你可以從 3dsmax 輸出靜態 *.3ds 模型轉到 MilkShape 3D 裡面再輸出到 OGRE 。
22. DotScene (1)


DotScene (1) : 3dsmax Scene Exporter 插件的編譯、安裝和使用

如果你決定使用 OGRE 來製作遊戲,首先要面對的問題就是選擇一種場景組織方式。

對於有著很多房間的複雜室內場景你可以選擇 BSP , OGRE 對 BSP 的支持已經逐漸趨於成熟,它可以直接讀取 Quake III 的 *.bsp 場景,還可以直接利用 Quake III 的關卡編輯器來製作 *.bsp 場景。

你甚至可以選擇單場景切換的場景組織方式,把房間和房間內的擺設輸出成一個個的 *.mesh ,一個房間就是一個場景,出門進門的時候就讀取並切換房間,類似於《生化危機》。這樣每一個房間可以製作得非常精細,又不用考慮 BSP 和 Octree ,技術實現非常簡單,但是缺點是場景的切換可能要耗費很多的讀取時間。

對於大範圍的室外場景,就像咱們玩慣了的 3D MMORPG ,必須使用 Octree 來進行場景管理, OGRE 本身已經具有 BSPSceneManager 和 OctreeSceneManager ,實現 Octree 不是問題,關鍵的問題是:對於 BSP ,我們可以讀取 *.bsp 格式的場景文件,我們可以使用 Quake III 的關卡編輯器來製作這些 *.bsp 場景,但是對於 Octree 呢?有沒有一種 OGRE 可以讀取的 Octree 場景文件?有沒有一種 Octree 的場景編輯器?

答案是有,叫做 DotScene 。它作為一個 AddOns ,放置在 cvshome\ogreaddons\dotsceneoctree 目錄下。前面似乎已經說過, AddOns 作為 OGRE 王國的二等公民,區別於一等公民 PlugIns ,不屬於 OGRE Team 的技術支持範圍,所以地位相當尷尬,但是這絲毫不能掩蓋廣大 OGRE 用戶對它的刻骨讚譽,大量採用室外場景的 OGRE 遊戲,都使用了這個 DotScene 。

DotScene 在 OGRE 現有的 SceneManager 家族中,添加了一個 DotSceneManager ,使用這個場景管理器來讀取和管理它的專有場景文件 *.scene ,它並且提供了插件,用於從 3dsmax 中輸出 *.scene 格式的場景,並提供了配套的場景轉換工具。

這一節首先來學習 3dsmax Scene Exporter 插件的編譯、安裝和使用。


1. 編譯
DotScene 的 3dsmax Scene Exporter 源文件,放置在 cvshome\ogreaddons\3dssceneexporter 目錄下。

(1) 有兩個文件需要更新:
OGRE 從 0.14 升級到 0.15 之後,這個插件並沒有及時更新,導致直接編譯無法通過,你需要更新 cvshome\ogreaddons\3dssceneexporter\OgreExporterPlugin 目錄下的兩個文件:OgreExporterPlugin.cpp 和 Exporter.cpp ,這裡提供下載:

下載更新文件

下載後解壓縮,用裡面的兩個新文件覆蓋舊文件。

(2) 添加 3dsmax sdk 目錄:
首先你必須安裝 3dsmax 5.x 或 6.x ,並且必須安裝 3dsmax SDK 。
然後打開 VS.net 2003 ,打開 [工具] - [選項] 面板,在 [項目] - [VC++ 目錄] 下添加 3dsmax SDK 的頭文件和庫的路徑:

包含文件:
C:\3dsmax6\maxsdk\include
庫文件:
C:\3dsmax6\maxsdk\lib


(3) 編譯生成。
……咦,生成的文件跑到哪裡去了?
這個項目的生成路徑沒有設置好,它會在你的 ogreaddons 所在的硬盤的根目錄下創建一個 3dsmax5 文件夾,並把生成的最終文件輸出到那裡。比方說我的,被生成到 F:\3dsmax5 下面。


2. 安裝

(1) 把新出爐的 OgreExporterPlugin.cepg 複製到你的 3dsmax 根目錄下,例如 C:\3dsmax6 ;
(2) 把新出爐的 OgreUtils.dlu 複製到你的 3dsmax 的 plugins 子目錄下,例如 C:\3dsmax6\plugins ;
(3) 瀏覽到 cvshome\ogrenew\Samples\Common\bin\Release ,把裡面的 DLLs 全部複製到你的 3dsmax 根目錄下;

至此,插件安裝完畢,下面我們在 3dsmax 裡面把它調出來:
打開 3dsmax ,點擊右欄的小錘子圖標切換到 Utilities 面板,點擊 [More...] :

然後在彈出的 Utilities 窗口中,雙擊 "OgreUtils" :

這就是 3dsmax Scene Exporter 的工具面板了:

3. 使用
這個場景輸出插件似乎比較「健壯」,再複雜的場景,不管是由多少個 Mesh 組成的、包含了多少個 Materials ,基本上都可以順利輸出。
如果你沒有現成的場景模型,可以下載這個:

(不要問我這個東西是怎麼來的。)
點擊下載此文件

(1) 打開 3dsmax ,輸入這個 testscene.3ds 。
這個場景是由 400 多個 Mesh 組成的,使用了 30 多個單層材質。

(2) 調出 OgreUtils 工具箱 :

下面對其中的各個選項逐一說明:

Cameras: 輸出攝像機
Lights: 輸出光源
Meshes: 輸出模型
Normals: 輸出模型法線
Wighted: 輸出法線權重
Texture coords: 輸出紋理坐標
2nd mapping ch. : 輸出雙層貼圖坐標
all mapping ch. : 輸出多層貼圖坐標
Vertex colors: 輸出頂點顏色
Using smoothing grps. : 輸出平滑群組
Materials: 輸出材質
Multiple tex. layers: 輸出多層紋理

Log exporter msgs: 記錄輸出信息

(3) 了解了上面的選項,場景的輸出就很方便了,點擊 Ogre utils 面板下面的 [Export All] 輸出整個場景或點擊 [Export Selection] 僅輸出選中的場景。
隨便找個地方輸出這個場景,現在不要把它輸出到 Samples\Media 目錄下,例如,我是輸出到 E:\Desktop\Working\3dsmax\testscene
現在打開這個目錄,你會發現它輸出了:
一大堆 *.mesh ,這是場景中的所有靜態模型;
一個 testscene.material ,場景中所有材質的定義文件;
一個 testscene.scene ,這就是場景的定義文件,定義了場景的簡單環境參數、調用的材質文件名和場景中各個模型的 *.mesh 文件,你可以用記事本打開來看看。

記住這個目錄,現在這個 *.scene 場景文件還不能直接使用,它還需要使用工具進行轉換。我們在下一節學習 *.scene 文件的轉換和讀取。
 楼主| 发表于 2006-10-25 15:02:31 | 显示全部楼层
23. DotScene (2)


DotScene (2) : *.scene 場景的加工、放置和調用

*.scene 場景從 3dsmax 中輸出以後,以我們現在的 OGRE 並沒有辦法直接讀取它,首先我們需要擴展我們的 OgreSceneManager 模塊,由此需要重新編譯整個 OGRE 解決方案。


1. OgreSceneManager 模塊的擴展和整個 OGRE 解決方案的重編譯

(1) 打開 cvshome\ogrenew\OgreMain\include\OgreSceneManagerEnumerator.h ,對其做如下修改:

    enum SceneType
{
ST_GENERIC,
ST_EXTERIOR_CLOSE,
ST_EXTERIOR_FAR,
ST_EXTERIOR_REAL_FAR,
ST_INTERIOR, // 注意逗號不要忘了
ST_DOT_SCENE // 添加這一條;
};
(2) 打開 cvshome\ogrenew\OgreMain\src\OgreSceneManagerEnumerator.cpp ,對其做如下修改:
    SceneManagerEnumerator::SceneManagerEnumerator()
{
// Create default manager
mDefaultManager = new SceneManager();

// All scene types defaulted to begin with (plugins may alter this)
setSceneManager(ST_GENERIC, mDefaultManager);
setSceneManager(ST_EXTERIOR_REAL_FAR, mDefaultManager);
setSceneManager(ST_EXTERIOR_FAR, mDefaultManager);
setSceneManager(ST_EXTERIOR_CLOSE, mDefaultManager);
setSceneManager(ST_INTERIOR, mDefaultManager);
setSceneManager(ST_DOT_SCENE, mDefaultManager); // 添加這一條;
}

(3) OK. 現在我們已經為 OgreSceneManager 模塊添加了 DotSceneManager 擴展,現在,你必須重新編譯整個 Ogre.sln 。


2. DotScene 插件、轉換工具和示例的編譯

進入 cvshome\ogreaddons\dotsceneoctree 目錄,使用 VS.net 或 VS.net 2003 打開解決方案 Solution1.sln ,我們可以看到三個 DotScene 相關項目:

Plugin_DotSceneManager
這個是 DotScene 的 OGRE 插件,跟 OGRE 的 PlugIns 一樣,它會在 ogrenew\Samples\Common\bin 的 Debug 和 Release 目錄下,各生成一個 Plugin_DotSceneManager.dll ,這是調用 DotScene 模塊所必需的一個動態鏈接庫。

SceneConverterExample
這個是 *.scene 文件的轉換工具。為什麼需要這個轉換工具呢?因為 *.scene 文件從 3dsmax 裡面輸出以後,還是「生」的,它裡面只包含場景中所有模型的基本信息,但是,這個場景還沒有經過 Octree 的預分割處理,所以需要使用這個轉換工具,對整個場景進行預分割,按 Octree 的八叉樹分割原則把這個場景劃分為合適的諸多小塊並保存這些分塊信息。對於這個,後面你對比一下轉換前後的 *.scene 文件就可以看出來了。
這個項目會在 cvshome\ogreaddons\dotsceneoctree\Tools\ExampleSceneConverter\bin 的 debug 和 release 目錄下各生成一個 SceneConvert.exe 。

Demo_DotScene
這個就是 DotScene 的示例 Demo ,你可以把它當作 *.scene 場景瀏覽器來使用,檢驗或欣賞你輸出的 *.scene 場景。
這個項目像 OGRE 其它的 Demo 一樣,會在 cvshome\ogrenew\Samples\Common\bin 的 Debug 和 Release 目錄下各生成一個 Demo_DotScene.exe 。

OK. 現在編譯整個 Solution1.sln 解決方案。


3. *.scene 場景的轉換

(1) 首先,我們要把轉換工具複製到上一節我們輸出的 *.scene 場景的目錄下,例如我的是 E:\Desktop\Working\3dsmax\testscene
我們要把下面三個文件複製到這裡去:
cvshome\ogreaddons\dotsceneoctree\Tools\ExampleSceneConverter\bin\release\ SceneConvert.exe
cvshome\ogreaddons\dotsceneoctree\Tools\ExampleSceneConverter\bin\debug\ Convert.bat
cvshome\ogrenew\Samples\Common\bin\Release\ OgreMain.dll

轉換前的文件夾:

OgreMain.dll 是運行 SceneConvert.exe 需要的動態鏈接庫;
批處理文件 Convert.bat 用於快捷執行 SceneConvert.exe ,我們可以用記事本打開看看:


REM | Ogre DotSceneOctree Compiler

REM | Usage:
REM | SceneConvert <.scene filename> <MaxTriPerNode> <MaxDepth>
REM | Example:
REM | SceneConvert TestScene.scene 1000 4

REM | Note: The last 2 parameters are optional, 5000 and 4 are the defaults.

SceneConvert EricZone.scene 5000 4

SceneConvert 指令的語法格式:
SceneConvert < 場景文件名 > < 每個 Octree 節點的最大三角形數量 > < Octree 場景分割的最大層次深度 >

我們需要修改 Convert.bat ,把場景文件名改成我們剛才輸出的 testscene.scene ;
每個 Octree 節點的最大三角形數,需要根據經驗靈活控制,並不是越大越好也不是越小越好,太大太小都會卡, 1000 - 5000 比較合適。

(2) 雙擊 Convert.bat ,它會自動啟動 SceneConvert.exe 進行轉換。
SceneConvert.exe 將會進行以下工作:
(2-1) 它首先會為 testscene.scene 建立一個名為 testscene.scene.bak 的備份,以後你可以隨時恢復這個文件;
(2-2) 它按照 Convert.bat 裡面設置的參數,對整個場景進行 Octree 分割,然後將分割後的場景模型和節點摘要信息寫入 testscene.scene ,把分割後的場景模型和節點的詳細信息寫入二進制文件 testscene.bin ,同時建立記錄文件 SC.log 。

轉換後的文件夾:

4. 場景、材質、貼圖各就位

現在需要把這些場景、材質、貼圖都複製到 Media 目錄下對應的子目錄。

(1) 場景文件的放置
建議你在 cvshome\ogrenew\Samples\Media 目錄下,新建一個名為 scene 的子目錄,專門用於以後放置場景文件。
OK. 複製 testscene.scene 和 testscene.bin 到 Media\scene 目錄;
*.bin 文件中已經包含了場景中所有 Mesh 的信息,所以用不著把那些 *.mesh 文件複製過來;

(2) 材質文件的放置
複製 testscene.material 到 Media\materials\scripts 目錄;

(3) 貼圖文件的放置
建議你在 ogrenew\Samples\Media\materials\textures 目錄下,新建一個名為 scene 的子目錄,專門用於以後放置場景的貼圖,在這個 scene 目錄下,再給每一個場景新建一個子目錄用於保存這個場景所有的紋理貼圖。
OK. 現在複製這個場景所用到的所有紋理貼圖到 Media\scene\testscene 目錄;

(4) 別忘了這一步:添加資源搜索路徑
打開 cvshome\ogrenew\Samples\Common\bin\Release\resources.cfg ,向其中添加我們剛才新建的幾個目錄的路徑:

FileSystem=../../../Media/scene
FileSystem=../../../Media/materials/textures/scene/testscene

5. 場景文件的讀取

使用 VS.net 或 VS.net 2003 ,打開剛才的 DotScene 解決方案 (cvshome\ogreaddons\dotsceneoctree\Solution1.sln) ,現在我們需要稍作修改並重新編譯其中的 Demo_DotScene 示例,讓它讀取我們千辛萬苦弄出來的場景文件。

(1) 打開 Demo_DotScene 項目的 Demo_DotScene.h 頭文件,搜索 "addWorldGeometry" 找到讀取場景的那段代碼:

    void createScene(void)
{
// Set ambient light
mDotSceneMgr->setAmbientLight(ColourValue(0.6, 0.6, 0.6));
//mSceneMgr->setSkyBox(true, "Winter-Skybox" );

mDotSceneMgr->addWorldGeometry( "testscene.scene" ); // 改為我們要讀取的場景文件名稱
mDotSceneMgr->SetOctreeVisible( 1 );

ParseDotScene( ""testscene.scene" );

}

(2) 重新編譯。

(3) OK. 現在最激動的時刻終於來臨了,打開 ogrenew\Samples\Common\bin\Release\ Demo_DotScene.exe ,盡情體驗吧!

* 最後說一些注意事項
(1) 3dsmax 場景的原始世界尺寸,大了好!因為如果場景尺寸太小,人站在場景中一眼就把整個場景盡收眼底了, Octree 就將被迫載入全部場景節點,就會卡;
(2) 你可以將鏡頭的遠視距離調小,從而儘量減少落入視野中的三角形數量,對於由此造成的遠景不自然可以使用霧來掩飾;
(3) 構成場景模型的三角形尺寸,不要有太大的,太大的三角形將會影響 Octree 場景分割的自由度,因為 Octree 沒辦法分割這個大大的三角形;
24. Ogre中的碰撞檢測(完整版)


韓舉 @ 原創UI動力

下載代碼
http://www.uipower.com/bbs/dispbbs.asp?boardid=24&id=233

Ogre採用樹樁管理場景中的各種"元素"(攝像機、燈光、物體等),所有的東西都掛在"樹"上,不在"樹"上的東西不會被渲染。
Ogre::SceneManager就是"樹"的管理者,Ogre::SceneNode是從SceneManager中創建的(當然BSP和8*樹的管理也和這兩個類有關,這暫時不討論)。

AABB(軸對齊包圍盒)

這個東西是碰撞檢測的基礎(怎麼總想起JJYY呢),和它類似的還有OBB(有向包圍盒),由於OBB創建複雜,所以Ogre採用了AABB。

最簡單的碰撞檢測:

通過Ogre::SceneNode::_getWorldAABB()可以取得這個葉子節點的AABB(Ogre::AxisAlignedBox), Ogre::AxisAlignedBox封裝了對AABB的支持,該類的成員函數Ogre::AxisAlignedBox::intersects ()可以判斷一個AABB和"球體、點、面以及其他面"的相交情況(碰撞情況)。

    m_SphereNode樹的葉子,掛了一個"球" 
m_CubeNode樹的葉子,掛了一個"正方體"

AxisAlignedBox spbox=m_SphereNode->_getWorldAABB();
AxisAlignedBox cbbox=m_CubeNode->_getWorldAABB();
if(spbox.intersects(cbbox))
{
//相交

}

區域查詢:

簡單的講就是,查詢某一區域中有什麼東西,分為AABB、球體、面查詢。

//創建一個球體查詢,這裡的100是m_SphereNode掛著的那個球體的半徑
SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
//執行這個查詢
SceneQueryResult QResult=pQuery->execute();
//遍歷查詢列表找出範圍內的物體
for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
MovableObject* pObject=static_cast<MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Entity* ent = static_cast<Entity*>(pObject);
//這裡簡化了操作,由於只有一個"球體"和一個"正方體",
//所以只判斷了球體和正方體的相交

if(ent->getName()=="cube")
{
//改變位置防止物體重疊
vtl=-vtl;
m_SphereNode->translate(vtl);
break;
}
}
}
}

相交查詢

遍歷所有的對象,找到一對一對的相交物體(廢話呀,相交當然至少兩個物體)。

//創建相交檢測
IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
//執行查詢
IntersectionSceneQueryResult QResult=pISQuery->execute();
//遍歷查詢列表找出兩個相交的物體
for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
iter != QResult.movables2movables.end();++iter)
{

SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
//if(pObject)
{
String strFirst=pObject.first->getName();
String strSecond=pObject.second->getName();
//下面加入你自己的兩個物體相交判斷代碼,或者簡單的用AABB的判斷方法,
}
}

25. 角色骨骼動畫強力輸出方案 補遺


使用原文中的輸出方式從 3dsmax 裡面通過 ActorX 插件輸出 PSK 和 PSA 文件時存在著一個問題,就是在 MilkShape 3D 中輸入 PSK 和 PSA 文件時模型和骨骼會發生錯位,這個在原文中也提到了:

其實這個問題很容易解決,就是我們在輸出 PSK 文件時,必須輸出「基準姿勢」( Reference Pose ),也就是兩臂平張、兩腳並齊的那個標準姿勢:

要調出並輸出這個基準姿勢,很簡單:

(1) 選中角色骨骼根節點:

(2) 到 3dsmax 右欄,點擊輪子圖標切換到 Motion 面板,再按下其中的 [Figure Mode] 按鈕進入形體模式:

現在就成為基準姿勢了。

(3) 然後用原來的辦法把這個基準姿勢輸出為模型文件 PSK 就行了:

(4) 然後再按一下 Motion 面板中的 [Figure Mode] 按鈕退出形體模式,然後才能輸出角色動畫。

現在在 MilkShape 3D 裡面輸入 PSK 和 PSA 就是完全重合的了:

* 另:

如果你輸出了多個動畫序列到同一個 PSA 文件,那麼你可以打開輸出文件夾下的 X_AnimInfo_####.LOG ,這個是 ActorX 文件的動畫輸出記錄,裡面可以查看每一個動畫序列的關鍵幀信息,例如:

Unreal skeletal exporter - Animation information for [tqzs.psa]

Bones: 87


* Animation sequence stand 0 Tracktime: 21.000000 rate: 30.000000
First raw frame 0 total raw frames 21 group: [None]
Rot/translation track keys: 1827 Animated scale keys: 0

* Animation sequence walk 1 Tracktime: 21.000000 rate: 30.000000
First raw frame 21 total raw frames 21 group: [None]
Rot/translation track keys: 1827 Animated scale keys: 0

* Animation sequence run 2 Tracktime: 17.000000 rate: 30.000000
First raw frame 42 total raw frames 17 group: [None]
Rot/translation track keys: 1479 Animated scale keys: 0

* Animation sequence jump 3 Tracktime: 21.000000 rate: 30.000000
First raw frame 59 total raw frames 21 group: [None]
Rot/translation track keys: 1827 Animated scale keys: 0


你可以根據這個來編寫從 MilkShape 3D 裡面輸出動畫序列時所需要的關鍵幀定義文件,例如:

0,20,stand
21,41,walk
42,58,run
59,80,jump
 楼主| 发表于 2006-10-25 15:03:02 | 显示全部楼层
26. 角色骨骼動畫強力輸出方案 再補遺


希望這個「再補遺」能夠徹底解決 OGRE 角色動畫輸出時的骨骼錯位問題。

為什麼角色動畫從 3dsmax 輸出 PSK 和 PSA 文件到 MilkShape 3D 時會發生骨骼錯位,現在看來是因為兩個原因:
(1) 沒有輸出基準姿勢( Reference Pose )。
   這個是最主要的原因,上一個補遺的辦法,手工輸出基準姿勢,已經可以解決問題,但是忘了, ActorX 本身就有強制輸出基準姿勢的選項。
(2) 角色骨骼的根節點本身就有位移。
   角色骨骼的根節點在 3dsmax 裡面可以發生位移、旋轉、縮放,這些空間特性的變化是相對於世界坐標系的,輸出成 PSK 和 PSA 以後,根節點失去了位移屬性,它跟角色皮膚的位置就不再是匹配的。
   並且由於根節點位移屬性的丟失,會導致一些很彆扭的動畫失真。因為這時候角色不管如何動作,角色的根節點位置都是固定不變的,比方說原本是一個人跳起老高的動作,輸出後你會發現人僅僅是做了個跳高動作,但是身體的高度仍然固定在原來的水平。
   要解決這個問題很簡單,就是給根節點添加一個父節點,使得根節點的所有空間屬性,從相對於世界空間,轉化為相對於它的父節點,也就是整個角色骨骼的新的根節點。並且這個新的根節點的位置,需要絕對位於世界原點 ( 0, 0, 0 ) 。
   這樣做,角色骨骼動畫的一切空間屬性都會被完美保留。


下面說說具體的做法步驟,如果你會用 3dsmax ,可以略去不看:

(1) 添加一個新的骨骼根節點

(1-1) 繪製一個骨骼節點
(1-1-1) 在 3dsmax 中打開模型,然後切換到前視圖( Front );
(1-1-2) 如果網格( Grids )沒有顯示,按快捷鍵 G 打開網格;
(1-1-3) 如果吸附到網格( Snap )沒有打開,按快捷鍵 S 打開吸附到網格功能;
(1-1-4) 在右邊工具欄的 Create 面板中點擊齒輪圖標切換到 System 面板,點擊 [Bones] 按鈕準備繪製骨骼;

(1-1-5) 如圖所示,從世界原點向上畫兩個骨骼:

畫好以後按兩下鼠標右鍵取消繪製骨骼;

(1-1-6) 選中上面的一個骨骼並刪掉它,完成後如圖所示:

到這裡,我們所需要的,位於世界原點的一個骨骼節點就算畫好了;

(1-2) 把新繪製的骨骼節點鏈接為整個角色骨骼的根節點
(1-2-1) 從主菜單選擇 [Graph Editors] - [New Schematics View...] 打開圖表視窗,可以看到角色的骨骼結構:

(1-2-2) 我們可以看到,原來的角色根節點是 Bip01 ,我們新繪製的節點是 Bones01 ,現在它們還沒有連接起來:

(1-2-3) 在進行骨骼連接之前,為了保證 Bip01 位於原始位置,我們必須進入基準姿勢模式:
(1-2-3-1) 在圖表視窗內選中 Bip01 根節點:

(1-2-3-2) 然後到右邊工具欄點擊輪子圖標切換到 Motion 面板,點擊如圖所示的按鈕進入到 Figure Mode :

(1-2-3-3) 這就是基準姿勢:

Bip01 的一切空間屬性,其實都是相對於它在這個基準姿勢時的初始位置。

OK. 現在可以安全連接了。

(1-2-4) 現在我們在圖表視窗上方的工具欄裡點擊這個 Connect 圖標準備連接骨骼:

(1-2-5) 先在 Bone01 上點擊,按住左鍵不放,把引出的虛線拖曳到 Bip01 上:

(1-2-6) 放開鼠標, OK. 連接起來了。現在 Bone01 是整個角色骨架的根節點:

最後記住退出節點鏈接模式,辦法是在圖表視窗工具欄點擊箭頭圖標:

(2) 輸出
在這一步,我們只需要在 ActorX 輸出面板上勾選這個選項:


force refrence pose t=0 :強制輸出基準姿勢到第 0 幀。

現在再輸出就基本沒問題了:

27. 角色骨骼動畫強力輸出方案 最終補遺


MilkShape 3D 輸出插件仍然不成熟,存在著一個 Bug ,就是角色骨骼的根節點坐標系的錯亂。直觀的表現,是本該向上跳的模型,變成了向前跳。
如果有這種現象發生,修改一下 Ogre.sln 解決方案中的 MilkshapeExport 項目,修改它的 MilkShapePlugin.cpp 文件中的這一行:

Ogre::Vector3 kfPos(currPosKey->osition[0], currPosKey->osition[1], currPosKey->osition[2]);
改為:
Ogre::Vector3 kfPos(currPosKey->osition[2], currPosKey->osition[1], currPosKey->osition[0]);

然後重新編譯 MilkshapeExport 項目,把生成的 msOGREExporter.dll 重新複製到 MilkShape 3D 1.7.x 安裝目錄下,重新輸出模型。

編譯 MilkShapeExport 項目需要 MilkShape SDK ,很小,很好下載:
點擊下載 MilkShape SDK 1.7

解壓縮後放置到任意目錄比方說 D:\Program Files\MilkShape 3D 1.7.0\msLib ,然後在 VC7 的 [工具] - [選項...] - [項目] - [VC++ 目錄] 下面添加 頭文件和庫的路徑:
包含文件:
D:\Program Files\MilkShape 3D 1.7.0\msLib\
庫文件:
D:\Program Files\MilkShape 3D 1.7.0\msLib\lib


最後把 ZFGirl 的 MilkShape3D 模型文件,帶動作,貢獻給大家:
點擊下載此文件


28. DotScene 最近將推出最新版


在 OGRE 官方論壇看到的消息。
http://www.ogre3d.org/phpBB2/viewtopic.ph ... hlight=ogreexporterplugin

DotScene 這個 addon 的作者在官方論壇叫做 cTh ,因為近來不斷有人抱怨 DotScene 在新版本 ogre 0.15.1 推出以後變得無法編譯無法正常使用, cTh 出來發話了,他宣布正在開發適用於 OGRE CVS 最新版,也就是未來的 OGRE 1.0 的 DotScene Addon,不日即將放出:


引用內容: cTh
Veteran
Posted: Mon Dec 27, 2004 6:36 pm Post subject:

Yep, this version of the exporter is OUT OF SYNC
I'm syncing it right now to 1.0, the HEAD branch of Ogre in CVS...

HtH, cTh

--------------------------------------------------------------------------------
cTh
Veteran
Posted: Tue Dec 28, 2004 6:43 am Post subject:

In the next few days I'll upload the exporter, meshViewer, dotSceneViewer and a dotSceneInterface library (loading and serialization of .scene files)...
but be aware that the HEAD CVS branch of Ogre for now is still unstable (though it works for me pretty well )

HtH, cTh
 楼主| 发表于 2006-10-25 15:03:18 | 显示全部楼层
29. DotScene for OGRE 0.15.1


(也支持 0.15.2 )

OGRE 穩定版升級到 0.15.1 以後, DotScene 原先的代碼不兼容了,最新的 CVS 版本又不穩定,我也是很不容易才解決了這個問題,現在 DotScene 可以在 OGRE 0.15.1 穩定版中使用了:



這裡建議大家都使用最新的穩定版,輕易不要使用 CVS 最新版,不穩定,因為 CVS 正向 OGRE 1.0 進展中,變動非常頻繁,有時候會讓你欲哭無淚。

因為 CVS addons 目錄下的 DotScene 代碼已經不適合 0.15.1 ,在這裡上傳 3dssceneexporter 和 dotsceneoctree 兩個項目的源代碼:

[2005-01-12] http://gd.91.com/temp/files/ogre/ogreaddons_DotScene.rar

(1) 編譯環境:
(1-1) VS.net 2003
(1-2) OGRE Win32 Source Release 0.15.1 [Hastur] 穩定版 (官方於 2004-11-28 釋放)
可以在這裡下載:
OGRE 一起學 (10) —— OGRE 相關文件本地下載
[2004-11-30] http://gd.91.com/temp/files/ogre/ogre-win32-v0-15-1.zip


(2) 目錄要按如下結構放置:
..
ogreaddons
3dssceneexporter
dotsceneoctree
ogrenew
..
也就是說 ogreaddons 和 ogrenew 應該是兩個平行的目錄;

(3) 編譯方法:
編譯 ogreaddons\3dssceneexporter\OgreUtils.sln ;
編譯 ogreaddons\dotsceneoctree\Solution1.sln ;

(4) 安裝方法:
(4-1) 將 ogrenew\Samples\Common\bin\Release\ 目錄下所有 DLLs 複製到 3dsmax6 安裝目錄下;
(4-2) 將 ogreaddons\3dssceneexporter\IGame\IGame.dll 複製到 3dsmax 安裝目錄下;

其它用法參見老文章:
OGRE (22) —— DotScene (1)
OGRE (23) —— DotScene (2)


注意:不要忘了在 Plugins.cfg 裡面加入這一條:
Plugin=Plugin_DotSceneManager


注意:如果場景是黑的請打開你的 *.scene 文件,修改頭部的 colour_ambient 屬性,它就是場景的環境光:
<scene id="0" formatversion="0.01.0" scenemanager="any" min_ogre_version="0.12.0" author="cTh&apos;s Ogre MAX plugin">
  <environment>
   <colour_ambient r="1" g="1" b="1" />
    <colour_background r="0.3" g="0.4" b="0.5" />
  </environment>
30. 最新加強版 3dsmax 輸出插件及其使用


最新加強版的 3dsmax -> OGRE Mesh 、 Skeleton 、 Material 整合輸出插件,增加了很多功能,而且 3dsmax 5/6/7 都能用。

下載頁面:(自己可以隨時來這裡更新)
http://bananialair.ifrance.com/bananialair/

本地下載:
點擊下載最新加強版 3dsmax 輸出插件(2005-01-03)


安裝方法:

(1) 解壓縮,將整個 script 文件夾覆蓋到 3dsmax 根目錄下;

(2) 打開 3dsmax ,在主菜單中選擇 [MAXScript] - [Run Script...] ,運行腳本文件 3dsmax\scripts\ogre\macros\ogreToolbar.mcr

(3) 如果沒有顯示 Tab Panel ,在主工具條空白處右擊,在彈出菜單上選擇 "Tab Panel" :



這就是 Tab Panel :


(4) 在主菜單中選擇 [Castomize] - [Castomize User Interface...] ,彈出 "Castomize User Interface" 面板,在左下欄中選擇 "OGRE Exporter" :



(5) 按住鼠標不放,把 "OGRE Exporter" 圖標拖曳到 Tab Panel 上再放開鼠標:





OK。

選項說明:
Options
使用方法跟老版本輸出插件大同小異,主要是多了一些激動人心的選項:可以輸出邊列表、法線和LOD。



Generate Edges List : 生成邊列表:只有帶邊列表的模型才能產生影子。
Generate Tangent Vectors : 生成法線向量:可以保持物體表面平滑過渡。
Generate LOD : 生成 LOD (層次細節)
LOD levels: LOD 層次;
LOD distance: 物體與鏡頭的距離每增加一倍這個距離, LOD 就深一層;
也就是每隔這麼遠就自動減面;
LOD reduction(%): LOD 縮減量(百分比)
LOD 每深一層,縮減掉的面數的百分比。


其它的大同小異,自己摸索吧。

发表于 2007-9-29 13:46:46 | 显示全部楼层
强!!!!!!!!!!!!!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-22 02:14

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表