4.5 Physics and Vehicles

 

在Second life裡為了能呈現真實世界的物理現象,擁有了物裡引擎的程序。利用這個引擎就能利用數學計算模擬牛頓物體碰撞和相互作用的虛擬環境。包含模擬重力,彈性和動量守恆之間的碰撞,以及、衝量、摩擦力等等的物理現象。例如當角色爬上山丘或是下山的頭像變化,角度的改變,又或是接近樓梯到上下樓梯時角色身軀的擺動等等,都能利用物理引擎模擬物理現象。

在Second life裡面,物理引擎無法完全精準對所有的物理現象都做擬真的動作。但是基本的物理表現都能設定於創造出來的物件當中,當使用者建立起一個物件時,除了利用GUI介面設定物件是否遵照物理線向外,利用內建的函式也能使物件透過物理引擎表現出物理現象,並且能比只能勾選的GUI介面設定更細微的動作。以下是一些物理函式的介紹:

 

一. 物理物件

一般來講物理物件會有碰撞、幻影、彈性、重力、力、速度、角速度、加速度、力矩、衝量等特性。若是想要設定物件擁有上列特性時,往往都必須先設定物件是physical的。這時只要使用llSetStatus()來對物件設定狀態後,便能夠隨心所欲的加入其他的物理效果。

llSetStatus( STATUS_PHYSICS, TRUE)


1. 跟加速度的作用

加速度 = 力 / 質量單位時間內速度的變化量

 

2. 函數

llSetForcevector forceinteger local );
llSetTorquevector torque, integer local ); //力矩
llSetForceAndTorquevector forcevector torqueinteger local );
這些函數會讓物體直到力消失前都會推進,為持續的力
llApplyImpulsevector force, integer local );
 llApplyRotationalImpulsevector force, integer local );
PUSH為持續的力,而Impulse為短時間的衝力
llPushObjectkey targetvector impulsevector ang_impulseinteger local );
影響一些瞬時衝量的函式
llSetBuoyancyfloat buoyancy ); //浮力
llSetHoverHeightfloat heightinteger waterfloat tau );
llStopHover( );
llGroundRepelfloat heightinteger waterfloat tau ); //地面的斥力,持續的
物件移動、浮力有關的函式
llRotTargetrotation rotfloat error );
llTargetOmegavector axisfloat spinratefloat gain );
llRotLookAtrotation target, float strength, float damping );
llStopLookAt( );
llTargetRemoveinteger number );
和轉動有關的函式

注意的是許多地方必須為 physics-enabled且不允許使用Push的功能。

Reference: http://wiki.secondlife.com/wiki/Category:LSL_Physics

3. llSetPrimitiveParams()設置物件本身特質

llSetPrimitiveParams()是一個非常強大的函式,不僅能設置大小、顏色、光線、紋理屬性、凹凸、陰影、形狀等等的屬性設定。但也因為這麼多的功能導致傳入的參數非常的複雜,其中還有些毛病。此函式的主體為:llSetPrimitiveParams(list rules)  而rules便是針對預設定的屬性給入的參數。例如PRIM_COLOR是設定顏色的功能,而這個參數稱做為Flag.不同的flag會導致之後還需傳入不同的參數,例如:llSetPrimitiveParams([ PRIM_COLOR, ALL_SIDES, <1,1,1>, 0 ]);可以讓物體變透明。底下列舉幾個flag的描述以及後面傳入的參數型態:

