Forum

Author Topic: captureModelView  (Read 2551 times)

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
captureModelView
« on: August 13, 2019, 04:04:10 PM »
Добрый день! Пытаюсь через скрипт сохранить модель в виде картинки с помощью
Code: [Select]
# Model Image
    viewpoint = Metashape.app.viewpoint
    cx = viewpoint.width
    cy = viewpoint.height
   
    print(cx)
    print(cy)

    capture = Metashape.app.captureModelView(width = cx, height = cy, transparent = (True), hide_items = (True), source = Metashape.DataSource.ModelData, mode = Metashape.ModelViewMode.ShadedModelView)
    print(capture.height)
    capture.save(main_path + "model_preview.png")

Если выполнять скрипт в приложении, то все работает. А если из консоли, то ошибка:
Quote
RuntimeError: Can't save image: /task_files/fd6faba4-bda8-11e9-8ccc-606dc717741f/model_preview.png
Вот что в capture:
Quote
<Image '0x0x0'>

Пробовал менять и ширину и длину, результата нет. Подскажите, в чем дело?
Спасибо
« Last Edit: August 13, 2019, 04:13:22 PM by e1sep0 »

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14847
    • View Profile
Re: captureModelView
« Reply #1 on: August 13, 2019, 04:43:24 PM »
Добрый день,

captureModelView работает только при наличии OpenGL интерфейса. При запуске скрипта из командной строки данная функция не сможет отработать корректно.

В качестве альтернативного решения можно попробовать "отрендерить" модель, используя метод chunk.model.renderImage(), которому нужно передать 4х4 матрицу виртуальной камеры и калибровку.

Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: captureModelView
« Reply #2 on: August 13, 2019, 07:05:33 PM »
Спасибо, я пробовал юзать renderImage, но у меня странные результаты получаются, то центр слетает, то поворот сделать не получается.
Подскажите, как правильно повернуть модель с помощью transform, но не очень понял, какие параметры что определяют:

Code: [Select]
point = chunk.region.center + Metashape.Vector([0,0, chunk.region.size.z * 2])
    T = Metashape.Matrix([[1,0,0, point.x], [0,-1,0, point.y], [0,0,-1, point.z], [0,0,0,1]])

    calibration = chunk.sensors[0].calibration
    calibration.f = 5 / 0.006
    calibration.cx = 0
    calibration.cy = 0
    calibration.b1 = 0
    calibration.b2 = 0   
    calibration.k1 = 0
    calibration.k2 = 0
    calibration.k3 = 0
    calibration.k4 = 0
    calibration.p1 = 0
    calibration.p2 = 0
    calibration.width = 4000
    calibration.height = 6000
    calibration.type = Metashape.Sensor.Type.Frame

    render = chunk.model.renderImage(T, calibration)

Получается ровно под прямым углом, а хотелось бы чуть под углом для видимости, что это 3D =) (Например так:
https://i.imgur.com/CfTB6pq.png )
Спасибо
« Last Edit: August 13, 2019, 07:29:41 PM by e1sep0 »

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: captureModelView
« Reply #3 on: August 14, 2019, 11:01:14 AM »
Она у меня получается плоская почему то (https://i.imgur.com/Cr5MxEX.png):
Code: [Select]
bbox_rot =  50.58462719482992  # deg
point = chunk.region.center + Metashape.Vector([0,0, chunk.region.size.z * 2])
SinRotZ = math.sin(math.radians(bbox_rot))
CosRotZ = math.cos(math.radians(bbox_rot))
T = Metashape.Matrix([[CosRotZ, SinRotZ, 0, point.x], [SinRotZ, CosRotZ, 0, point.y], [0, 0.5, -1, point.z], [0, 0, 0, 1]])

Подскажите, какой параметр править для отображения 3D модели как на примере выше. Спасибо

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: captureModelView
« Reply #4 on: August 14, 2019, 12:44:59 PM »
Попробовал повернуть на 30 градусов по оси z, но результат пустой:
Code: [Select]
R = Metashape.Matrix( [[0.87, -0.5, 0], [0.5, 0.87, 0], [0, 0, 1]] ).t()
    T = T.Rotation(R)

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14847
    • View Profile
Re: captureModelView
« Reply #5 on: August 14, 2019, 05:55:48 PM »
Попробуйте для примера следующий скрипт:

Code: [Select]
import Metashape

chunk = Metashape.app.document.chunk
T = chunk.crs.localframe(chunk.transform.translation) * chunk.transform.matrix

location = chunk.region.center + chunk.region.rot * chunk.region.size
direction = (chunk.region.center - location).normalized()
vertical = T.inv().mulv(Metashape.Vector([0, 0, 1]))
horizontal = Metashape.Vector.cross(direction, vertical).normalized()
vertical = Metashape.Vector.cross(direction, horizontal).normalized()
R = Metashape.Matrix([horizontal, vertical, direction])

cameraT = Metashape.Matrix().Translation(location) * Metashape.Matrix().Rotation(R.t())

image = chunk.model.renderImage(cameraT, chunk.sensors[0].calibration)
image.save("D:/render.jpg")

Позиция синтетической камеры находится на векторе, идущем из центра рабочей области через её угол.
Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: captureModelView
« Reply #6 on: August 14, 2019, 06:46:48 PM »
Это идеальное решение! Спасибо, Алексей!
Но для одной модели вышло так:
« Last Edit: August 14, 2019, 06:49:45 PM by e1sep0 »

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14847
    • View Profile
Re: captureModelView
« Reply #7 on: August 14, 2019, 06:57:30 PM »
Может быть, неверная привязка для модели или она вообще отсутствует? Для других проектов этот подход корректно работает?

Подразумевалось, что проект корректно привязан в географической/спроецированной СК.
Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: captureModelView
« Reply #8 on: August 14, 2019, 07:01:12 PM »
Да, все отлично! Спасибо еще раз!