2016-04-26 11 views
0

スネークスケールの動きの解決策を探しているとき、私は 'リベットスクリプト'を見つけました。剛体のオブジェクト(尺度)を一貫した点で変形する必要があります。スクリプトはすごくうまくいっていますが、今度はさらにtdプロセスに移行するために、私が解決する必要があるいくつかの側面があります。子供がどのように動くかを指示するために、親ポリゴンから得られた頂点の法線ベクトルに加えて、追加の制約方向が必要です。 2次方向がオブジェクトのフロントエンドに向かうエッジの流れに従うように、スクリプトを試して変更する計画です。私は、このベクトル方向をエッジ自体から簡単に取ることができると期待していますが、それはそれほど単純ではないかもしれないと感じています。 hoodiniのドットプロダクトとクロスプロダクトを使用して、この種の制約に基づいたリレーションシップを行う経験は限られていますが、Mayaではそれが私にはもう少し挑戦的です。私はもう一つの方向性しか必要としないと確信しています。これを解決する方法に関する提案はありますか?私はあなたに良いアイデアを与えるために、低ポリテストオブジェクトにいくつかの画像を添付しました。最初の部分は休息位置にある曲線を示し、2つの2番目の画像は2次曲線が「ヘビ」の体表面に沿った理想的なベクトル位置からどのように逸脱しているかを示しています。ここでMayaの親オブジェクトに二次的なコントロールの方向を追加

は、参照ピクチャ https://drive.google.com/file/d/0B1O6s3CJ1wwlN1lOS1E1ZXVuOVk/view?usp=sharing

へのリンクとともにスクリプト https://www.creativecrash.com/maya/script/rivet-button/description#tabs

へのリンクであり、ここでのスクリプトで、

// Copyright (C) 2000-2001 Michael Bazhutkin - Copyright (C) 2000 studio Klassika 
// www.geocites.com/bazhutkin 
// [email protected] 
// 
// Rivet (button) 1.0 
// Script File 
// MODIFY THIS AT YOUR OWN RISK 
// 
// Creation Date: April 13, 2001 
// 
// 
// Description: 
// Use "Rivet" to constrain locator to polygon or NURBS surfaces 
// Select two edges on polygon object 
// or select one point on NURBS surface and call rivet 
// Parent your rivets and buttons to this locator 

