【引言】
本篇有兩個(gè)目的:
一是通過(guò)個(gè)實(shí)例來(lái)學(xué)習(xí)一下,如何用XPRESSO檢測(cè)模型物體相互"影響"。
二是交流一下如何研究和學(xué)習(xí)XPRESSO節(jié)點(diǎn)。
【研究】
在C4D的XPRESSO中,有兩個(gè)節(jié)點(diǎn),一個(gè)是“碰撞”節(jié)點(diǎn),判斷分析兩個(gè)對(duì)象相互接觸事件;二是“射線碰撞”節(jié)點(diǎn),對(duì)象之間不需要接觸,只要運(yùn)動(dòng)的對(duì)象觸碰到空間看不見(jiàn)的“紅線”,就發(fā)生事件。研究明白這兩個(gè)節(jié)點(diǎn),對(duì)模擬機(jī)器自動(dòng)化的動(dòng)畫(huà)有很大好處。

一、首先研究第一個(gè):“碰撞”節(jié)點(diǎn)。
此節(jié)點(diǎn)是能夠檢測(cè)到兩個(gè)對(duì)象的碰撞。
左邊輸入端:
1、對(duì)象12:連接兩個(gè)相互碰撞的對(duì)象。這些對(duì)象必須是可編輯多邊形對(duì)象。
2、公差:默認(rèn)是0,就是說(shuō)兩個(gè)物體相互接觸的距離是零的時(shí)候起作用,如果輸入不是零,比如是10,那么,兩個(gè)物體相距10個(gè)單位就發(fā)生作用。工作在屬性面板設(shè)置“碰撞類(lèi)型”是在距離的模式下。

右側(cè)的輸出端:
1、碰撞:輸出是個(gè)布爾值。如果兩個(gè)對(duì)象相距在公差的范圍內(nèi),那么就是TRUE 或1 ,否則是FALSE或0。這是一個(gè)重要的輸出端口。
2、點(diǎn)1和點(diǎn)2:輸出是矢量(有方向有大小的量),而且它們的工作在“碰撞類(lèi)型”必須是在距離的模式下。
3、多邊形索引1和2:分別對(duì)應(yīng)兩個(gè)對(duì)象表面的序號(hào)。輸出考訴你是對(duì)象的哪個(gè)面相互發(fā)生了影響。
4、距離:返回是兩個(gè)對(duì)象之間的距離值。而且它的工作在“碰撞類(lèi)型”必須是在球體和距離的模式下。
碰撞節(jié)點(diǎn)的屬性:
1、碰撞類(lèi)型:這是非常重要。碰撞物體以什么來(lái)確定相互碰撞的范圍。(類(lèi)似剛體中的碰撞外形一樣)
范圍框、距離、對(duì)象、公差、球體(對(duì)象外面包裹一個(gè)看不見(jiàn)的球體,為碰撞體)。
2、使用變形網(wǎng)點(diǎn):當(dāng)物體有變形的時(shí)候,勾選。
3、矩陣模式:對(duì)應(yīng)是輸出“點(diǎn)12”矢量輸出。(全局和局部針對(duì)是否有子物體而言)
4、包括子集:如果兩個(gè)對(duì)象包含子集,就勾選。
5、選集標(biāo)簽12:分別對(duì)應(yīng)兩個(gè)對(duì)象的選擇集。必須是制定對(duì)象的某一塊相互碰撞才有效。

舉個(gè)例子吧:
1、在場(chǎng)景中建立兩個(gè)對(duì)象,球體和立方體,然后C。建立一個(gè)空白物體賦予XPRESSO標(biāo)簽。

2、打開(kāi)XPRESSP標(biāo)簽,右鍵--新建--常規(guī)--碰撞標(biāo)簽。把輸入輸出端口都打開(kāi)。再把兩個(gè)對(duì)象拖進(jìn)來(lái),分別打開(kāi)兩個(gè)對(duì)象的對(duì)象輸出端口,連接如下:

3、添加一個(gè)結(jié)果節(jié)點(diǎn)與碰撞輸出相連,默認(rèn)數(shù)據(jù)類(lèi)型是實(shí)數(shù)。如果你不改,那么兩個(gè)對(duì)象不碰撞為0,相遇為1。如果結(jié)果數(shù)據(jù)結(jié)構(gòu)更改為布爾,則碰撞為T(mén)RUE,不碰撞為FALSE。

