编写USDView的插件


  • 网站研运

    在USD安装好之后,我们就要研究如何编写USDView的插件了,因为我们的二次开发功能都是在USD上做的,所以我们要理解USDView的各种机制才能够达到我们研发的目标。这里介绍一下如何编写USDView的插件。

    USDView是USD项目中比较重量级的应用了,基于Qt(PySide,PySide2)和PyOpenGL的应用。底层渲染依然是Hydra。这是一款渲染影视的渲染框架。后端可以接入OpenGL以及英特尔提出的Embree。它在设计的时候也预留了插件的功能。它在官网有详细的教程解释。

    插件本身

    这里我在Linux下演示如何载入USDView的插件。我写好了一个USDView的插件,名叫TutorialPlugin。它由三个插件组成的:

    tutorialPlugin
    ├── __init__.py
    ├── plugInfo.json
    └── printer.py
    

    写法和官网的一致。这里我贴出来吧。
    init.py

    from pxr import Tf
    from pxr.Usdviewq.plugin import PluginContainer
    
    import printer
    
    class TutorialPluginContainer(PluginContainer):
    
        def registerPlugins(self, plugRegistry, usdviewApi):
    
            self._printMessage = plugRegistry.registerCommandPlugin(
                "TutorialPluginContainer.printMessage",
                "Print Message",
                printer.printMessage )
    
        def configureView(self, plugRegistry, plugUIBuilder):
    
            tutMenu = plugUIBuilder.findOrCreateMenu("Tutorial")
            tutMenu.addItem(self._printMessage)
    
    Tf.Type.Define(TutorialPluginContainer)
    

    painter.py

    print("Imported printer!")
    
    
    def printMessage(usdviewApi):
        print("Hello, World!")
    

    plugInfo.py文件在Windows测试中,使用pluginfo.py也能被认识。果然Linux是大小写敏感的,Windows并不敏感。

    {
        "Plugins": [
            {
                "Type": "python",
                "Name": "tutorialPlugin",
                "Info": {
                    "Types": {
                        "tutorialPlugin.TutorialPluginContainer": {
                            "bases": ["pxr.Usdviewq.plugin.PluginContainer"],
                            "displayName": "Usdview Tutorial Plugin"
                        }
                    }
                }
            }
        ]
    }
    

    最后就是自己编写USDView调用的脚本了。因为是Linux,所以脚本是Shell脚本。内容大概是这样的:

    #!/bin/sh
    export LD_LIBRARY_PATH=/usr/local/USD/lib64:$LD_LIBRARY_PATH
    export PYTHONPATH=$PYTHONPATH:/usr/local/USD/lib/python
    
    # 这里非常重要,目的是设置usdView的环境变量,让usdView能够顺利地载入插件
    currentDir=$(cd `dirname $0`; pwd)
    export PXR_PLUGINPATH_NAME=$currentDir/tutorialPlugin
    
    /usr/local/USD/bin/usdview $currentDir/model/7_29_1.usda
    

    比较重要的是设置PXR_PLUGINPATH_NAME变量。为的是让USDView顺利地找到插件位置。大家也可以设置TF_DEBUGPLUG_SEARCH_INFO来检查当PXR_PLUGINPATH_NAME变量设置了以后,究竟有哪些插件得到了载入。
    给一个效果图:
    21d97c31-58ef-41ed-92c3-c27aff391dcc-image.png

    注意其中Tutorial菜单,这就是我们载入的插件。
    如果你对我分享的资产、插件或者是脚本感兴趣,可以加入我创建的小组,在文件分享里找到它。
    上海USD研究小组


Log in to reply
 

走马观花

最近的回复

  • 还是挺好看的,有趣儿!

    read more
  • 1479831431.jpg
    这个年由于新型冠状病毒疫情,我被迫在家里。我当时就想,怎样学习一下PBRT,因为这个毕竟是比较重要的内容。
    我于是获取到了著名的《Physically Based Rendering》资料。现在已经第三版了。看来发展得很快。
    第一个版本是2004年发布的,而第二个版本则是2010年发布的。在这些年,渲染技术已经发展得很快,并且
    得到了很多的拥趸。我曾经仔细地看了一遍这本书,发现还是不理解。这就非常头疼了。书中介绍的一些渲染
    的技巧,对于一个从0开始的初学者来说,的确是复杂了许多。但是他们也都是一点一点开始搭建起来的,我
    想,只要找到了正确的学习方法,还是能够顺利地达到他们那个阶段的。

    在寻找渲染技术的路上,我寻找很多的方法。
    知乎:如何阅读PBRT3?
    https://www.zhihu.com/question/309420057/answer/576382644

    后面找到一个稍微简单的《Ray Tracing in a Weekend》
    简书:【笔记】Ray Tracing in a Weekend
    https://www.jianshu.com/p/dc801008ee27?from=groupmessage&isappinstalled=0

    现在的阶段,可能会参考一下《Ray Tracing in a Weekend》结合简书的介绍来慢慢学习PBRT了。

    read more
  • @LemonHX 也有,随时可以构建的呢。

    read more
  • 诶 没有Linux吗??

    read more

关注我们

微博
QQ群