カメラの投影マトリックスを作成し、ペイント ストロークをテクスチャ マップとして使用するための 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()