Skocz do zawartości

Rekomendowane odpowiedzi

Napisano

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?

  • Odpowiedzi 6
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

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.

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności