0

カメラの投影マトリックスを作成し、ペイント ストロークをテクスチャ マップとして使用するための Nuke の Python スクリプトを次に示します。その背後にある考え方は、ペイント ストロークを使用して、現在選択されているカメラを介して Viewer 内のすべてのオブジェクトの 3D テクスチャをスクリーン スペースに投影することです。

メソッド.getGeometry()が機能していません。

修正方法は?

ここに画像の説明を入力

コードは次のとおりです。

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))

paintPoints()

ここに画像の説明を入力

4

2 に答える 2

-1

ノードにカスタム ノブを追加する方法は次のとおりです。詳細と画像はNuke 開発者ガイドにあります。

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

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

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

于 2016-10-24T19:29:02.717 に答える