2016-10-20 2 views
0

カメラの投影行列を作成し、ペイント・ストロークをテクスチャ・マップとして使用するための、NukeのPythonスクリプトです。その背後にあるアイデアは、ビューア内のすべてのオブジェクトの3Dテクスチャを、現在選択されているカメラのペイントストロークを使ってスクリーンスペースに投影することです。ファウンドリー・ヌークの3Dテクスチャ・マッピング

私はCameraノードのユーザー]タブのプロパティでカスタムknobsを経由して投影テクスチャのラッピングWidthHeightを制御する必要があります。

どのようにプログラムで行うのですか?ここで

enter image description here

import nuke 
import nukescripts 

def paintPoints(): 

geoNode = nuke.activeViewer().node() 

camera = nuke.selectedNode() 
if not camera.Class() in ('Camera', 'Camera2'): 
    nuke.message('Por favor, seleccione un nodo de la cámara primera') 
    return 

geoKnob = geoNode['geo'] 
objects = geoKnob.getGeometry() 
if not objects: 
    nuke.message('No se han encontrado geometría en %s' % geoNode.name()) 

pts = [] 
for o in objects: 

    objTransform = o.transform() 
    for p in o.points(): 

     worldP = objTransform * nuke.math.Vector4(p.x, p.y, p.z, 1) 
     pts.append([worldP.x, worldP.y, worldP.z]) 

curvesKnob = nuke.createNode('RotoPaint')['curves'] 
task = nuke.ProgressTask('painting points') 

for i, pt in enumerate(pts): 

    if task.isCancelled(): 
     break 

    task.setMessage('painting point %s' % i) 
    stroke = nuke.rotopaint.Stroke(curvesKnob) 
    pos = nukescripts.snap3d.projectPoint(camera, pt) 
    ctrlPoint = nuke.rotopaint.AnimControlPoint(pos) 
    stroke.append(ctrlPoint) 
    curvesKnob.rootLayer.append(stroke) 
    task.setProgress(int(float(i)/len(pts)*100)) 

enter image description here

答えて

1

あなたは、ノードにカスタムノブを追加する方法です。 Nuke Developer Guideの詳細と画像。

次の例では、ブラーノードにコントロールを追加します

b = nuke.nodes.Blur() 
k = nuke.Array_Knob("myctrl", "My Control") 
b.addKnob(k) 

.Array_Knobチェックボックスのためにスライダの.WH_Knob又は.Boolean_Knobと置き換えることができます。

+0

私はNuke自身の新しい開発者です。したがって、これらのカスタムノブをどのように接続してノードの設定に影響を与えるのか分かりません。私がもっと知っていると更新されます。 – Matt

+0

私はノブを追加する方法を知っています、ありがとう。私が本当に知る必要があるのは、これらのノブを使ってテクスチャのラッピングをコントロールする方法です。 – andy

+0

私に見せるためにその核ファイルをアップロードできますか?既存のノブの値を調整するのは簡単です。カスタムノブで他のノブの値を調整したい場合は、式を使用する必要があります。 – Matt

関連する問題