Flag   ↓ V   ↓ Description   ↓ Usage
PRIM_NAME 27 Sets the prim's name. PRIM_NAMEstring name ]
PRIM_DESC 28 Sets the prim's description. PRIM_DESCstring description ]
PRIM_TYPE 9 Sets the prim's shape. PRIM_TYPEinteger flag ] + flag_parameters
PRIM_MATERIAL 2 Sets the prim's material. PRIM_MATERIALinteger flag ]
PRIM_PHYSICS 3 Sets the object's physics status. PRIM_PHYSICSinteger boolean ]
PRIM_TEMP_ON_REZ 4 Sets the object's temporary attribute. PRIM_TEMP_ON_REZinteger boolean ]
PRIM_PHANTOM 5 Sets the object's phantom status. PRIM_PHANTOMinteger boolean ]
PRIM_POSITION 6 Sets the prim's position. PRIM_POSITIONvector position ]
PRIM_ROTATION 8 Sets the prim's global rotation. PRIM_ROTATIONrotation rot ]
PRIM_ROT_LOCAL 29 Sets the prim's local rotation. PRIM_ROT_LOCALrotation rot ]
PRIM_SIZE 7 Sets the prim's size. PRIM_SIZEvector size ]
PRIM_TEXTURE 17 Sets the prim's texture attributes. PRIM_TEXTUREinteger facestring texturevector repeatsvector offsetsfloat rotation_in_radians ]
PRIM_TEXT 26 Sets the prim's floating text. PRIM_TEXTstring textvector colorfloat alpha ]
PRIM_COLOR 18 Sets the face's color. PRIM_COLORinteger facevector colorfloat alpha ]
PRIM_BUMP_SHINY 19 Sets the face's shiny & bump. PRIM_BUMP_SHINYinteger faceinteger shinyinteger bump ]
PRIM_POINT_LIGHT 23 Sets the prim as a point light. PRIM_POINT_LIGHTinteger booleanvector colorfloat intensityfloat radiusfloat falloff ]
PRIM_FULLBRIGHT 20 Sets the face's full bright flag. PRIM_FULLBRIGHTinteger faceinteger boolean ]
PRIM_FLEXIBLE 21 Sets the prim as flexible. PRIM_FLEXIBLEinteger booleaninteger softnessfloat gravityfloat frictionfloat windfloat tensionvector force ]
PRIM_TEXGEN 22 Sets the face's texture mode. PRIM_TEXGENinteger faceinteger type ]
PRIM_GLOW 25 Sets the face's glow attribute. PRIM_GLOWinteger facefloat intensity ]
PRIM_CAST_SHADOWS 24 Sets the prim's cast shadow attribute. (DEPRECATED) PRIM_CAST_SHADOWSinteger boolean ]
PRIM_TYPE_LEGACY 1 Sets the prim's shape (legacy mode, DEPRECATED). [ 1, integer flag ] + flag_parameters

各項參數的使用方法請參考連結

http://wiki.secondlife.com/wiki/LlSetPrimitiveParams

4.傷害

必須要在能夠執行push的script的地方,那受到強烈的push之後 將會傷害玩家操作的人物。基本上人物生命值有100點,歸零則被傳送至家中,利用llSetDamage(float injury)可以做出減少人物生命值的效果。

5.推動物件:飛行器

主要是將函有push函數的物件裝備在身上,再藉由偵測鍵盤事件,改變推進的方向。

6.能量損耗

大部分的物理運動會在運動過程中,轉變回其他形式的能量。例如:熱能,而有所能量損耗,為了要讓SL中的物件也能模擬這樣的效果,可以另外設參數,使得速度或加速度可以隨著時間漸少。

 

二. 載具

1.載具屬性

方向:除非有特殊情況,載具前頭記得調成跟人面對的方向一樣,才較符合實際情況,一般來講可以在建立另一個透明物件綁在一起來微調。

旋轉:轉彎時旋轉的操作與角度。

時間軸:時間軸越小移動速度越快。

效率:效率越高移動速度越快。

另外物理物件只能有32個prim,所以連同駕駛員在上面,最多只能用31個prim來做物件,當然要乘坐更多人時必須再減少。

2.載具狀態

基本上駕駛載具時,通常會變成另外一個狀態,讓新的動作指令取代原來未坐上載具的指令。

3.攝影鏡頭和滑鼠視野

攝影鏡頭:可以看到自己的人和世界(第三人稱)。

滑鼠視野:由人物眼睛方向看出去 看不到自己(第一人稱)。

三. Vehicles 函式

每一個腳本對象可以有一個車輛的行為,是通過配置的llSetVehicleType,llSetVehicleFloatParam,llSetVehicleVectorParam

(1)llSetVehicleType 設定車子的型態