4、在碰撞節(jié)點(diǎn)的屬性面板,選擇碰撞模式為“距離”。勾選菜單--計(jì)算--動(dòng)畫(huà)刷新(否則,不能實(shí)時(shí)看到數(shù)據(jù)的更新,要注意?。?。然后,按CTRL復(fù)制結(jié)果節(jié)點(diǎn)(實(shí)數(shù)),按照以下連接。

5、現(xiàn)在開(kāi)始實(shí)驗(yàn):
移動(dòng)立方體靠近球體,距離輸出數(shù)值不斷變小。

6、當(dāng)相互接觸時(shí),距離變?yōu)?,最后再靠近變?yōu)?1,不再改變。而其他的端口沒(méi)有變化。

7、更改碰撞節(jié)點(diǎn)的碰撞模式為“對(duì)象”。當(dāng)相互碰撞時(shí),碰撞輸出點(diǎn)為1,就是“真”。而距離輸出點(diǎn)沒(méi)有反應(yīng)。

8、多邊形索引值在接觸的時(shí)候,有了顯示,那個(gè)數(shù)值代表的是模型面的編號(hào)。
選擇球體,點(diǎn)擊構(gòu)造,按O,多邊形模式,找到108號(hào),看看就是發(fā)生碰撞的球體的那個(gè)面。(你必須在面模式下查看)

同理看看立方體1號(hào)面。

9、新建一個(gè)常數(shù)節(jié)點(diǎn),輸入數(shù)據(jù)50。更改碰撞類(lèi)型為“公差”。

10,移動(dòng)立方體靠近球體,當(dāng)他們之間的距離進(jìn)入50以?xún)?nèi),發(fā)生了作用。碰撞輸出為真。

11、把球體復(fù)制到右邊,選擇“編輯器可見(jiàn)”輸入端口,這個(gè)屬性是邏輯值,真就在場(chǎng)景中顯示,假則不顯示。

12、當(dāng)移動(dòng)立方體與球體接觸的瞬間,球體隱形了。

二、研究第二個(gè):“射線碰撞”節(jié)點(diǎn)。
該節(jié)點(diǎn)在空間生成一條虛擬的線,并檢查與其碰撞的一個(gè)多邊形物體,是否發(fā)生碰撞,以及碰撞的坐標(biāo)位置。要檢測(cè)的對(duì)象必須是多邊形可編輯物體。

輸入端口:
1、對(duì)象:被檢測(cè)的對(duì)象。
2、射線12:可以使用實(shí)體模型或空物體的坐標(biāo)位置,由兩個(gè)坐標(biāo)位置形成一條虛擬的射線(從1到2)。
輸出端口:
1、碰撞:布爾值,對(duì)象與該虛擬線有接觸,輸出為1,否則為0.
2、作為背面:也是布爾值,如果相交為對(duì)象的面的背面,輸出為1,否則為0。(如何判斷是正面呢?與法線相同者為正,反之反然。)
3、點(diǎn)擊的位置:返回當(dāng)射線與物體“第一次”相交的位置坐標(biāo)。
4、距離:返回當(dāng)射線與物體第一次相交,射線1與交點(diǎn)的距離值。
5、表面法線、平滑法線:?
6、面邊索引:返回相交位置的對(duì)象面的序號(hào)。
屬性面板:
1、僅作為測(cè)試。默認(rèn)勾選,為了節(jié)省資源。僅計(jì)算機(jī)是否碰撞結(jié)果,不勾選,計(jì)算其他的輸出項(xiàng)。
2、全局坐標(biāo)。是否用全局坐標(biāo)。
第一個(gè)例子:
1、在場(chǎng)景中建立如下物體:兩個(gè)圓柱A和B,作為空間的虛擬線的起點(diǎn)終點(diǎn)。用立方體制作如下的模型,作為檢測(cè)體。

2、用引導(dǎo)線連接AB兩個(gè)圓柱,表示射線。(目的是讓你能看到這條看不見(jiàn)的線而已)

