4

我在 PyVista 中使用相机变换矩阵来制作动画。但我的对象是阴影:

在此处输入图像描述

我将相同的变换矩阵应用于灯光,如下所示。

circles = fractal3(4)
for i, matrix in enumerate(matrices):
    pltr = pv.Plotter(window_size=[512, 512], off_screen=True)
    pltr.set_background("#363940")
    pltr.set_position(satellite0)
    pltr.camera.zoom(0.9)
    pltr.camera.model_transform_matrix = matrix
    for circle in circles:
        center, radius = circle
        sphere = pv.Sphere(radius, center = center+(0,))
        pltr.add_mesh(sphere, smooth_shading=True, color="red", specular=10)
    pltr.set_focus((0,0,0))
    for light in pltr.renderer.lights:
        light.transform_matrix = matrix
    pngname = "zzpic%03d.png" % i
    pltr.show(screenshot=pngname)

编辑

这是我不对灯光做任何事情时得到的动画:

在此处输入图像描述

4

1 回答 1

1

正如我在评论中指出的那样,您最好使用类似orbit_on_path(). 您注意到 gif 最终质量低下,这就是您寻找其他选项的原因。

您仍然可以保存到 MP4 文件并将其转换为具有任何质量要求的 gif,或者您可以复制orbit_on_path()引擎盖下的内容。移动相机(而不是操纵它的变换矩阵)应该更加健壮。

无论如何,要在这里回答您的确切问题,您必须以不平凡的方式转换灯光。这是一个根据您不完整的代码复制您的情况的最小示例:

mport numpy as np
import pyvista as pv
from pyvista.examples import download_bunny

# example data
mesh = download_bunny()
mesh.rotate_x(90)
matrices = [
    np.array([
        [np.cos(phi), -np.sin(phi), 0, 0],
        [np.sin(phi), np.cos(phi), 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]
    ])
    for phi in np.linspace(0, 2*np.pi, 22, endpoint=False)
]

for i, matrix in enumerate(matrices):
    plotter = pv.Plotter(window_size=[512, 512], off_screen=True)
    plotter.set_background("#363940")
    plotter.camera.zoom(3)
    plotter.camera.model_transform_matrix = matrix
    plotter.add_mesh(mesh, smooth_shading=True, color="red", specular=10)
    plotter.set_focus(mesh.center)
    #for light in plotter.renderer.lights:
    #    pass  # option 1
    #    light.transform_matrix = matrix  # option 2
    #    light.transform_matrix = np.linalg.inv(matrix)  # option 3
    pngname = f"zzpic{i:03d}.png"
    plotter.show(screenshot=pngname)

在那里,我留下了 3 个选项来操作渲染器的默认灯光。

第一种选择是不理会灯光的变换矩阵。生成的动画如下所示: 带有旋转兔子的动画,灯光随之旋转

如您所见,灯光相对于场景(兔子)是静态的。兔子有黑暗的一面和光明的一面。这有点令人惊讶,因为默认灯是与相机一起移动的相机灯。但是设置变换矩阵似乎绕过了这种联系,可能会将相机的有效位置从其物理位置移开。

第二个选项是您的问题:将相同的变换矩阵应用于灯光: 用奇怪的摇晃灯旋转兔子 它不像您的示例那样明显,但是灯光四处移动,既没有链接到兔子也没有链接到相机。眯着眼睛可能会注意到,在兔子的一整圈中,有两个黑暗实例和两个明亮实例。

这让我想到了最后一个选择:将变换应用于灯光!结果如下所示: 旋转的兔子总是光线充足

似乎这种设置使兔子始终保持良好的照明。在您的分形示例和卫星路径上,如果这确实修复了照明,那将是非常明显的。我希望这可以将灯光的有效位置与相机的有效位置一起放回原处。

于 2021-12-18T23:37:11.757 回答