2017-05-30 22 views
0

こんにちはフェロースタックオーバーフローのメンバー!まず、この質問を読んでいただきありがとうございます。3ds Maxでオブジェクト名を選択するためのMaxScript

私はMaxscriptを学んでいますので、すばやく洗練された顔リグをすることができます。 私のスクリプトは99%完了です。唯一の問題は、今のところ、スクリプトはリグレードされるターゲットオブジェクトの名前をコード化していることです(コードでは「MYOBJECT」)。 MaxScriptでオブジェクトの名前を右下に置くのではなく、対象のオブジェクトをクリックするようにダイアログウィンドウを開く関数を作成したいと思います。そして、ユーザーがターゲットオブジェクトをクリックした後、自分のコードすでに実行できた作業を行いますが、ハードコードされた名前の代わりに選択されたオブジェクト名を使用します。

私のコードは以下のとおりです。ご助力ありがとうございます!

/* 
Script wrote by RDlady: 
This script was created following the example from 
Paul Neale's tutorial class: https://youtu.be/SKomaUCHAko 
Comments and little modifications added by RDlady. 

*/ 

struct facialBoneHelpers (

targetNode=undefined, 
controlSize=10, 

fn makeControl hit= (

    --If the user clicks somewhere, do the code bellow 
    if hit!=undefined do (
     print hit.pos 
     print hit.dir 

     --Creates the first helper, the root one (red) 
     pt=point box:true cross:false axisTripod:true centerMarker:false size:(controlSize/2) wireColor:red name:(uniqueName "PT_ControlRoot) 
     Zv=hit.Dir 
     Yv=[0,0,1] 
     Xv=normalize(cross Yv Zv) 
     Yv=normalize(cross Zv Xv) 
     pt.transform=matrix3 Xv Yv Zv hit.pos 

     --Creates the second helper (green, bigger then the first), which will have the first one as parent 
     pt2=point box:true cross:false axisTripod:true centerMarker:false size:(controlSize) wireColor:green name:(uniqueName "PT_ControlPos") 
     pt2.transform=pt.transform 
     pt2.parent=pt 

     --Creates an outer circle connector (blue) that will have the second helper as parent 
     cnt=circle radius:(controlSize) wireColor:blue name:(uniqueName "CNT_Face") 
     cnt.transform=pt.transform 
     cnt.parent=pt2 

     --Converts the circle to a spline, and moves the gizmo out a little bit, so it can be handled more easily 
     --First, creates a xForm modifier 
     xf=xForm() 
     --adds the created modifier to the circle connector 
     addModifier cnt xf 
     --defines the Z position of the gizmo of the modifier as the control size, moving it outside 
     xf.gizmo.pos.z=controlSize 
     --Finally converts the circle to a spline 
     convertToSplineShape cnt 

    ) 



), 

fun runTool= (

    tool mouseHit (
     on mousePoint clickNo do (
      if clickNo>1 do (

       r=(mapScreenToWorldRay mouse.pos) 
       hit=intersectRay targetNode r 
       makeControl hit 

       --Creates a mirror helper 
       if queryBox "Do tou want to make a mirror control" title:"Set mirror" do (
        oppositePos = targetNode(ray(r.pos*[-1,1,1])(r.dir*[-1,1,1])) 
        hit=intersectRay oppositePos 
        makeControl hit 

       ) 


      ) 


     ) 

    ) 
    startTool mouseHit 
) 


) 
facialBoneHelpers=facialBoneHelpers() 
facialBoneHelpers.targetNode=MYOBJECT 
facialBoneHelpers.runTool() 

答えて

1

UIをお持ちの場合は、​​を使用して、実行前にノードを保持しているかどうかをテストしてください。それ以外の場合は、pickObjectを使用してオブジェクトを取得します。返された結果がundefinedの場合はエラーメッセージが表示されます(お勧めします)。またはwhile result == undefinedループ内でpickObject呼び出しをラップします。

+0

ありがとうございました! pickObjectは私の問題を解決しました。 – RDlady

関連する問題