3、建立空物體,設(shè)立一個(gè)XPRESSO標(biāo)簽。把三個(gè)對(duì)象拖進(jìn)來(lái)。建立一個(gè)”射線碰撞“節(jié)點(diǎn)。
按照如下鏈接。

4、把A對(duì)象節(jié)點(diǎn)進(jìn)行復(fù)制,做如下鏈接。目的是,如果射線和檢測(cè)體相遇,那么,碰撞輸出為真,或1,啟動(dòng)A模型使用顏色。(A對(duì)象默認(rèn)是不啟用顏色的)

5、下面進(jìn)行測(cè)試,延X(jué)移動(dòng)"檢測(cè)體”向“射線”靠近。

6、當(dāng)檢測(cè)體遇到射線,碰撞輸出為真,A對(duì)象顯示顏色。

7、當(dāng)不相交,碰撞輸出為假或0,A對(duì)象不輸出顏色。

8、如此。

再舉一個(gè)例子。
1、在場(chǎng)景中建立一條螺旋線,設(shè)置如下:

2、按C轉(zhuǎn)換曲線,勾上閉合樣條。

3、選中上線兩點(diǎn),右鍵“剛性插值”。

4、建立一個(gè)擠壓對(duì)象,設(shè)置如下。

5、再建立一個(gè)圓柱,設(shè)置如下。

6、把圓柱轉(zhuǎn)化為多邊形,改名字為“被動(dòng)”。按L,移動(dòng)它的坐標(biāo)到最低端。(如果圓柱不轉(zhuǎn)化多邊形,這個(gè)軸點(diǎn)你是移不動(dòng)的)

7、建立兩個(gè)空物體,命名為A,B。充當(dāng)射線位置。

8、注意AB的位置和方向。再建立一個(gè)空物體,添加X(jué)PRESSO標(biāo)簽。

9、轉(zhuǎn)換擠壓物體,改名為“檢測(cè)體”。

10、打開(kāi)XPRESSO,把這幾個(gè)對(duì)象拖入進(jìn)來(lái)。按照下面進(jìn)行連接:

11、射線時(shí)時(shí)刻刻檢測(cè)如這個(gè)的“圓盤(pán)”---檢測(cè)體是否碰撞,碰撞的結(jié)果為1,在“點(diǎn)擊位置”輸出的是它與虛擬射線的相交點(diǎn)坐標(biāo)值(矢量)。

12、把圓柱體“被動(dòng)”拖入進(jìn)來(lái),進(jìn)行下面連接。但不能直接連接,因?yàn)椤包c(diǎn)擊位置”輸出是矢量,而“被動(dòng)”物體關(guān)心的是Y,上下的方向。所以中間要添加一個(gè)轉(zhuǎn)換。

13、測(cè)試一下:旋轉(zhuǎn)“測(cè)試體”R.B增加角度,發(fā)現(xiàn)“被動(dòng)”沒(méi)有動(dòng)。點(diǎn)擊NG線框看看,沒(méi)動(dòng)怎么回事?

14、點(diǎn)擊“射線碰撞”節(jié)點(diǎn),看看屬性面板。原來(lái)在這里:默認(rèn)“僅作測(cè)試”是勾選的,如果勾選,只有碰撞輸出起作用,其他沒(méi)有數(shù)值。所以,必須勾掉它。

15、在復(fù)制檢測(cè)體到下面,從SYSTEM PRESENTS找到預(yù)設(shè)節(jié)點(diǎn)--rotate,把它連接到檢測(cè)體的旋轉(zhuǎn).B上。

16、點(diǎn)擊播放,測(cè)試,這一回成功了。



17、有點(diǎn)看不出來(lái)。再加點(diǎn)其他的東西豐富一下:




【后記】
第一個(gè)教學(xué)目的實(shí)現(xiàn)完了。
那么第二個(gè)教學(xué)目的呢?如何學(xué)習(xí)xpresso?這篇文章,全部的研究的過(guò)程,你不也看到了,就是這樣研究和學(xué)習(xí)XPRESSO的。對(duì)了,還有,還要看這個(gè)---幫助。你必須熟悉每個(gè)節(jié)點(diǎn)的作用和意義,你才能“隨心所欲”地應(yīng)用。

這個(gè)范例有點(diǎn)難,提供下載示范文件:
地址:http://pan.baidu.com/s/1o60wJJO