global proc string rivet () 
{ 

string $nameObject; 
string $namePOSI; 

string $parts[]; 
string $list[] = `filterExpand -sm 32`; 
int $size = size($list); 
if ($size > 0) 
{ 
    if ($size != 2) 
    { error("No two edges selected"); 
     return ""; 
    } 

    tokenize($list[0],".",$parts); 
    $nameObject = $parts[0]; 
    tokenize($list[0],"[]",$parts); 
    float $e1 = $parts[1]; 
    tokenize($list[1],"[]",$parts); 
    float $e2 = $parts[1]; 

    string $nameCFME1 = `createNode curveFromMeshEdge -n "rivetCurveFromMeshEdge1"`; 
     setAttr ".ihi" 1; 
     setAttr ".ei[0]" $e1; 
    string $nameCFME2 = `createNode curveFromMeshEdge -n "rivetCurveFromMeshEdge2"`; 
     setAttr ".ihi" 1; 
     setAttr ".ei[0]" $e2; 
    string $nameLoft = `createNode loft -n "rivetLoft1"`; 
     setAttr -s 2 ".ic"; 
     setAttr ".u" yes; 
     setAttr ".rsn" yes; 

    $namePOSI = `createNode pointOnSurfaceInfo -n "rivetPointOnSurfaceInfo1"`; 
     setAttr ".turnOnPercentage" 1; 
     setAttr ".parameterU" 0.5; 
     setAttr ".parameterV" 0.5; 

    connectAttr -f ($nameLoft + ".os") ($namePOSI + ".is"); 
    connectAttr ($nameCFME1 + ".oc") ($nameLoft + ".ic[0]"); 
    connectAttr ($nameCFME2 + ".oc") ($nameLoft + ".ic[1]"); 
    connectAttr ($nameObject + ".w") ($nameCFME1 + ".im"); 
    connectAttr ($nameObject + ".w") ($nameCFME2 + ".im"); 
} 
else 
{ $list = `filterExpand -sm 41`; 
    $size = size($list); 

    if ($size > 0) 
    { 
     if ($size != 1) 
     { error("No one point selected"); 
      return ""; 
     } 
     tokenize($list[0],".",$parts); 
     $nameObject = $parts[0]; 
     tokenize($list[0],"[]",$parts); 
     float $u = $parts[1]; 
     float $v = $parts[2]; 
     $namePOSI = `createNode pointOnSurfaceInfo -n "rivetPointOnSurfaceInfo1"`; 
       setAttr ".turnOnPercentage" 0; 
       setAttr ".parameterU" $u; 
       setAttr ".parameterV" $v; 
     connectAttr -f ($nameObject + ".ws") ($namePOSI + ".is"); 
    } 
    else 
    { error("No edges or point selected"); 
     return ""; 
    } 
} 

string $nameLocator = `createNode transform -n "rivet1"`; 
createNode locator -n ($nameLocator + "Shape") -p $nameLocator; 

string $nameAC = `createNode aimConstraint -p $nameLocator -n ($nameLocator + "_rivetAimConstraint1")`; 
    setAttr ".tg[0].tw" 1; 
    setAttr ".a" -type "double3" 0 1 0; 
    setAttr ".u" -type "double3" 0 0 1; 
    setAttr -k off ".v"; 
    setAttr -k off ".tx"; 
    setAttr -k off ".ty"; 
    setAttr -k off ".tz"; 
    setAttr -k off ".rx"; 
    setAttr -k off ".ry"; 
    setAttr -k off ".rz"; 
    setAttr -k off ".sx"; 
    setAttr -k off ".sy"; 
    setAttr -k off ".sz"; 

connectAttr ($namePOSI + ".position") ($nameLocator + ".translate"); 
connectAttr ($namePOSI + ".n") ($nameAC + ".tg[0].tt"); 
connectAttr ($namePOSI + ".tv") ($nameAC + ".wu"); 
connectAttr ($nameAC + ".crx") ($nameLocator + ".rx"); 
connectAttr ($nameAC + ".cry") ($nameLocator + ".ry"); 
connectAttr ($nameAC + ".crz") ($nameLocator + ".rz"); 

select -r $nameLocator; 
return ($nameLocator); 

} 

rivet; 
+0

おそらくxgenを試しますか? – SAF

+0

提案していただきありがとうございます。 x genを見ています。私は次の日かそれを使用して2つの問題を解決できるかどうか私は投稿することが確実になります – JKeil

答えて

1

代わりのリベットスクリプトを使用して内蔵の毛包を使用してください。彼らはそれらと一緒にすべての通常の正接情報を持っているので、UV値を介してアニメーション化することができ、制約付きオブジェクトをグループ化するためのノードを提供します。

createNode "follicle" 
// follicleShape1 // (u should capture and use this name, im being lazy below) 
connectAttr ($targetMeshShape+".outMesh") "follicleShape1.inputMesh"; 
connectAttr ($targetMeshShape+".worldMatrix") "follicleShape1.inputWorldMatrix"; 
connectAttr "follicleShape1.outTranslate" "follicle1.translate"; 
connectAttr "follicleShape1.outRotate" "follicle1.rotate"; 

//UV attributes control placement on surface 
setAttr "follicleShape1.parameterU" $goToU; 
setAttr "follicleShape1.parameterV" $goToV; 

をしかし、リベットスクリプトはまた、位置決めポイントのUV値を使用していますようにそのことについては、それはなります

あなたは表面上でそれらをペイントすることにより、コードを経由して、メニューコマンドを経由して卵胞を追加することができます。だからあなたのベースメッシュ上のUV値*をよく指向させると、単にUV値をアニメーション化するだけで、表面に沿ってリベットや卵胞を移動させるのは簡単です。

*つまり、[0.0,1.0]の範囲内のすべての頂点が重なり合っておらず、UV軸がそれぞれ流れの方向を向いていることを意味します。

関連する問題