不带MPxLocator插件的OpenGL Python Maya API绘图

不带MPxLocator插件的OpenGL Python Maya API绘图,python,api,opengl,maya,Python,Api,Opengl,Maya,我正在尝试在maya python api中执行以下简单操作: import maya.OpenMayaUI as OpenMayaUI import maya.OpenMayaRender as OpenMayaRender #Get active camera. view = OpenMayaUI.M3dView.active3dView() glFT = OpenMayaRender.MHardwareRenderer.theRenderer().glFunctionTable()

我正在尝试在maya python api中执行以下简单操作:

import maya.OpenMayaUI as OpenMayaUI
import maya.OpenMayaRender as OpenMayaRender

#Get active camera.
view = OpenMayaUI.M3dView.active3dView()

glFT = OpenMayaRender.MHardwareRenderer.theRenderer().glFunctionTable()

view.beginGL()

glFT.glBegin(OpenMayaRender.MGL_LINES)
glFT.glVertex3f(0.0, 0.0, 0.0)
glFT.glVertex3f(0.0, 1.0, 0.0)
glFT.glEnd()

view.endGL()

我只想在maya中绘制一条线,而不必构建MPxLocator或其他什么工具来显示它。

因此我发现我需要实际向视图添加回调以使其绘制:

import maya.OpenMayaUI as OpenMayaUI
import maya.OpenMayaRender as OpenMayaRender
import maya.cmds as cmds


def setCamera(*args):
    view = OpenMayaUI.M3dView.active3dView()

    # Get a renderer, then a function table
    glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
    glFT = glRenderer.glFunctionTable()

    view.beginGL()

    glFT.glPushAttrib(OpenMayaRender.MGL_LINE_BIT)
    glFT.glLineWidth(5.0)

    glFT.glBegin(OpenMayaRender.MGL_LINES)

    glFT.glColor3f(1.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(3.0, 0.0, 0.0)

    glFT.glColor3f(0.0, 1.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 3.0, 0.0)

    glFT.glColor3f(0.0, 0.0, 1.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 3.0)

    glFT.glEnd()

    glFT.glPopAttrib()

    view.endGL()

if __name__ == '__main__':

    panel = cmds.getPanel(withFocus=True)
    callBack = OpenMayaUI.MUiMessage.add3dViewPostRenderMsgCallback(
        panel, setCamera)

    view = OpenMayaUI.M3dView.active3dView()
    view.refresh(True, True)
然后要删除回调,请执行以下操作:

OpenMayaUI.MUiMessage.removeCallback(callBack)
view = OpenMayaUI.M3dView.active3dView()
view.refresh(True, True)

希望这对别人有帮助

因此我发现我需要向视图中添加回调以使其绘制:

import maya.OpenMayaUI as OpenMayaUI
import maya.OpenMayaRender as OpenMayaRender
import maya.cmds as cmds


def setCamera(*args):
    view = OpenMayaUI.M3dView.active3dView()

    # Get a renderer, then a function table
    glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
    glFT = glRenderer.glFunctionTable()

    view.beginGL()

    glFT.glPushAttrib(OpenMayaRender.MGL_LINE_BIT)
    glFT.glLineWidth(5.0)

    glFT.glBegin(OpenMayaRender.MGL_LINES)

    glFT.glColor3f(1.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(3.0, 0.0, 0.0)

    glFT.glColor3f(0.0, 1.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 3.0, 0.0)

    glFT.glColor3f(0.0, 0.0, 1.0)
    glFT.glVertex3f(0.0, 0.0, 0.0)
    glFT.glVertex3f(0.0, 0.0, 3.0)

    glFT.glEnd()

    glFT.glPopAttrib()

    view.endGL()

if __name__ == '__main__':

    panel = cmds.getPanel(withFocus=True)
    callBack = OpenMayaUI.MUiMessage.add3dViewPostRenderMsgCallback(
        panel, setCamera)

    view = OpenMayaUI.M3dView.active3dView()
    view.refresh(True, True)
然后要删除回调,请执行以下操作:

OpenMayaUI.MUiMessage.removeCallback(callBack)
view = OpenMayaUI.M3dView.active3dView()
view.refresh(True, True)

希望这对别人有帮助

这很有趣。你如何/在哪里应用它。什么目的。如果我知道的话?我在用它做测试。我也考虑过使用它来绘制简单的gl图形,比如矩阵和法线,但从未决定使用它。这就是我的兴趣来源。对于未来的读者-这在传统maya视口中非常有用-但是如果您使用“viewport 2.0”或更高版本,它就不起作用了,这很有趣。你如何/在哪里应用它。什么目的。如果我知道的话?我在用它做测试。我也考虑过使用它来绘制简单的gl图形,比如矩阵和法线,但从未决定使用它。这就是我的兴趣来源。对于未来的读者-这在旧版maya视口中非常有效-但是如果使用“viewport 2.0”或更高版本,它不会绘制