当前位置:   article > 正文

pyrender渲染实战【代码级】_pyrender 将mesh渲染成视频

pyrender 将mesh渲染成视频

 

参考文献Creating Cameras — pyrender 0.1.45 documentation 

渲染点 

  1. import pyrender
  2. import trimesh
  3. import numpy as np
  4. from scipy.io import loadmat
  5. unwrap_info_path = '/speed/speed/code/FFHQ-UV/topo_assets/unwrap_1024_info.mat'
  6. unwrap_info = loadmat(unwrap_info_path)
  7. mesh_path = '/speed/speed/code/FFHQ-UV/examples/fitting_examples/outputs/face08_sad/stage2_mesh_exp.obj'
  8. mesh = trimesh.load(mesh_path)
  9. # 转换网格为点云
  10. points = mesh.vertices
  11. # 创建一个全为白色的颜色数组
  12. colors = np.ones((len(points), 4)) * [0,0,0,1]
  13. # colors = np.random.uniform(size=mesh.vertices.shape)
  14. # colors = (colors * 256).astype(np.uint8)
  15. # 设置高亮顶点为红色
  16. # red_vert_idx = [1, 5, 10]
  17. # colors[red_vert_idx] = [1,0,0,1]
  18. colors[0:1000] = [255,0,0,1]
  19. # points[0:1000,0] = points[0:1000,0] + 0.5
  20. # 用pyrender.Mesh.from_points()函数创建一个带有顶点颜色的网格
  21. mesh = pyrender.Mesh.from_points(points, colors=colors)
  22. # 创建一个场景并添加网格
  23. scene = pyrender.Scene()
  24. scene.add(mesh)
  25. # 创建一个透视相机
  26. pc = pyrender.PerspectiveCamera(yfov=np.pi / 3.0, aspectRatio=1.414)
  27. # 创建一个正交相机
  28. oc = pyrender.OrthographicCamera(xmag=1.0, ymag=1.0)
  29. # 创建一个相机节点
  30. camera_node = pyrender.Node(camera=oc)
  31. # 把相机节点添加到场景中
  32. scene.add_node(camera_node)
  33. # 创建一个变换矩阵,用于设置相机的位置和方向
  34. # 这里我们把相机移动到(0, 0, 1)的位置,你可以根据你的需要修改这些值
  35. camera_pose = np.eye(4)
  36. camera_pose[:3, 3] = [0, 0, 3]
  37. # 设置相机的位置和方向
  38. scene.set_pose(camera_node, pose=camera_pose)
  39. light = pyrender.DirectionalLight(color=[1.0, 1.0, 1.0], intensity=500.0)
  40. light_pose = np.eye(4)
  41. light_pose[:3, 3] = [1, 1, 1]
  42. scene.add(light, pose=light_pose)
  43. # 用pyrender.Viewer()函数来可视化网格
  44. viewer = pyrender.Viewer(scene, use_raymond_lighting=True)
  45. viewer.render_lock = True
  46. viewer.run()