llSetVehicleTypeinteger type );


 
描述
VEHICLE_TYPE_NONE 0 關閉汽車型態
VEHICLE_TYPE_SLED 1 簡單的車輛,當遇到地面顛簸,會傾向X軸來跑
VEHICLE_TYPE_CAR 2 車輛,若延者地面反彈,需要馬達驅動外部控制或  需要時間計時事件來控制
VEHICLE_TYPE_BOAT 3 若須在水面上停留需要摩擦力跟偏轉角
VEHICLE_TYPE_AIRPLANE 4 上升要使用線性的偏向,沒有盤旋,透過傾壓來旋轉
VEHICLE_TYPE_BALLOON 5 懸停和摩擦,但沒有偏轉

 

(2)llSetBuoyancy 設定車子的浮力狀況

利用llSetBuoyancy函式,可以使車子從反重力狀態到無浮力狀態。VEHICLE_BUOYANCY參數可以設定變數0.0(無浮力)~1.0(反重力)。值得注意的是,當VEHICLE_FLAG_HOVER_UP_ONLY這個tag被啟用時,浮力這個效果便會和hover(空中盤旋、停留)相互作用。舉例來說,當車子浮力浮到超過hover的高度時,浮力效果便會消失,也就是不再上升浮出。

 

(3)Hover(懸浮、盤旋)

Hover也是交通工具中一個獨立的行為模式,而這項效果須透過多個變數來設定進行細部的工作。若要讓Hover效果出現時,VEHICLE_HOVER_TIMESCALE須設定小於300秒。若設定時間過大,則不會產生出Hover的效果。而在這裡SL也針對不同的交通工具而擁有不同的變數,以下是交通工具對應到的變數使用:

交通工具 標籤
VEHICLE_FLAG_HOVER_WATER_ONLY
坦克 VEHICLE_FLAG_HOVER_TERRAIN_ONLY
潛艇或氣球 VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT

 

(4)Linear and Angular Deflection :

真實的車輛會傾向沿著「優先軸的運動。」這是由於他們的輪子,翅 膀,形狀,或方法的推進,他們並常常將自己推向或重新定向優先軸。這是一般的功能定義一個類別的車輛。如果它要在空中翻滾,最終將自己調整為點前進,稱之為偏轉角對齊效果。

一個輪子的工藝表現出不同的效果:當滑板推往一個方向將傾向於沿重定向由此產生的動作,認為它是自由滾動 - 我們稱這種效應的線性變形。private 之優先軸的運動是本地的X -(上),Y型(左)和Z(上)軸的本地車輛原始位置。偏轉行為涉及到的X軸(上):線性偏轉往往會旋轉的速度,直到其積極的沿X軸的偏轉角,其X軸點在這個方向移動。其他相關的車輛軸所描述的行為,如垂直吸引它試圖保持車輛的地方Z軸指出走向世界的Z -軸(上)。

每個型態的偏轉有一個 「時間表」參數,它確定如何迅速全面偏轉發生。基本上時間表是時間指數衰減係數為走向完全變形。因此,車輛的迅速偏轉應該有一個小的時間表。例如,一個典型的飛鏢可能有一組的時間表偏轉角,但幾秒鐘的線性變形,它會調整自己的方向變化。

(5)Moving the Vehicle:

車輛透過llApplyImpulse的物理腳本其實就能達到移動等等的效果,不過在Second life裡面為了能模擬真實車輛更真實,若使用了llSetVehicleVectorParam將能使車輛的移動更流暢且精緻真實。例如:llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION ,<0,0,3>);便是設定往Z軸的方向移動3m/s。但是為了避免讓車子速度過快,此函式的最快速度不能超過30m/s,這可能是物理引擎內建的限制。然而VEHICLE_LINEAR_MOTOR_DIRECTION這個參數是可以改變的,在這裡的設定是一直以3m/s的速度前進,如果改為VEHICLE_LINEAR_MOTOR_TIMESCALE將會有加速度的效果,讓車輛從靜止慢慢的加速。在此還有許多的參數,透過不同的參數我們能讓車輛的移動有更多的變化。