Blender 모듈 빌드 및 설치(Windows)

14668 단어 파이썬블렌더
  • 2019/8 Blender-2.8은 EEVEE가 기본이므로 bpy.ops.render.render()가 떨어지는 건
  • 2019/7 기존 기사와 제목이 쓰여 있었기 때문에 변경
  • 2019/7 재 작성
  • bpy.pyd (GUI가없는 python 모듈로 blender) 빌드 및 설치 방법.

    환경
  • Windows-10(64bit)
  • Python-3.7(64bit)
  • Blender-2.80

  • 준비


  • visualstudio2019
  • git
  • svn (scoop install sliksvn 등)

  • 보통 블렌더 빌드



    blender 빌드의 세세한 단계는
  • [Blender] 소스 코드에서 Blender 본체를 빌드합니다.

  • 를 참조하십시오.

    모듈로 블렌더 빌드



    위의 기사까지 할 수 있었기 때문에 거기에서 변경하는 부분을 설명합니다.

    CMake에서 옵션을 다음과 같이 변경
  • WITH_PYTHON_INSTALL=OFF
  • WITH_PYTHON_MODULE=ON

  • 빌드가 작동하지 않는 원인이 되는 라이브러리를 제거합니다.
  • WITH_AUDASPACE=OFF
  • WITH_OPENCOLLADA=OFF(링크 오류 xml.lib dllmain libcmt.lib)

  • 변경하고 configure하여 generate하고 cmake install 대상을 실행합니다.
    빌드 만 있으면 (dll 복사 및 2.80 폴더 생성이 이루어지지 않습니다)

    빌드 할 수있는 bpy.pyd와 필요한 파일을 Python3에 설치하십시오.



    아래 파일을 빌드 폴더에서 python37 폴더로 복사합니다.
  • PYTHON_DIR/lib/site-packages
  • blender.pth

  • PYTHON_DIR/lib/site-packages/blender
  • bpy.pyd (본체)
  • dll
  • pdb (디버그 용)

  • PYTHON_DIR/2.80
  • (blender를 실행할 때 사용되는 스크립트 등)


  • 단계를 파이썬 스크립트로 만들었습니다.

    install.py
    import os
    import pathlib
    import glob
    import shutil
    
    PY_DIR = pathlib.Path('C:/Python37')
    BL_DIR = PY_DIR / 'Lib/site-packages/blender'
    
    if __name__ == '__main__':
        os.chdir('blender_build/bin/Release') # install.py実行パスからの相対パス
        #os.chdir('blender_build/bin/RelWithDebInfo') # 実行パスからの相対パス
    
        with (PY_DIR / 'Lib/site-packages/blender.pth').open('w') as w:
            w.write("blender")
    
        BL_DIR.mkdir(parents=True, exist_ok=True)
    
        shutil.copy('bpy.pyd', BL_DIR)
        for f in glob.glob('*.dll'):
            print(f'{f} => {BL_DIR / f}')
            shutil.copy(f, BL_DIR / f)
        for f in glob.glob('*.pdb'):
            print(f'{f} => {BL_DIR / f}')
            shutil.copy(f, BL_DIR / f)
        python37 = BL_DIR / 'python37.dll'
        if python37.exists():
            python37.unlink()
    
        dst = PY_DIR / '2.80'
        if dst.exists():
            print(f'remove {dst}')
            shutil.rmtree(dst)
        print(f'copy {dst}')
        shutil.copytree('2.80', dst)
    

    실행하다


    import bpy
    print(bpy)
    # <module 'bpy' from 'PYTHON_DIR\\lib\\site-packages\\blender\\bpy.pyd'>
    

    이것이 파이썬에서 실행될 수 있다면 움직일 것이라고 생각합니다.

    종료 시,
    Error: Not freed memory blocks: 8, total unfreed memory 0.010223 MB
    하지만 나오는 곳은 신경쓰지 않아도 되는 것이 아닌가.

    사용법



    주로, 배치 실행이나 addon 개발 용도가 된다고 생각한다.
  • htps : // / cs. b. r. 오 rg/아피/마s테 r/인후아_쿠이 cks한 rt. HTML

  • 렌더링하다



    CYCLES로 설정합니다.
    import bpy
    bpy.context.scene.render.engine = 'CYCLES' # デフォルトがEEVEEでOpenGLが無いので落ちる
    bpy.ops.render.render()
    bpy.data.images['Render Result'].save_render(filepath='image.png')
    

    blend 파일을 열고 장면에 액세스


    import bpy
    import pathlib
    
    here = pathlib.Path(__file__).absolute().parent
    monkey = here / 'monkey.blend'
    
    # open
    bpy.ops.wm.open_mainfile(filepath=str(monkey))
    
    # object
    for o in bpy.context.scene.objects:
        print(o)
    
    <bpy_struct, Object("Suzanne")>
    blend 파일을 열어 장면에 액세스 할 수있었습니다.

    memo
    # contextからobjectを得る
    o = bpy.context.scene.objects[0]:
    
    # objectからデータブロックを得る
    data= o.data
    print(isinstance(data, bpy.types.Mesh))
    
  • htps : // / cs. b. r. 오 rg/아피/마s r/bpy. type s. 메 sh. HTML

  • VSCode에서 인텔리센스를 사용하도록 설정





    blender-2.80 용으로 생성해 보자.
    빨리 오류 회피.
    --- a/python_api/pypredef_gen.py
    +++ b/python_api/pypredef_gen.py
    @@ -999,7 +999,7 @@ def bpy2predef(BASEPATH, title):
         structs, funcs, ops, props = rna_info.BuildRNAInfo()
         #open the file:
         filepath = os.path.join(BASEPATH, "bpy.py")
    -    file = open(filepath, "w")
    +    file = open(filepath, "w", encoding='utf-8')
         fw = file.write
         #Start the file:
         definition = doc2definition(title,"") #skip the leading spaces at the first line...
    @@ -1093,9 +1093,9 @@ def rna2predef(BASEPATH):
             import bgl as module
             pymodule2predef(BASEPATH, "bgl", module, "Open GL functions (bgl)")
    
    -    if "aud" in INCLUDE_MODULES:
    -        import aud as module
    -        pymodule2predef(BASEPATH, "aud", module, "Audio System (aud)")
    +    # if "aud" in INCLUDE_MODULES:
    +    #     import aud as module
    +    #     pymodule2predef(BASEPATH, "aud", module, "Audio System (aud)")
    
         if "bmesh" in INCLUDE_MODULES:
             import bmesh as module
    

    나온 폴더를 vscode의 사용자 설정에 추가.
    "python.autoComplete.extraPaths": ["path_to_pypredef"]
    함수의 인수에 형 주석을 붙여 blender 의 형태의 인텔리센스가 나오게 되었다.



    Debug한다(C++쪽을)


  • sln을 RelWithDebugInfo로 빌드합니다.
  • 설치
  • 적절한 프로젝트 디버깅 설정 F5



  • 작업 디렉토리는 hello.py 를 배치한 폴더입니다.

    GHOST_C-api.cpp
    // line:610
    GHOST_TSuccess GHOST_ActivateOpenGLContext(GHOST_ContextHandle contexthandle)
    {
      GHOST_IContext *context = (GHOST_IContext *)contexthandle; // これが nullptr
    
      return context->activateDrawingContext();
    }
    

    알 때도 있다.

    좋은 웹페이지 즐겨찾기