3D场景怎么保存结果

文档看到使用gui.show()或者像素矩阵保存图像,3D场景的图像怎么保存?

想保存多帧连续图片,window.show能正确显示动画,但是window.saveimage只保存了第一帧,其他图片都重复了第一帧

@Lenlend 可以给出你的代码不?

window = ti.ui.Window(“Window”,res=(600,600))
gui = window.get_gui()
canvas = window.get_canvas()
canvas.set_background_color((0,0,0.))
scene = ti.ui.Scene()
camera = ti.ui.Camera()
camera.position(1.8,1.8,0.8)
camera.up(0,0,1)
camera.lookat(0,0,0)

step_size = 1
step = 0

while window.running:
if step >= len(slice) - 2:
step = len(slice) - 2
print(int(step))

step = step + step_size

scene.mesh(all_vts[step],all_ids[step], color=(0.2, 0.7, 0.3))
camera.track_user_inputs(window,movement_speed=0.03,hold_key=ti.ui.RMB)
scene.ambient_light(color=(1,1,1))
scene.point_light(pos=(-1,1,1),color=(1,1,1))
# scene.point_light(pos=(0, -1, 1), color=(1, 1, 1))

scene.set_camera(camera)
canvas.scene(scene)
# window.show()
window.save_image(f"save_img/{int(step)}.jpg")

@zemora

试试用 write_image ?

我用的1.1.3版本,write_image已经被弃用了啊,而且看代码write_image也是调用了save_image

啊,抱歉,你是对的,我贴了一个 deprecated 的 api.

可以格式化一下你的代码不?

请你检查一下:

  1. 你的场景是否是一个静态场景?
  2. 你的 len(slice) 是否是期望的值。有可能你的 step 一开始就已经 >= len(slice) - 2?

len(slice)没问题,不是静态场景,window.show()可以看到动态变化,就是保存的图片时都和第一帧一样(图片命名按step命名)

能给个代码地址我们复现一下不?(不排除有 bug 的可能)

import taichi as ti

ti.init(arch=ti.cpu)
res_x,res_y = 600,600

ball1_pos = ti.Vector.field(3, dtype=ti.f32, shape=1)
ball2_pos = ti.Vector.field(3, dtype=ti.f32, shape=1)

ball1_to_ball2 = 30
theta = 0

@ti.kernel
def update_earth_pos(theta:ti.f32):
    ball2_pos[0][0] = ball1_to_ball2 * ti.cos(theta)
    ball2_pos[0][1] = ball1_to_ball2 * ti.sin(theta)
    ball2_pos[0][2] = 0

ball1_pos[0] = ti.Vector([0, 0, 0])

window = ti.ui.Window("Window",res=(res_x,res_y))
canvas = window.get_canvas()
canvas.set_background_color((1,1,1.))
scene = ti.ui.Scene()
camera = ti.ui.Camera()
camera.position(50,50,50)
camera.up(0,0,1)
camera.lookat(0,0,0)

img_index = 0

while window.running:
    update_earth_pos(theta)
    theta = theta + 0.001
    scene.particles(ball1_pos, radius=5, color=(1, 0, 0))
    scene.particles(ball2_pos, radius=1, color=(0, 0, 1))

    camera.track_user_inputs(window,movement_speed=0.03,hold_key=ti.ui.RMB)
    scene.ambient_light(color=(0.5,0.5,0.5))
    scene.point_light(pos=(-5,5,5),color=(1,1,1))

    scene.set_camera(camera)
    canvas.scene(scene)
    # window.show()
    img_index = img_index + 1
    print(img_index)
    window.save_image(f"save_img/{img_index}.jpg")

这么简单的都不行,是不是我的用法有问题


按照文档要求,试试在window.save_image后调用window.show