"""Вернуть перспективу вьюпорта на обзор ячейки. Сдвинута оказалась только служебная камера /OmniverseKit_Persp - она уехала в (-8.96, -5.49, -6.70), то есть ПОД пол, и смотрела снизу. Шесть стереокамер стенда в /RigRS не тронуты (0.0 мм, 0.00°), их править нечего - а именно они участвуют в прогонах. Перспектива вьюпорта в файл не пишется и на физику с замерами не влияет: это только то, что видит человек. Поэтому здесь она ставится по фактическому габариту ячейки, а не по запомненному числу - сцена менялась, и старая точка могла бы снова смотреть мимо. """ import sys REPO = "/home/dasha/robozon-sorter" if REPO not in sys.path: sys.path.insert(0, REPO) import omni.usd import isaacsim.core.experimental.utils.app as app_utils from isaacsim.core.rendering_manager import ViewportManager from pxr import Usd, UsdGeom, Gf stage = omni.usd.get_context().get_stage() bb = UsdGeom.BBoxCache(Usd.TimeCode.Default(), [UsdGeom.Tokens.default_, UsdGeom.Tokens.render]) # габарит по дорожкам и плугу - то, на что осмысленно смотреть lo = Gf.Vec3d(1e9, 1e9, 1e9); hi = Gf.Vec3d(-1e9, -1e9, -1e9) for p in stage.Traverse(): n = p.GetName() if not (n.startswith("ConveyorTrack") or n == "Diverters"): continue r = bb.ComputeWorldBound(p).ComputeAlignedRange() a, b = r.GetMin(), r.GetMax() for i in range(3): lo[i] = min(lo[i], a[i]); hi[i] = max(hi[i], b[i]) ctr = Gf.Vec3d((lo[0]+hi[0])/2, (lo[1]+hi[1])/2, (lo[2]+hi[2])/2) span = max(hi[0]-lo[0], hi[1]-lo[1]) print(f"габарит ячейки: x {lo[0]:+.2f}..{hi[0]:+.2f} y {lo[1]:+.2f}..{hi[1]:+.2f} " f"z {lo[2]:+.2f}..{hi[2]:+.2f}") print(f"центр ({ctr[0]:+.2f}, {ctr[1]:+.2f}, {ctr[2]:+.2f}), протяжённость {span:.1f} м") # три четверти сверху-сбоку: вся линия в кадре, плуг и пушер видны не с торца eye = Gf.Vec3d(ctr[0] + span * 0.45, ctr[1] - span * 0.65, ctr[2] + span * 0.55) tgt = Gf.Vec3d(ctr[0], ctr[1], 1.60) ViewportManager.set_camera_view("/OmniverseKit_Persp", eye=[eye[0], eye[1], eye[2]], target=[tgt[0], tgt[1], tgt[2]]) await app_utils.update_app_async(steps=30) cache = UsdGeom.XformCache() t = cache.GetLocalToWorldTransform(stage.GetPrimAtPath("/OmniverseKit_Persp")).ExtractTranslation() print(f"\nперспектива возвращена: ({t[0]:+.2f}, {t[1]:+.2f}, {t[2]:+.2f}) " f"-> смотрит на ({tgt[0]:+.2f}, {tgt[1]:+.2f}, {tgt[2]:+.2f})") print("камеры стенда /RigRS не трогались")