铸造Nu中的三维纹理映射

2024-06-07 10:09:06 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个Nuke的Python脚本,用于创建摄影机的投影矩阵并将绘制笔划用作纹理贴图。其背后的想法是,通过当前选定的摄影机使用绘制笔划将查看器中所有对象的3D纹理投影到屏幕空间。在

方法.getGeometry()不工作。在

如何修复?在

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

paintPoints()

enter image description here


Tags: infortaskstrokeifobjectsptscamera
2条回答

下面是如何向节点添加自定义旋钮。更多详细信息和图片请参见Nuke Developer Guide。在

以下示例将控件添加到模糊节点:

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

对于滑块,.Array_Knob可以替换为.WH_Knob,对于复选框,.Boolean_Knob。在

由于铸造工程师不赞成使用geo旋钮及其.getGeometry()方法,我们应该改用.getGeometryNodes()方法。在

如果你需要更详细的信息,请写下你的问题。在

相关问题 更多 >

    热门问题