渲染mesh

  1. import pyrender
  2. import trimesh
  3. import numpy as np
  4. mesh_path = '*/stage2_mesh_exp.obj'
  5. tm = trimesh.load(mesh_path)
  6. # 创建一个红色的材质,RGBA值为[1, 0, 0, 1]
  7. material = pyrender.MetallicRoughnessMaterial(baseColorFactor=[0, 1, 0, 1])
  8. m = pyrender.Mesh.from_trimesh(tm, material=material)
  9. # 创建一个场景并添加网格
  10. scene = pyrender.Scene()
  11. scene.add(m)
  12. # 创建一个透视相机
  13. pc = pyrender.PerspectiveCamera(yfov=np.pi / 3.0, aspectRatio=1.414)
  14. # 创建一个正交相机
  15. oc = pyrender.OrthographicCamera(xmag=1.0, ymag=1.0)
  16. # 创建一个相机节点
  17. camera_node = pyrender.Node(camera=oc)
  18. # 把相机节点添加到场景中
  19. scene.add_node(camera_node)
  20. # 创建一个变换矩阵,用于设置相机的位置和方向
  21. # 这里我们把相机移动到(0, 0, 1)的位置,你可以根据你的需要修改这些值
  22. camera_pose = np.eye(4)
  23. camera_pose[:3, 3] = [0, 0, 3]
  24. # 设置相机的位置和方向
  25. scene.set_pose(camera_node, pose=camera_pose)
  26. # pl = pyrender.PointLight(color=[1.0, 1.0, 1.0], intensity=1000.0)
  27. light = pyrender.DirectionalLight(color=[1.0, 1.0, 1.0], intensity=500.0)
  28. # 创建一个变换矩阵,用于移动光源的位置
  29. # 这里我们把光源移动到(0.5, 0.5, 0.5)的位置,你可以根据你的需要修改这些值
  30. light_pose = np.eye(4)
  31. light_pose[:3, 3] = [1, 1, 1]
  32. scene.add(light, pose=light_pose)
  33. # 用pyrender.Viewer()函数来可视化网格
  34. viewer = pyrender.Viewer(scene, use_raymond_lighting=True)
  • 在你渲染任何东西之前,你需要把你的所有的光源、相机和网格放到一个场景中。 # 这句话的意思是,你要创建一个3D的可视化效果,你需要先定义你要渲染的内容,包括光源、相机和网格。光源是用来照亮网格的,相机是用来决定视角和投影的,网格是用来表示3D的物体的。你需要把这些内容放到一个场景中,场景是一个容器,用来存储和管理这些内容。
  • 场景对象会通过把这些基本元素插入到节点对象中,并把它们保存在一个有向无环图中,来跟踪它们的相对位置。 # 这句话的意思是,场景对象会为每一个光源、相机和网格创建一个节点对象,节点对象是一个包含了这些元素的属性和变换的对象。场景对象会把这些节点对象组织成一个有向无环图,有向无环图是一种数据结构,用来表示节点之间的父子关系和依赖关系。场景对象会根据这个有向无环图来计算每个节点的位置和方向,相对于场景的原点和坐标系。

pyrender.Viewer是一个用于显示和交互3D场景的类,它的初始化方法如下:

  • 如果传入的参数viewport_size为None,则将viewport_size设置为默认的(640, 480)。这是为了指定渲染窗口的大小。
  • 设置了一些属性,如_scene,_viewport_size,_render_lock,_is_active,_should_close,_run_in_thread等。这些属性用于存储场景,窗口,锁,状态,标志等信息。
  • 设置了一些默认的render_flags和viewer_flags,如果传入的参数render_flags和viewer_flags不为None,则使用传入的参数覆盖默认的render_flags和viewer_flags。这些标志用于控制渲染和交互的选项,如是否显示阴影,坐标轴,光源等。
  • 对registered_keys参数进行处理,将其与默认的render_flags和viewer_flags合并。这是为了允许用户自定义键盘的快捷键,如按R键重置视角,按S键保存截图等。
  • 如果运行平台是Mac OS,则将render_flags中的shadows设置为False,因为Mac OS存在一个阴影显示的bug。这是为了避免渲染错误。
  • 初始化_message_text,_ticks_till_fade,_message_opac等属性。这些属性用于显示和控制窗口底部的消息文本,如显示当前的帧率,相机位置等。
  • 创建_raymond_lights和_direct_light对象,用于阴影和直接光照的设置。这是为了提高场景的真实感和美观性。
  • 创建_axes对象,用于设置坐标轴。这是为了方便用户观察场景的方向和比例。
  • 初始化_camera_node,_prior_main_camera_node,_default_camera_pose,_default_persp_cam,_default_orth_cam,_trackball,_saved_frames等属性。这些属性用于存储和管理相机的节点,位置,姿态,类型,轨迹,截图等信息。
  • 根据场景中的主相机节点设置默认的相机位置和相机类型。这是为了尊重用户传入的场景中的相机设置,如果有的话。
  • 如果场景中的主相机节点不存在,则使用默认的透视相机和正交相机。这是为了提供两种不同的视角,用户可以根据需要切换。
  • 设置默认的相机位置和姿态。这是为了让用户一开始就能看到整个场景。
  • 根据viewer_flags中的use_perspective_cam决定使用透视相机还是正交相机,并将相机节点添加到场景中。这是为了让用户可以选择自己喜欢的相机类型。
  • 调用_reset_view方法重置相机视角。这是为了让用户可以随时恢复到默认的视角。
  • 创建_renderer对象,用于渲染图像。这是为了将场景转换为像素,并显示在窗口中。
  • 将_is_active属性设置为True,表示已经初始化完毕。这是为了让用户可以开始交互。
  • 如果设置为在新线程中运行,则创建一个新线程并启动应用程序;否则,在当前线程中启动应用程序。这是为了让用户可以选择是否在后台运行。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/118570
推荐阅读
相关标签
  

闽ICP备14008679号