2009年03月28日
選択した頂点1つ毎にクラスターを追加して、 2Dボーンへクラスターコンストレインを結ぶスクリプト
頼まれたので作った
選択した頂点1つ毎にクラスターを追加して、
2Dボーンへクラスターコンストレインを結ぶスクリプト
を作ってみました。
所詮マクロの延長なので難しいことはやってないのですが、
頂点のindex番号と頂点位置を取得するのに詰まったので、
備忘録的に投稿。
選択した頂点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
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)
は俺の中で呪文。意味は深く理解してない!
⇒
スクリプトのダウンロードはコチラ






