選択した頂点1つ毎にクラスターを追加して、 2Dボーンへクラスターコンストレインを結ぶスクリプト

頼まれたので作った

選択した頂点1つ毎にクラスターを追加して、
2Dボーンへクラスターコンストレインを結ぶスクリプト
を作ってみました。

所詮マクロの延長なので難しいことはやってないのですが、
頂点のindex番号と頂点位置を取得するのに詰まったので、
備忘録的に投稿。




Dim ovposx() ,ovposy() ,ovposz() ,ocls() ,n

set osels = getvalue("selectionlist")
Set oVertexCollection = osels(i).SubComponent.ComponentCollection
n = "0"

'頂点情報を取得
For Each oVertex in oVertexCollection
    logmessage "Index: " &oVertex.Index
    
    ReDim Preserve ovposx(n)
    ovposx(n) = oVertex.Position.x
    logmessage "Position.x " &ovposx(n)
   
    ReDim Preserve ovposy(n)
    ovposy(n) = oVertex.Position.y
    logmessage "Position.y " &ovposy(n)
   
    ReDim Preserve ovposz(n)
    ovposz(n) = oVertex.Position.z
    logmessage "Position.z " &ovposz(n)
   
    opnt = oVertex.Index
   
    '情報取得したついでにクラスターにしてしまう
    SelectGeometryComponents osels(i).name &".pnt[" &opnt &"]"
    ReDim Preserve ocls(n)
    set ocls(n) = CreateCluster
    logmessage "ocls(n): " &ocls(n)
    n = n + 1
Next

'2Dボーンをつくるんだが、法線の設定が微妙…orz
Create2DSkeleton ovposx(0), ovposy(0), ovposz(0), ovposx(1), ovposy(1), ovposz(1),-34.4101023240667, -177.120000106129, -8.39666435906368E-13, 3 , obone, oeff

'logmessage n

'2つ目以降のボーンはここで追加
for i = 2 to n - 1
    logmessage ovposx(i)
    logmessage ovposy(i)
    logmessage ovposz(i)
    AppendBone oeff , ovposx(i), ovposy(i), ovposz(i)
next

'rootの名前を取得する方法がわからなかったため生成したボーンの親を見て取得
'logmessage obone
SelectNeighborObj obone, 0, "NODE", False
set oroot = getvalue("selectionlist")

ApplyCns "ObjectToCluster", oroot , ocls(0)

'クラスターコンストレインするとき骨が後何個あるかわからないため、取得
SelectObj obone, "BRANCH"
SelectChildNodes
set obonecnt = getvalue("selectionlist")
obonecnt = obonecnt.count
logmessage "honekazu: " &obonecnt
SelectNeighborObj obone, 1, "NODE", False

'骨の数だけクラスターコンストレインを回す
for i = 1 to obonecnt -1
    set ochl = getvalue("selectionlist")
    ApplyCns "ObjectToCluster", ochl , ocls(i)
    SelectNeighborObj ochl, 1, "NODE", False
next

'最後にエフェクターにクラスターコンストレイン
ApplyCns "ObjectToCluster", oeff , ocls(obonecnt)


苦労したところは

Dim ovposx() ,ovposy() ,ovposz() ,ocls() ,n

set osels = getvalue("selectionlist")
Set oVertexCollection = osels(i).SubComponent.ComponentCollection
n = "0"

'頂点情報を取得
For Each oVertex in oVertexCollection
    logmessage "Index: " &oVertex.Index
   
    ReDim Preserve ovposx(n)
    ovposx(n) = oVertex.Position.x
    logmessage "Position.x " &ovposx(n)
   
    ReDim Preserve ovposy(n)
    ovposy(n) = oVertex.Position.y
    logmessage "Position.y " &ovposy(n)
   
    ReDim Preserve ovposz(n)
    ovposz(n) = oVertex.Position.z
    logmessage "Position.z " &ovposz(n)
   
    opnt = oVertex.Index
   
    '情報取得したついでにクラスターにしてしまう
    SelectGeometryComponents osels(i).name &".pnt[" &opnt &"]"
    ReDim Preserve ocls(n)
    set ocls(n) = CreateCluster
    logmessage "ocls(n): " &ocls(n)
    n = n + 1
Next

この部分で、
「頂点番号なんかどうやって取得するんだよ」
っつー感じで悩んでしまいました。

あとは、配列変数。
クラスターにするときは別に配列変数にする必要はなかったんだけど、
あとで、クラスターコンストレインするので取得せざるを得ない。

たとえば
Dim ovposx()
で宣言しておく、

For Eachループで回すときに、
ovposx(n) = oVertex.Position.x
とすんなり変数が配列化してくれればいいんだけど、
ならずに、またつまる。
でも、
ReDim Preserve ovposx(n)
とすることで
ovposx(n) = oVertex.Position.x
が使えるようになった。

ReDim Preserve ovposx(n)
は俺の中で呪文。意味は深く理解してない!

 ⇒スクリプトのダウンロードはコチラ