pyrender渲染实战【代码级】

 

参考文献:Creating Cameras — pyrender 0.1.45 documentation 

渲染点 

import pyrender
import trimesh
import numpy as np
from scipy.io import loadmat


unwrap_info_path = '/speed/speed/code/FFHQ-UV/topo_assets/unwrap_1024_info.mat'
unwrap_info = loadmat(unwrap_info_path)


mesh_path = '/speed/speed/code/FFHQ-UV/examples/fitting_examples/outputs/face08_sad/stage2_mesh_exp.obj'
mesh = trimesh.load(mesh_path)
# 转换网格为点云
points = mesh.vertices

# 创建一个全为白色的颜色数组
colors = np.ones((len(points), 4)) * [0,0,0,1]
# colors = np.random.uniform(size=mesh.vertices.shape)
# colors = (colors * 256).astype(np.uint8)
# 设置高亮顶点为红色
# red_vert_idx = [1, 5, 10]
# colors[red_vert_idx] = [1,0,0,1]
colors[0:1000] = [255,0,0,1]
# points[0:1000,0] = points[0:1000,0] + 0.5
# 用pyrender.Mesh.from_points()函数创建一个带有顶点颜色的网格
mesh = pyrender.Mesh.from_points(points, colors=colors)

# 创建一个场景并添加网格
scene = pyrender.Scene()
scene.add(mesh)

# 创建一个透视相机
pc = pyrender.PerspectiveCamera(yfov=np.pi / 3.0, aspectRatio=1.414)
# 创建一个正交相机
oc = pyrender.OrthographicCamera(xmag=1.0, ymag=1.0)
# 创建一个相机节点
camera_node = pyrender.Node(camera=oc)
# 把相机节点添加到场景中
scene.add_node(camera_node)
# 创建一个变换矩阵,用于设置相机的位置和方向
# 这里我们把相机移动到(0, 0, 1)的位置,你可以根据你的需要修改这些值
camera_pose = np.eye(4)
camera_pose[:3, 3] = [0, 0, 3]
# 设置相机的位置和方向
scene.set_pose(camera_node, pose=camera_pose)

light = pyrender.DirectionalLight(color=[1.0, 1.0, 1.0], intensity=500.0)
light_pose = np.eye(4)
light_pose[:3, 3] = [1, 1, 1]
scene.add(light, pose=light_pose)

# 用pyrender.Viewer()函数来可视化网格
viewer = pyrender.Viewer(scene, use_raymond_lighting=True)
viewer.render_lock = True
viewer.run()

渲染mesh

import pyrender
import trimesh
import numpy as np

mesh_path = '*/stage2_mesh_exp.obj'
tm = trimesh.load(mesh_path)
# 创建一个红色的材质,RGBA值为[1, 0, 0, 1]
material = pyrender.MetallicRoughnessMaterial(baseColorFactor=[0, 1, 0, 1])
m = pyrender.Mesh.from_trimesh(tm, material=material)

# 创建一个场景并添加网格
scene = pyrender.Scene()
scene.add(m)

# 创建一个透视相机
pc = pyrender.PerspectiveCamera(yfov=np.pi / 3.0, aspectRatio=1.414)
# 创建一个正交相机
oc = pyrender.OrthographicCamera(xmag=1.0, ymag=1.0)
# 创建一个相机节点
camera_node = pyrender.Node(camera=oc)
# 把相机节点添加到场景中
scene.add_node(camera_node)
# 创建一个变换矩阵,用于设置相机的位置和方向
# 这里我们把相机移动到(0, 0, 1)的位置,你可以根据你的需要修改这些值
camera_pose = np.eye(4)
camera_pose[:3, 3] = [0, 0, 3]
# 设置相机的位置和方向
scene.set_pose(camera_node, pose=camera_pose)


# pl = pyrender.PointLight(color=[1.0, 1.0, 1.0], intensity=1000.0)
light = pyrender.DirectionalLight(color=[1.0, 1.0, 1.0], intensity=500.0)
# 创建一个变换矩阵,用于移动光源的位置
# 这里我们把光源移动到(0.5, 0.5, 0.5)的位置,你可以根据你的需要修改这些值
light_pose = np.eye(4)
light_pose[:3, 3] = [1, 1, 1]
scene.add(light, pose=light_pose)

# 用pyrender.Viewer()函数来可视化网格
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,表示已经初始化完毕。这是为了让用户可以开始交互。
  • 如果设置为在新线程中运行,则创建一个新线程并启动应用程序;否则,在当前线程中启动应用程序。这是为了让用户可以选择是否在后台运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子燕若水

吹个大气球

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值