Kroopson Napisano 8 Styczeń 2016 Napisano 8 Styczeń 2016 Siema. Mam grubaśny problem z klasą M3dView i nie wiem o co chodzi. Tworzę sobie okienko do robienia screenshota modelu tak: def get_preview_window(): win = cmds.window() layout = cmds.paneLayout() model_editor = cmds.modelPanel() cmds.setParent("..") cmds.setParent("..") cmds.showWindow(win) get_preview_window() Teraz grabuję QImage tak: import ctypes import maya.OpenMaya as om import maya.OpenMayaUI as omui from PySide.QtGui import QImage view = omui.M3dView.active3dView() width = view.portWidth() height = view.portHeight() img = om.MImage() view.readColorBuffer(img, False) ptr = ctypes.cast(img.pixels().__long__(), ctypes.POINTER(ctypes.c_char)) ptrAsStr = ctypes.string_at(ptr, width * height * 4) qimg = QImage(ptrAsStr, width, height, QImage.Format_ARGB32) qimg = qimg.mirrored(horizontal=False, vertical=True) qimg.save('C:/screenshot.png') Problem w tym że grabuje mi kawałek głównego viewportu (o wielkości tego okna utworzonego wcześniej) zamiast zawartości modelEditor'a stworzonego przez funkcję get_preview_window(). Okienko jest kliknięte jako aktywne itp. Nawet nazwa wyciągnięta ze wskaźnika przez OpenMayaUI.MQtUtil.fullName(long(view.widget())) się zgadza ale output się nie zgadza :/ WTF :/ może to ktoś sprawdzić na innej majce niż 2016?
praetorian Napisano 8 Styczeń 2016 Napisano 8 Styczeń 2016 Viewport legacy czy 2.0? Jeden i drugi sprawdziłem.
Kroopson Napisano 8 Styczeń 2016 Autor Napisano 8 Styczeń 2016 Ok - dzięki wielkie - poszedł bug report do Autodesku :)
Kroopson Napisano 14 Styczeń 2016 Autor Napisano 14 Styczeń 2016 HUHU! Dobra - udało się rozwiązać!!!! Problem polegał na tym, że od Majki 2016 defaultowy bit depth viewportu jest 16bit (kFloat), a defaultowy MImage jest 8bit (kByte). Kiedy readColorBuffer dostaje MImage o nie tej głębokości bitów wypełnia go jakimś śmieciem, który jakimś cudem zawiera obraz z nieaktywnego aktualnie viewportu (MImage.create() robi to samo, dlatego na to wpadłem). Kod poniżej działa, ale myślę że trzeba będzie w końcu przerzucić się na używanie klas MRenderer i MTexture. #------------------------------ # grab active Model editor view to QImage #------------------------------ import ctypes import maya.OpenMaya as om import maya.OpenMayaUI as omui from PySide.QtGui import QImage, QWidget from shiboken import wrapInstance import uuid view = omui.M3dView.active3dView() model_editor_qwidget = wrapInstance(long(view.widget()), QWidget) view.refresh(True, True) img = om.MImage() if view.getRendererName() == view.kViewport2Renderer: print "Saving float point viewport" img.create(view.portWidth(), view.portHeight(), 4, om.MImage.kFloat) view.readColorBuffer(img) img.convertPixelFormat(om.MImage.kByte ) else: print "Saving fixed point viewport" view.readColorBuffer(img) pixels_size = view.portWidth() * view.portHeight() * bg_image.depth() pixels_pointer = bg_image.pixels() # --------------------------------------- convert the frame buffer to str pp = uuid.ctypes.cast(pixels_pointer.__long__(), uuid.ctypes.POINTER(uuid.ctypes.c_char)) pixels_string = uuid.ctypes.string_at(pp, pixels_size) # ------------------------------------------ make the QImage from the str image = QImage(pixels_string, width, height, QImage.Format_RGB32).mirrored(horizontal=False, vertical=True) image.save("c:/qimage.png", "PNG") PS. Jakby nie support Autodesku to bym się w życiu nie domyślił o co chodzi.
Kroopson Napisano 14 Styczeń 2016 Autor Napisano 14 Styczeń 2016 (edytowane) No tak - działa ale tylko dopóki nie poruszę viewportu. Potem przestaje... damn! Edytowane 14 Styczeń 2016 przez Kroopson ortografia Panie
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się