4.4 Sensing (Sensor, Collision, Greeter)

1.感應(Sensor)

感應在SL中應用到許多的範圍之上, 最簡單的應用就是自動門

以下為其細部使用介紹

函數

llSensor( string name, key id, integer type, float range, float arc );

物件以x軸為軸心繞arc度的範圍內加上感應, range範圍內有name名字和id的key和type型態的物件

llSensorRemove( );

將這個物件的感應器刪掉

 llSensorRepeat( string name, key id, integer type, float range, float arc, float rate );

同樣以x軸為軸心, 替這個物件加上每rate秒去感應arc度range範圍(0.0~96.0m)內有name名字和id的key和type型態的物件

事件

sensor( integer num_detected ){ }

觸發時會傳入num_detected參數, 代表偵測到周圍有幾個

2.碰撞(Collision)

函式 

 llPassCollisions( integer pass );

設定prim的碰撞屬性, pass為true則碰撞處理會從child pass到parent, 反之則無任何碰撞處理

 

 llCollisionFilter( string name, key id, integer accept );

假如accept是true的話 他就只會撞到有name的名字和id的key才會觸發碰撞事件, 反之為false則不以id及key來接受碰撞

 llCollisionSound( string impact_sound, float impact_volume );

碰撞時以impact_volume的音量(0.0-1.0)發出impact_sound名字的音效

/** Broken Feature Warning! */
 llCollisionSprite( string impact_sprite );

取代預設碰撞之後變成的模型為impact_sprite名字的模型(會複寫預設的 須小心使用)
/* *** *** */ 

llVolumeDetect( integer detect );

假如detect為true的話 該物件就可以讓其他物件通過 但是還是會觸發碰撞事件, 其中當發生interpenetrating也會觸發collision_start及collision_end這兩個函式

感應的範圍為距一個物件10m的距離, 若應用在較大的範圍則可用多個物件來進行感應

與 llSensorRepeat相較

  llVolumeDetect() llSensorRepeat()
範圍 10m 96m
頻率 立即 週期性

事件

collision( integer num_detected ){ }

當此物件發生碰撞時觸發num_detected表示被幾個物件撞到

collision_end( integer num_detected ){ }

當此物件碰撞運動結束時觸發num_detected表示被幾個物件撞到

collision_start( integer num_detected ){ }

當此物件碰撞運動開始時觸發num_detected表示被幾個物件撞到

land_collision( vector pos ){ }

當此物件碰撞地面時觸發,pos 表示撞到的位置

land_collision_start( vector pos ){ }

當此物件碰撞地面運動開始時觸發,pos 表示撞到的位置

land_collision_end( vector pos ){ }

當此物件碰撞地面運動結束時觸發,pos 表示撞到的位置

3.導覽人員(Greeter)

利用偵測周圍或碰撞可以做出一個虛擬導遊或是櫃檯人員(例如Weco land 一進入的Robot)

以前是用雇用一些人在裡面扮演這些角色

但是因為SL的特性

現在也越來越多的導覽人員是靠script來運作的物件

當然還是有不少的自願者想當這類角色

不過角色物件化也帶來了一個AI領域的拓展