示例#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
scene = t3.Scene()
camera = t3.Camera()
camera.ctl = t3.CameraCtl(pos=[0, 0.8, -1.1], target=[0, 0.25, 0])
scene.add_camera(camera)

mesh = t3.MeshGrid((N, N))
model = t3.Model(t3.QuadToTri(mesh))
model.material = t3.Material(
    t3.CookTorrance(color=t3.Texture('assets/cloth.jpg')))
scene.add_model(model)

sphere = t3.Model(t3.Mesh.from_obj('assets/sphere.obj'))
scene.add_model(sphere)

light = t3.Light(dir=[0.4, -1.5, 1.8])
scene.add_light(light)
scene.add_camera(light.make_shadow_camera())


@ti.kernel
def update_display():
    for i in ti.grouped(x):
        mesh.pos[i] = x[i]


init()
sphere.L2W[None] = t3.translate(ball_pos) @ t3.scale(ball_radius)
with ti.GUI('Mass Spring', camera.res) as gui:
    while gui.running and not gui.get_event(gui.ESCAPE):
        if not gui.is_pressed(gui.SPACE):
示例#6
0
ti.init(arch=ti.opengl)

vol = np.load('assets/smoke.npy')

mciso = MCISO(vol.shape[0], use_sparse=False)

scene = t3.Scene()
mesh = t3.DynamicMesh(n_faces=mciso.N_res,
                      n_pos=mciso.N_res,
                      n_nrm=mciso.N_res)
model = t3.Model(mesh)
scene.add_model(model)
camera = t3.Camera()
scene.add_camera(camera)
scene.add_light(t3.Light([0.4, -1.5, -1.8], 0.8))
scene.add_light(t3.AmbientLight(0.22))


@ti.kernel
def update_mesh():
    mesh.n_faces[None] = mciso.Js_n[None]
    for i in range(mciso.Js_n[None]):
        for t in ti.static(range(3)):
            mesh.faces[i][t, 0] = mciso.Jts[i][t]
            mesh.faces[i][t, 2] = mciso.Jts[i][t]
        mesh.pos[i] = (mciso.vs[i] + 0.5) / mciso.N * 2 - 1
        mesh.nrm[i] = mciso.ns[i]


mciso.clear()
示例#7
0
import taichi_three as t3

scene = t3.Scene()
camera = t3.Camera()
scene.add_camera(camera)

light = t3.Light(dir=[-0.2, -0.6, -1.0])
scene.add_light(light)

obj = t3.Geometry.cube()
model = t3.Model(t3.Mesh.from_obj(obj))
model.material = t3.Material(t3.BlinnPhong(
    color=t3.Texture('container2.png'),
    specular=t3.Texture('container2_specular.png'),
))
scene.add_model(model)

gui = t3.GUI('Binding Textures')
while gui.running:
    scene.render()
    gui.get_event(None)
    camera.from_mouse(gui)
    gui.set_image(camera.img)
    gui.show()
示例#8
0
import taichi_three as t3
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
obj = t3.readobj('assets/cube.obj', scale=0.6)
model = t3.Model(t3.Mesh.from_obj(obj))
model.material = t3.Material(
    t3.CookTorrance(
        color=t3.Texture(ti.imread('assets/cloth.jpg')),
        normal=t3.NormalMap(
            texture=t3.Texture(ti.imread('assets/normal.png'))),
    ))
scene.add_model(model)
camera = t3.Camera()
camera.ctl = t3.CameraCtl(pos=[0, 1, 1.8])
scene.add_camera(camera)
light = t3.Light([0.4, -0.8, -1.7])
scene.add_light(light)

gui = ti.GUI('Normal map', 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.set_image(camera.fb['normal'].to_numpy() * 0.5 + 0.5)
    gui.show()
示例#9
0
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
obj = t3.readobj('assets/sphere.obj', scale=0.9)
model = t3.Model(t3.Mesh.from_obj(obj))
model.material = t3.Material(t3.CookTorrance(
    roughness=t3.Uniform((), float),
    metallic=t3.Uniform((), float),
    ))
scene.add_model(model)
camera = t3.Camera()
camera.ctl = t3.CameraCtl(pos=[0, 1, 1.8])
scene.add_camera(camera)
light = t3.Light(dir=[0.9, -1.5, -1.3])
scene.add_light(light)

gui = ti.GUI('Material Ball', camera.res)
roughness = gui.slider('roughness', 0, 1, step=0.05)
metallic = gui.slider('metallic', 0, 1, step=0.05)
roughness.value = 0.3
metallic.value = 0.0
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    model.material.shader.params['roughness'].fill(roughness.value)
    model.material.shader.params['metallic'].fill(metallic.value)
    if any(x < 0.6 for x in gui.get_cursor_pos()):
        camera.from_mouse(gui)
    scene.render()
示例#10
0
mtllib = [None]
scene = t3.Scene()
model = t3.Model(t3.Mesh.from_obj('assets/monkey.obj'))
model.material = t3.DeferredMaterial(mtllib, t3.Material(t3.CookTorrance()))
scene.add_model(model)
camera = t3.Camera()
scene.add_camera_d(camera)
gbuff = t3.FrameBuffer(camera,
                       buffers=dict(
                           mid=[(), int],
                           position=[3, float],
                           texcoord=[2, float],
                           normal=[3, float],
                           tangent=[3, float],
                       ))
imgbuf = t3.DeferredShading(gbuff, mtllib)
scene.add_buffer(imgbuf)
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('Deferred Shading', imgbuf.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(imgbuf.img)
    gui.show()
import numpy as np

ti.init(ti.cpu)

scene = t3.Scene()
model = t3.Model(t3.Mesh.from_obj(t3.readobj('assets/torus.obj', scale=0.8)))
model.material = t3.Material(
    t3.CookTorrance(
        color=t3.Texture(ti.imread('assets/cloth.jpg')),
        roughness=t3.Texture(ti.imread('assets/pattern.jpg')),
        metallic=t3.Constant(0.5),
    ))
scene.add_model(model)
camera = t3.Camera()
camera.ctl = t3.CameraCtl(pos=[0.8, 0, 2.5])
scene.add_camera(camera)
light = t3.Light([0, -0.5, -1])
scene.add_light(light)
ambient = t3.AmbientLight(0.3)
scene.add_light(ambient)

gui = ti.GUI('PBR demo', camera.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    model.L2W[None] = t3.rotateX(angle=t3.get_time())
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#12
0
import taichi as ti
import taichi_glsl as ts
import taichi_three as t3
ti.init(ti.cpu)

N = 12
dt = 0.01

scene = t3.Scene()
model = t3.ScatterModel()
scene.add_model(model)
camera = t3.Camera()
#camera.add_buffer('normal', 3)
scene.add_camera(camera)
light = t3.Light()
scene.add_light(light)

pos = ti.Vector.field(3, float, N)
vel = ti.Vector.field(3, float, N)
radius = ti.field(float, N)

model.pos = pos
model.radius = radius


@ti.kernel
def init():
    for i in pos:
        pos[i] = ts.randNDRange(ts.vec3(-1), ts.vec3(1))
        vel[i] = ts.randNDRange(ts.vec3(-1.1), ts.vec3(1.1))
        radius[i] = ts.randRange(0.1, 0.2)
示例#13
0
    t3.CookTorrance(  # Up: gold
        color=t3.Constant(t3.RGB(1.0, 0.96, 0.88)),
        roughness=t3.Constant(0.2),
        metallic=t3.Constant(0.75),
    ))
model2.material = t3.Material(
    t3.CookTorrance(  # Down: cloth
        color=t3.Texture(ti.imread('assets/cloth.jpg')),
        roughness=t3.Constant(0.3),
        metallic=t3.Constant(0.0),
    ))
scene.add_model(model1)
scene.add_model(model2)
camera = t3.Camera()
camera.ctl = t3.CameraCtl(pos=[0.8, 0, 2.5])
scene.add_camera(camera)
light = t3.Light([0, -0.5, -1], 0.9)
scene.add_light(light)
ambient = t3.AmbientLight(0.1)
scene.add_light(ambient)

gui = ti.GUI('Materials', camera.res)
while gui.running:
    gui.get_event(None)
    gui.running = not gui.is_pressed(ti.GUI.ESCAPE)
    camera.from_mouse(gui)
    model2.L2W[None] = model1.L2W[None] = t3.rotateX(angle=t3.get_time())
    scene.render()
    gui.set_image(camera.img)
    gui.show()
示例#14
0
model = t3.Model(t3.Mesh.from_obj(obj))
model.material = t3.Material(
    t3.BlinnPhong(
        # https://learnopengl.com/img/textures/container2.png
        color=t3.Texture('docs/_media/container2.png'),
        specular=t3.Texture('docs/_media/container2_specular.png'),
    ))
scene.add_model(model)
camera = t3.Camera()
scene.add_camera_d(camera)
original = t3.FrameBuffer(camera)
filted = t3.ImgUnaryOp(original, lambda x: ti.max(0, x - 1))
blurred = t3.GaussianBlur(filted, radius=21)
final = t3.ImgBinaryOp(original, blurred, lambda x, y: x + y)
scene.add_buffer(final)
light = t3.Light(dir=[-0.2, -0.6, -1.0], color=1.6)
scene.add_light(light)

gui_original = ti.GUI('Original', filted.res)
gui_filted = ti.GUI('Filted', filted.res)
gui_blurred = ti.GUI('Blurred', blurred.res)
gui_final = ti.GUI('Final', final.res)
gui_original.fps_limit = None
gui_filted.fps_limit = None
gui_blurred.fps_limit = None
gui_final.fps_limit = None
while gui_final.running and gui_filted.running and gui_blurred.running and gui_original.running:
    gui_final.get_event(None)
    camera.from_mouse(gui_final)
    scene.render()
    gui_original.set_image(original.img)