示例#1
0
def objshow(obj,
            visual='color',
            res=(512, 512),
            ortho=False,
            showball=False,
            lightdir=[0.4, -1.5, 0.8]):
    import taichi_three as t3

    t3.reset()
    scene = t3.Scene()
    model = t3.Model.from_obj(obj)
    scene.add_model(model)
    if showball:
        ball = t3.Model.from_obj(t3.readobj('assets/sphere.obj', scale=0.6))
        scene.add_model(ball)
    camera = t3.Camera(res=res)
    if visual != 'color':
        dim = 3
        if visual == 'idepth':
            dim = 0
        if visual == 'texcoor':
            dim = 2
        camera.fb.add_buffer('normal', dim)
    if ortho:
        camera.type = camera.ORTHO
    scene.add_camera(camera)
    light = t3.Light(dir=lightdir)
    scene.add_light(light)

    gui = t3.GUI('Model', camera.res)
    while gui.running:
        gui.get_event(None)
        gui.running = not gui.is_pressed(gui.ESCAPE)
        camera.from_mouse(gui)
        if showball:
            ball.L2W.offset[None] = t3.Vector([1.75, -1.75, 0.0])
        scene.render()
        if visual == 'normal':
            gui.set_image(camera.fb['normal'].to_numpy() * 0.5 + 0.5)
        elif visual == 'color':
            gui.set_image(camera.img)
        else:
            gui.set_image(camera.fb[visual].to_numpy())
        gui.show()
示例#2
0
    def show(self, arguments: list = sys.argv[2:]):
        """Visualize an OBJ/NPZ model using Taichi THREE"""
        parser = argparse.ArgumentParser(prog='t3 show',
                                         description=f"{self.show.__doc__}")
        parser.add_argument(
            'filename',
            help='File name of the OBJ/NPZ model to visualize, e.g. monkey.obj')
        parser.add_argument('-s', '--scale', default=0.75,
                type=float, help='Specify a scale parameter')
        parser.add_argument('-u', '--resx', default=512,
                type=int, help='Specify window width')
        parser.add_argument('-v', '--resy', default=512,
                type=int, help='Specify window height')
        parser.add_argument('-A', '--ambient', default=0,
                type=float, help='Specify ambient light strength')
        parser.add_argument('-o', '--ortho',
                action='store_true', help='Display in orthogonal mode')
        parser.add_argument('-l', '--lowp',
                action='store_true', help='Shade faces by interpolation')
        parser.add_argument('-x', '--flipx',
                action='store_true', help='Flip X axis of model when display')
        parser.add_argument('-y', '--flipy',
                action='store_true', help='Flip Y axis of model when display')
        parser.add_argument('-z', '--flipz',
                action='store_true', help='Flip Z axis of model when display')
        parser.add_argument('-f', '--flipface',
                action='store_true', help='Flip face culling direction')
        parser.add_argument('-F', '--flipnorm',
                action='store_true', help='Flip face normal direction')
        parser.add_argument('-b', '--bothface',
                action='store_true', help='Including both face, no culling')
        parser.add_argument('-N', '--renorm',
                action='store_true', help='Reset normal vectors to flat')
        parser.add_argument('-S', '--showhints',
                action='store_true', help='Show information about pixel under cursor')
        parser.add_argument('-T', '--taa', default=True,
                action='store_true', help='Enable temporal anti-aliasing')
        parser.add_argument('-t', '--texture',
                type=str, help='Path to texture to bind')
        parser.add_argument('-n', '--normtex',
                type=str, help='Path to normal map to bind')
        parser.add_argument('-m', '--metallic',
                type=str, help='Path to metallic map to bind')
        parser.add_argument('-r', '--roughness',
                type=str, help='Path to roughness map to bind')
        parser.add_argument('-a', '--arch', default='cpu',
                type=str, help='Backend to use for rendering')
        args = parser.parse_args(arguments)

        import taichi as ti
        import taichi_three as t3
        import numpy as np

        ti.init(getattr(ti, args.arch))

        scene = t3.Scene()
        obj = t3.readobj(args.filename, scale=args.scale if args.scale != 0 else 1)
        t3.objflipaxis(obj, args.flipx, args.flipy, args.flipz)
        if args.scale == 0:
            t3.objautoscale(obj)
        if args.flipface:
            t3.objflipface(obj)
        if args.flipnorm:
            t3.objflipnorm(obj)
        if args.renorm:
            t3.objmknorm(obj)
        if args.bothface:
            t3.objbothface(obj)

        model = (t3.ModelLow if args.lowp else t3.Model).from_obj(obj)
        if args.texture is not None:
            model.add_texture('color', ti.imread(args.texture))
        if args.normtex is not None:
            model.add_texture('normal', ti.imread(args.normtex))
        if args.metallic is not None:
            model.add_texture('metallic', ti.imread(args.metallic))
        if args.roughness is not None:
            model.add_texture('roughness', ti.imread(args.roughness))
        scene.add_model(model)
        camera = t3.Camera(res=(args.resx, args.resy), taa=args.taa)
        if args.showhints:
            camera.fb.add_buffer('pos', 3)
            camera.fb.add_buffer('texcoor', 2)
            camera.fb.add_buffer('normal', 3)
        if args.ortho:
            camera.type = camera.ORTHO
        scene.add_camera(camera)
        if args.ambient:
            light = t3.AmbientLight(args.ambient)
        else:
            light = t3.Light([0.4, -1.5, 0.8])
        scene.add_light(light)

        gui = ti.GUI('Model', camera.res)
        while gui.running:
            gui.get_event(None)
            gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
            camera.from_mouse(gui)
            scene.render()
            gui.set_image(camera.img)
            if args.showhints:
                coor = gui.get_cursor_pos()
                pos = camera.fb.fetchpixelinfo('pos', coor)
                color = camera.fb.fetchpixelinfo('img', coor)
                texcoor = camera.fb.fetchpixelinfo('texcoor', coor)
                normal = camera.fb.fetchpixelinfo('normal', coor)
                gui.text(f'color: [{color.x:.2f} {color.y:.2f} {color.z:.2f}]; pos: [{pos.x:+.2f} {pos.y:+.2f} {pos.z:+.2f}]', (0, 1))
                gui.text(f'texcoor: [{texcoor.x:.2f} {texcoor.y:.2f}]; normal: [{normal.x:+.2f} {normal.y:+.2f} {normal.z:+.2f}]', (0, 1 - 16 / camera.res[1]))
            gui.show()
示例#3
0
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
model1 = t3.Model(t3.Mesh.from_obj(t3.readobj('assets/torus.obj')))
model2 = t3.Model(t3.Mesh.from_obj(t3.readobj('assets/cube.obj', scale=0.5)))
model = t3.ModelGroup([model1, model2])
scene.add_model(model)
camera = t3.Camera(res=(600, 400))
scene.add_camera(camera)
light = t3.Light([0.4, -1.5, -1.8])
scene.add_light(light)

gui = ti.GUI('Camera', camera.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    model2.L2W[None] = t3.translate(0, ti.sin(t3.get_time()) * 0.6, 0)
    model.L2W[None] = t3.rotateZ(t3.get_time())
    camera.from_mouse(gui)
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#4
0
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
texture = ti.imread("assets/cloth.jpg")
model = t3.Model(obj=t3.readobj('assets/monkey.obj', scale=0.6), tex=texture)
scene.add_model(model)
camera = t3.Camera(res=(512, 512), pos=[0, 0, -2], target=[0, 0, 0])
scene.add_camera(camera)

light = t3.Light(dir=[0, 0, 1], color=[1.0, 1.0, 1.0])
scene.add_light(light)
light2 = t3.Light(dir=[0, -1, 0], color=[1.0, 1.0, 1.0])
scene.add_light(light2)

gui = ti.GUI('Model', camera.res)
while gui.running:
    gui.running = not gui.get_event(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#5
0
                                   6)
    for i in ti.grouped(x):
        v[i] *= ti.exp(-damping * dt)
        x[i] += dt * v[i]


### Rendering GUI

scene = t3.Scene()
model = t3.Model(faces_n=(N - 1)**2 * 4,
                 pos_n=N**2,
                 tex_n=N**2,
                 nrm_n=N**2 * 2)
#model.load_texture(ti.imread('/path/to/your_texture.jpg'))
scene.add_model(model)
camera = t3.Camera(fov=24, pos=[0, 1.1, -1.5], target=[0, 0.25, 0])
scene.add_camera(camera)
light = t3.Light([0.4, -1.5, 1.8])
scene.add_light(light)


@ti.kernel
def init_display():
    for i_ in ti.grouped(ti.ndrange(N - 1, N - 1)):
        i = i_
        a = i.dot(tl.vec(N, 1))
        i.x += 1
        b = i.dot(tl.vec(N, 1))
        i.y += 1
        c = i.dot(tl.vec(N, 1))
        i.x -= 1
示例#6
0
import taichi_three as t3
import taichi as ti

N = 64

scene = t3.Scene()
mesh = t3.DynamicMesh(n_faces=N, n_pos=N + 1)
model = t3.Model(mesh)
scene.add_model(model)
camera = t3.Camera()
scene.add_camera(camera)
light = t3.AmbientLight(1.0)
scene.add_light(light)


@ti.kernel
def init_mesh():
    mesh.pos[N] = [0, 0, 0]
    for i in range(N):
        a = i / N * t3.tau
        mesh.pos[i] = [ti.sin(a), ti.cos(a), 0]
        mesh.faces[i] = [[i, 0, 0], [(i + 1) % N, 0, 0], [N, 0, 0]]


init_mesh()

gui = ti.GUI('Dynamic faces', camera.res)
while gui.running:
    mesh.n_faces[None] = gui.frame % N

    scene.render()
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
model = t3.Model(t3.Mesh.from_obj('assets/monkey.obj'))
scene.add_model(model)
camera = t3.Camera(taa=True)
scene.add_camera(camera)
light = t3.Light([0.4, -1.5, -0.8])
scene.add_light(light)

gui = ti.GUI('Model', camera.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#8
0
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
texture = ti.imread("assets/cloth.jpg")
model = t3.Model(obj=t3.readobj('assets/monkey.obj', scale=0.8), tex=texture)
scene.add_model(model)
camera = t3.Camera(res=(256, 256), pos=[0, 0, 2.5], target=[0, 0, 0], up=[0, 1, 0])
scene.add_camera(camera)

camera2 = t3.Camera(pos=[0, 1, -2], target=[0, 1, 0], up=[0, 1, 0])
scene.add_camera(camera2)

light = t3.Light([0.4, -1.5, -0.8])
scene.add_light(light)

camera.type = camera.ORTHO
camera2.set_intrinsic(256, 256, 256, 256)

print(camera2.export_intrinsic())
print(camera2.export_extrinsic())


gui = ti.GUI('Model', camera.res)
gui2 = ti.GUI('Model2', camera2.res)

while gui.running and gui2.running:
    gui.get_event(None)
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
model = t3.Model(obj=t3.readobj('assets/torus.obj'),
                 tex=ti.imread('assets/cloth.jpg'))
camera = t3.Camera(pos=[0, 1, -1.8])
scene.add_model(model)
scene.add_camera(camera)

light = t3.Light([0.4, -1.5, 1.8])
scene.add_light(light)
gui = ti.GUI('Model', camera.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#10
0
import taichi as ti
import taichi_three as t3

ti.init(ti.cpu)

scene = t3.Scene()
model = t3.Model(t3.Mesh.from_obj('assets/monkey.obj'))
scene.add_model(model)
camera = t3.Camera(res=(1024, 1024))
scene.add_camera_d(camera)
buffer = t3.SuperSampling2x2(t3.FrameBuffer(camera))
scene.add_buffer(buffer)
light = t3.Light([0.4, -1.5, -0.8], 0.9)
scene.add_light(light)
ambient = t3.AmbientLight(0.1)
scene.add_light(ambient)


gui = ti.GUI('SSAA 2x2', buffer.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    scene.render()
    gui.set_image(buffer.img)
    gui.show()

示例#11
0
import taichi as ti
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
model = t3.Model(t3.Mesh.from_obj(t3.readobj('assets/monkey.obj', scale=0.8)))
scene.add_model(model)
camera = t3.Camera(res=(256, 256))
camera.ctl = t3.CameraCtl(pos=[0, 0, 2.5], target=[0, 0, 0], up=[0, 1, 0])
scene.add_camera(camera)

camera2 = t3.Camera()
camera2.ctl = t3.CameraCtl(pos=[0, 1, -2], target=[0, 1, 0], up=[0, 1, 0])
scene.add_camera(camera2)

light = t3.Light([0.4, -1.5, -0.8])
scene.add_light(light)

camera.type = camera.ORTHO
camera2.set_intrinsic(256, 256, 256, 256)

gui = ti.GUI('Model', camera.res)
gui2 = ti.GUI('Model2', camera2.res)

while gui.running and gui2.running:
    gui.get_event(None)
    gui2.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    gui2.running = not gui2.is_pressed(ti.GUI.ESCAPE)