Пример #1
0
def main():

    n = 100
    xyz = 3 * (np.random.random((n, 3)) - 0.5)
    r = 0.4 * np.random.random(n) + 0.002

    rt = TkOptiX()
    rt.set_param(min_accumulation_step=4, max_accumulation_frames=500)

    rt.setup_light("light1", pos=[4, 5, 5], color=[8, 7, 6], radius=1.5)
    rt.setup_light("light2", pos=[4, 15, -5], color=[8, 7, 6], radius=1.5)
    rt.set_ambient([0.1, 0.2, 0.3])
    rt.set_background(1)

    rt.set_data("plot", xyz, r=r, c=0.8)

    # shadow catcher makes the object transparent except regions where a light casts shadows,
    # this can be useful e.g. for making packshot style images
    rt.setup_material("shadow", m_shadow_catcher)
    rt.set_data("plane",
                pos=[-50, -2, -50],
                u=[100, 0, 0],
                v=[0, 0, 100],
                c=1,
                geom="Parallelograms",
                mat="shadow")

    rt.start()

    print("done")
Пример #2
0
def main():

    # tetrahedron vertices and faces:
    pt = 1 / np.sqrt(2)

    points = [[1, 0, -pt], [-1, 0, -pt], [0, 1, pt], [0, -1, pt]]

    faces = [[0, 1, 2], [0, 1, 3], [1, 2, 3], [0, 2, 3]]

    # colors assigned to vertices
    colors = [
        [0.7, 0, 0],
        [0, 0.7, 0],
        [0, 0, 0.7],
        [1, 1, 1],
    ]

    rt = TkOptiX()  # create and configure, show the window later

    rt.set_param(min_accumulation_step=2, max_accumulation_frames=100)
    rt.setup_camera("cam1",
                    cam_type="DoF",
                    eye=[1, -6, 4],
                    focal_scale=0.9,
                    fov=25)
    rt.setup_light("light1", pos=[10, -9, -8], color=[14, 13, 12], radius=4)
    rt.set_ambient([0.2, 0.3, 0.4])

    # add mesh geometry to the scene
    rt.set_mesh("m", points, faces, c=colors)

    rt.start()
    print("done")
Пример #3
0
def main():

    optix = TkOptiX() # create and configure, show the window later

    optix.set_param(max_accumulation_frames=100)  # accumulate up to 100 frames
    optix.set_background(0) # black background
    optix.set_ambient(0.25) # some ambient light


    # original Stanford Utah teapot (try also with default value of make_normals=False):
    # note: this file has no named objects specified, and you have to use load_merged_mesh_obj
    # method
    #optix.load_merged_mesh_obj("https://graphics.stanford.edu/courses/cs148-10-summer/as3/code/as3/teapot.obj",
    #                           "teapot", c=0.92, make_normals=True)

    # another public-domain version with normals included:
    optix.load_mesh_obj("data/utah-teapot.obj", c=0.92)

    # camera and light position auto-fit the scene geometry
    optix.setup_camera("cam1")
    d = np.linalg.norm(optix.get_camera_target() - optix.get_camera_eye())
    optix.setup_light("light1", color=10, radius=0.3 * d)

    optix.start()
    print("done")
Пример #4
0
def main():

    # Make some data first:

    n = 3600
    s = 50

    m =  -0.97
    # try various m: 0.4, 2.48, -1.383, -2.03, ...

    m = math.exp(m)
    k = 1

    xyz = [np.array([0, s * (math.e - 2), 0])]

    t = 0
    while t < n:
        rad = math.pi * t / 180
        f = s * (math.exp(math.cos(rad)) - 2 * math.cos(4 * rad) - math.pow(math.sin(rad/m), 5))
        xyz.append(np.array([f * math.sin(rad), f * math.cos(rad), f * math.sin(2*rad)]))
        t += k

    r = np.linalg.norm(xyz, axis=1)
    r = 5 - (5 / r.max()) * r + 0.02

    # Create the plots:

    optix = TkOptiX() # create and configure, show the window later

    optix.set_background(0.99) # white background
    optix.set_ambient(0.2)     # dim ambient light

    # add plot, BezierChain geometry makes a smooth line interpolating data points
    optix.set_data("curve", pos=xyz, r=r, c=0.9, geom="BezierChain")

    # show the UI window here - this method is calling some default
    # initialization for us, e.g. creates camera, so any modification
    # of these defaults should come below (or we provide on_initialization
    # callback)
    optix.show()

    # camera auto-configured to fit the plot
    optix.camera_fit()

    # 2 spherical light sources, warm and cool, fit positions with respect to
    # the current camera plane: 45 deg right/left and 25 deg up;
    # do not include lights in geometry, so they do not appear in the image
    optix.setup_light("light1", color=15*np.array([0.99, 0.9, 0.7]), radius=250, in_geometry=False)
    optix.light_fit("light1", horizontal_rot=45, vertical_rot=25, dist_scale=1.1)
    optix.setup_light("light2", color=20*np.array([0.7, 0.9, 0.99]), radius=200, in_geometry=False)
    optix.light_fit("light2", horizontal_rot=-45, vertical_rot=25, dist_scale=1.1)

    # accumulate up to 30 frames (override default of 4 frames)
    optix.set_param(max_accumulation_frames=200)

    print("done")
Пример #5
0
def main():

    ru = rv = (-np.pi, 3*np.pi) # use with trefoil()
    #ru = rv = (0, 2*np.pi)     # use with torus()

    #ru = (0, np.pi)          # use with sphere()
    #rv = (0, 2*np.pi)

    n = 500

    i = np.linspace(ru[0], ru[1], n)
    j = np.linspace(rv[0], rv[1], n)

    U, V = np.meshgrid(i, j)
    S = trefoil(U, V, 5)
    #S = sphere(U, V, 7)
    #S = torus(U, V, 3, 5)

    S = np.swapaxes(S, 0, 2)

    rt = TkOptiX(width=750, height=900)

    rt.set_param(min_accumulation_step=2, max_accumulation_frames=500, light_shading="Hard")
    rt.set_uint("path_seg_range", 6, 15)

    rt.setup_material("plastic", m_plastic)

    exposure = 0.8; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.add_postproc("Gamma")

    rt.set_background(0)
    rt.set_ambient(0.15)

    rt.set_surface("surface", S, c=0.94,
                   #wrap_u=True, wrap_v=True,        # use wrapping to close a gap that can appear on u or v edges
                   make_normals=True, mat="plastic")

    rt.set_data("plane", geom="Parallelograms",
                pos=[[-100, -14, -100]], u=[200, 0, 0], v=[0, 0, 200],
                c=make_color([0.1, 0.2, 0.3], exposure=exposure, gamma=gamma)[0])

    rt.setup_camera("cam1", cam_type="DoF",
                    eye=[-50, -7, -15], target=[0, 0, -1], up=[0, 1, 0],
                    aperture_radius=0.4, aperture_fract=0.2,
                    focal_scale=0.92, fov=35)

    rt.setup_light("light1", pos=[-15, 20, 15], color=5, radius=6)

    rt.start()

    print("done")
Пример #6
0
def main():

    # make some data first:
    rx = (-15, 5)
    rz = (-10, 10)
    n = 50

    x = np.linspace(rx[0], rx[1], n)
    z = np.linspace(rz[0], rz[1], n)

    X, Z = np.meshgrid(x, z)
    Y = f(X, Z)

    rt = TkOptiX()  # create and configure, show the window later

    rt.set_param(max_accumulation_frames=50)  # accumulate up to 50 frames
    rt.set_background(0)  # black background
    rt.set_ambient(0.25)  # some ambient light

    # try commenting out optional arguments
    rt.set_data_2d("surface",
                   Y,
                   range_x=rx,
                   range_z=rz,
                   c=map_to_colors(Y, "OrRd"),
                   floor_c=[0.05, 0.12, 0.38],
                   floor_y=-1.75,
                   make_normals=True)

    # add wireframe above the surface
    rt.set_data_2d("wireframe",
                   Y + 3,
                   range_x=rx,
                   range_z=rz,
                   r=0.06 * np.abs(Y),
                   geom="Graph",
                   c=0.92)

    # set camera and light position to fit the scene
    rt.setup_camera("cam1")
    eye = rt.get_camera_eye()
    eye[1] = 0.5 * eye[2]
    rt.update_camera("cam1", eye=eye)

    d = np.linalg.norm(rt.get_camera_target() - eye)
    rt.setup_light("light1", color=8, radius=0.3 * d)

    rt.start()

    print("done")
def main():

    # a mesh from pygmsh example:
    with pygmsh.geo.Geometry() as geom:

        poly = geom.add_polygon(
            [
                [+0.0, +0.5],
                [-0.1, +0.1],
                [-0.5, +0.0],
                [-0.1, -0.1],
                [+0.0, -0.5],
                [+0.1, -0.1],
                [+0.5, +0.0],
                [+0.1, +0.1],
            ],
            mesh_size=0.05,
        )

        geom.twist(
            poly,
            translation_axis=[0, 0, 1],
            rotation_axis=[0, 0, 1],
            point_on_axis=[0, 0, 0],
            angle=np.pi / 3,
        )

        mesh = geom.generate_mesh()

    rt = TkOptiX()  # create and configure, show the window later

    rt.set_param(min_accumulation_step=2, max_accumulation_frames=100)
    rt.setup_camera("cam1",
                    cam_type="DoF",
                    eye=[0.5, -3, 2],
                    target=[0, 0, 0.5],
                    focal_scale=0.9,
                    fov=25)
    rt.setup_light("light1", pos=[15, 0, 10], color=[8, 7, 6], radius=4)
    rt.set_ambient([0.1, 0.15, 0.2])

    # add mesh geometry to the scene
    rt.set_mesh("m", mesh.points, mesh.cells_dict['triangle'])

    rt.start()
    print("done")
def main():

    # a mesh from pygmsh example:
    geom = pygmsh.built_in.Geometry()

    # Draw a cross.
    poly = geom.add_polygon(
        [[0.0, 0.5, 0.0], [-0.1, 0.1, 0.0], [-0.5, 0.0, 0.0
                                             ], [-0.1, -0.1, 0.0],
         [0.0, -0.5, 0.0], [0.1, -0.1, 0.0], [0.5, 0.0, 0.0], [0.1, 0.1, 0.0]],
        lcar=0.05)

    axis = [0, 0, 1]

    geom.extrude(poly,
                 translation_axis=axis,
                 rotation_axis=axis,
                 point_on_axis=[0, 0, 0],
                 angle=2.0 / 6.0 * np.pi)

    mesh = pygmsh.generate_mesh(geom)

    rt = TkOptiX()  # create and configure, show the window later

    rt.set_param(min_accumulation_step=2, max_accumulation_frames=100)
    rt.setup_camera("cam1",
                    cam_type="DoF",
                    eye=[0.5, -3, 2],
                    target=[0, 0, 0.5],
                    focal_scale=0.9,
                    fov=25)
    rt.setup_light("light1", pos=[15, 0, 10], color=[8, 7, 6], radius=4)
    rt.set_ambient([0.1, 0.15, 0.2])

    # add mesh geometry to the scene
    rt.set_mesh("m", mesh.points, mesh.cells_dict['triangle'])

    rt.start()
    print("done")
Пример #9
0
def main():

    rt = TkOptiX() # create and configure, show the window later

    rt.set_param(max_accumulation_frames=500)  # accumulate up to 100 frames
    rt.set_uint("path_seg_range", 6, 12)       # allow some more ray segments
    rt.set_background(0)                       # black background
    rt.set_ambient([0.1, 0.12, 0.15])          # some ambient light
    #rt.set_param(light_shading="Hard")        # nice, accurate caustics, but slower convergence

    exposure = 1; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.add_postproc("Gamma")                   # gamma correction

    # setup materials:
    m_diffuse["VarFloat3"] = { "base_color": [ 0.85, 0.87, 0.89 ] }
    rt.update_material("diffuse", m_diffuse)

    m_dispersive_glass["VarFloat3"]["base_color"] = [ 100, 110, 120 ]
    rt.setup_material("glass", m_dispersive_glass)

    # read the scene:
    scene = trimesh.load("data/chemistry.glb")

    # upload meshes to the ray tracer
    for name in scene.geometry:
        mesh = scene.geometry[name]
        if name in ["bottle", "cap", "testtube"]:
            rt.set_mesh(name, mesh.vertices, mesh.faces, mat="glass", make_normals=True)
        else:
            rt.set_mesh(name, mesh.vertices, mesh.faces)

    # camera and light
    rt.setup_light("light1", pos=[6,7.5,-15], color=30, radius=2)
    rt.setup_camera("cam1", eye=[-2,5,-10], target=[-0.75,1.4,5], fov=23, glock=True)

    rt.start()
    print("done")
Пример #10
0
def main():

    rt = TkOptiX()  # create and configure, show the window later

    rt.set_param(max_accumulation_frames=100)  # accumulate up to 100 frames
    rt.set_background(0.99)  # white background
    rt.set_ambient(0.25)  # some ambient light

    # setup materials:
    m_diffuse["VarFloat3"] = {"base_color": [0.15, 0.17, 0.2]}
    rt.update_material("diffuse", m_diffuse)

    m_matt_plastic["VarFloat3"]["base_color"] = [0.5, 0.1, 0.05]
    rt.setup_material("plastic", m_matt_plastic)

    rt.load_texture("wing", "data/wing.png")

    m_transparent_plastic["ColorTextures"] = ["wing"]
    rt.setup_material("transparent", m_transparent_plastic)

    rt.load_normal_tilt("transparent", "data/wing.png", prescale=0.002)

    # prepare dictionary and load meshes; note that both eyes and wings
    # are assigned with single material by providing only a part of
    # the mesh name:
    materials = {"eye": "plastic", "wing": "transparent"}
    rt.load_multiple_mesh_obj("data/fly.obj",
                              materials,
                              parent="head_Icosphere")

    # camera and light position auto-fit the scene geometry
    rt.setup_camera("cam1")
    d = np.linalg.norm(rt.get_camera_target() - rt.get_camera_eye())
    rt.setup_light("light1", color=10, radius=0.3 * d)

    rt.start()
    print("done")
Пример #11
0
def main():

    # Setup the raytracer:

    rt = TkOptiX()

    rt.set_param(min_accumulation_step=2,      # update image every 2 frames
                 max_accumulation_frames=250)  # accumulate 250 frames

    exposure = 1.1; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.add_postproc("Denoiser")                # Gamma correction, or use AI denoiser.
    #rt.add_postproc("Gamma")                  #    *** but not both together ***

    rt.set_background(0)
    rt.set_ambient(0)

    # Prepare a simple scene objects, camera and lights:

    rt.set_data("plane", geom="Parallelograms", pos=[[-15, 0, -15]], u=[30, 0, 0], v=[0, 0, 30], c=0.94)
    rt.set_data("block1", geom="Parallelepipeds", pos=[[-6, -0.07, -1]], u=[12, 0, 0], v=[0, 0.1, 0], w=[0, 0, 3], c=0.94)
    rt.set_data("block2", geom="Parallelepipeds", pos=[[-6, 0, -1]], u=[12, 0, 0], v=[0, 4, 0], w=[0, 0, 0.1], c=0.94)

    # Setup lights and the camera:

    rt.setup_light("light1", light_type="Parallelogram", pos=[-2.5, 2.6, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[4, 4.7, 5])
    rt.setup_light("light2", light_type="Parallelogram", pos=[-0.5, 3.2, 0], u=[0.8, 0, 0], v=[0, 0, 0.8], color=[6, 5.6, 5.2])
    rt.setup_light("light3", light_type="Parallelogram", pos=[1.5, 2.6, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[4, 4.7, 5])
    rt.setup_camera("cam1", cam_type="DoF", eye=[0, 0.4, 6], target=[0, 1.2, 0], aperture_radius=0.025, fov=35, focal_scale=0.9)

    # Make some data:

    n = 20
    x = np.linspace(-3, 3, n)
    r = 0.8*np.cos(0.4*x)
    y = np.sin(x + 5) + 1.3
    z = np.cos(x + 5) + 0.3
    data = np.stack((x, y, z)).T

    # Add object to scene:
    rt.set_data("balls", pos=data, r=r, c=0.93)
    # or use another geometry and save it in the second scene file:
    #rt.set_data("cubes", geom="Parallelepipeds", pos=data, r=r, c=0.92)

    # Let's start:
    rt.start()

    # Save the scene. This actually can be called also before starting.
    rt.save_scene("strange_object.json")
    #rt.save_scene("strange_object_2.json") # the second file will be usefull in the scene loading example

    print("done")
Пример #12
0
def main():

    ru = rv = (0, 2*np.pi)

    n = 50

    i = np.linspace(ru[0], ru[1], 2*n)[:-1]
    j = np.linspace(rv[0], rv[1], n)[:-1]

    U, V = np.meshgrid(i, j)
    S = torus(U, V, 3, 5)

    S = np.swapaxes(S, 0, 2)

    rt = TkOptiX()

    rt.set_param(min_accumulation_step=2, max_accumulation_frames=500, light_shading="Hard")
    rt.set_uint("path_seg_range", 6, 15)

    rt.setup_material("plastic", m_plastic)

    exposure = 0.8; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.add_postproc("Gamma")

    rt.set_background(0)
    rt.set_ambient(0.0)

    rt.set_surface("surface", S, c=0.95,
                   wrap_u=True, wrap_v=True,
                   mat="plastic",
                   make_normals=True
                   )

    # make data for a bigger torus using normals calculated automatically
    # for the firts object; note that this surface has normals oriented
    # inwards - that's not a problem unless you'd like to have a refractive
    # glass-like material, then use the code below that will flip normals
    # (or simply change the surface formula, but this  would not illustrate
    # how to access buffers)
    #with PinnedBuffer(rt.geometry_data["surface"], "Vectors") as N:
    #    print(S.shape, N.shape) # note that internal buffers are flat arrays of mesh vertex properties 
    #    S -= N.reshape(S.shape)

    # flip normals and update data on gpu, note that both normal vectors
    # and vertex order should be inverted for correct shading
    with PinnedBuffer(rt.geometry_data["surface"], "Vectors") as N:
        with PinnedBuffer(rt.geometry_data["surface"], "FaceIdx") as F:
            N *= -1                  # flip shading normals
            F[:,[0,1]] = F[:,[1,0]]  # invert vertex order in faces, so geometry normals are consistent with shading normals

            rt.update_geom_buffers("surface", GeomBuffer.Vectors | GeomBuffer.FaceIdx, forced=True) # update data on device

            S += 0.5 * N.reshape(S.shape) # make data for a bigger torus

    rt.set_surface("wireframe", S, c=[0.4, 0.01, 0],
                   r=0.015, geom="Graph",
                   wrap_u=True, wrap_v=True,
                   )

    rt.set_data("plane", geom="Parallelograms",
                pos=[[-100, -14, -100]], u=[200, 0, 0], v=[0, 0, 200],
                c=make_color([0.1, 0.2, 0.3], exposure=exposure, gamma=gamma)[0])

    rt.setup_camera("cam1", cam_type="DoF",
                    eye=[-50, -7, -15], target=[0, 0, -1], up=[0, 1, 0],
                    aperture_radius=0.4, aperture_fract=0.2,
                    focal_scale=0.92, fov=25)

    rt.setup_light("light1", pos=[-15, 20, 15], color=5, radius=6)

    rt.start()

    print("done")
Пример #13
0
def main():

    # Setup the raytracer:

    rt = TkOptiX()

    rt.set_param(min_accumulation_step=2,      # update image every 2 frames
                 max_accumulation_frames=250)  # accumulate 250 frames
    rt.set_uint("path_seg_range", 5, 15)       # allow many reflections/refractions

    exposure = 1.5; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_igamma", 1 / gamma)
    rt.add_postproc("Gamma")                   # Gamma correction, or use AI denoiser.
    #rt.setup_denoiser()                       #    *** but not both together ***

    rt.set_background(0)
    rt.set_ambient(0)

    # Setup materials:

    m_thin2 = m_thin_walled.copy()             # textured material based on the predefined thin-walled material
    m_thin2["Textures"] = [
        {
          "Baseline": 0.7,               # Prescale the texture to make it bright, as one would expect for a bubbles:
          "Prescale": 0.3,               #    color = Baseline + Prescale * original_color
          "Gamma": 2.2,                  # And compensate the gamma correction applied in 2D postprocessing.
          "Source": "data/rainbow.jpg",
          "Format": RtFormat.Float4.value
        }
      ]

    rt.setup_material("glass", m_clear_glass)
    rt.setup_material("thin", m_thin_walled)
    rt.setup_material("thin2", m_thin2)

    # Prepare a simple scene objects, camera and lights:

    rt.set_data("plane", geom="Parallelograms", pos=[[-15, 0, -15]], u=[30, 0, 0], v=[0, 0, 30], c=0.94)
    rt.set_data("block1", geom="Parallelepipeds", pos=[[-6, -0.07, -1]], u=[12, 0, 0], v=[0, 0.1, 0], w=[0, 0, 3], c=0.94)
    rt.set_data("block2", geom="Parallelepipeds", pos=[[-6, 0, -1]], u=[12, 0, 0], v=[0, 4, 0], w=[0, 0, 0.1], c=0.94)

    # Setup lights and the camera:

    rt.setup_light("light1", light_type="Parallelogram", pos=[-2.5, 2.5, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[6, 5.7, 5.4])
    rt.setup_light("light2", light_type="Parallelogram", pos=[-0.5, 3.2, 0], u=[0.8, 0, 0], v=[0, 0, 0.8], color=[8, 7.6, 7.2])
    rt.setup_light("light3", light_type="Parallelogram", pos=[1.5, 2.5, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[6, 5.7, 5.4])
    rt.setup_camera("cam1", cam_type="DoF", eye=[0, 0.4, 6], target=[0, 1, 0], aperture_radius=0.025, fov=35, focal_scale=0.9)

    # Make some bubbles:

    n = 20
    x = np.linspace(-3, 3, n)
    r = 0.3*np.cos(0.4*x)

    y = 0.8*np.sin(x) + 1.2
    z = 0.8*np.cos(x) + 0.4
    b1 = np.stack((x, y, z)).T
    rt.set_data("bubbles1", mat="thin", pos=b1, r=r, c=0.5+0.5*map_to_colors(x, "rainbow"))

    y = 0.8*np.sin(x + 3) + 1.2
    z = 0.8*np.cos(x + 3) + 0.4
    b2 = np.stack((x, y, z)).T
    rt.set_data("bubbles2", geom="ParticleSetTextured", mat="thin2", pos=b2, r=r)

    y = np.sin(x + 2) + 1.2
    z = np.cos(x + 2) + 0.4
    b3 = np.stack((x, y, z)).T
    rt.set_data("beads", mat="glass", pos=b3, r=0.75*r, c=10)

    y = np.sin(x + 5) + 1.3
    z = np.cos(x + 5) + 0.3
    b4 = np.stack((x, y, z)).T
    rt.set_data("balls", pos=b4, r=0.75*r, c=0.92)

    # Let's start:
    rt.start()

    print("done")
Пример #14
0
def main():

    # Make some data first:

    n = 50000

    xyz = 3 * (np.random.random((n, 3)) - 0.5)
    r = 0.1 * (1 - (xyz[:, 0] / 3 + 0.5)) + 0.02
    s = np.sum(xyz, axis=1)

    particles = xyz[s > 0.2]
    rp = r[s > 0.2]
    # Use xyz positions to calculate RGB color components:
    cp = particles / 3 + 0.5

    cubes = xyz[s < -0.2]
    rc = r[s < -0.2]
    # Map Y-coordinate to matplotlib's color map RdYlBu: map_to_colors()
    # function is automatically scaling the data to fit <0; 1> range.
    # Any other mapping is OK, just keep the result in shape
    # (n-data-points, 3), where 3 stands for RGB color
    # components.
    cc = map_to_colors(cubes[:, 1], "RdYlBu")

    # Create plots:

    optix = TkOptiX()  # create and configure, show the window later

    # accumulate up to 30 frames (override default of 4 frames)
    optix.set_param(max_accumulation_frames=30)

    # white background
    optix.set_background(0.99)

    # add plots, ParticleSet geometry is default
    optix.set_data("particles", pos=particles, r=rp, c=cp)
    # and use geom parameter to specify cubes geometry;
    # Parallelepipeds can be described precisely with U, V, W vectors,
    # but here we only provide the r parameter - this results with
    # randomly rotated cubes of U, V, W lenghts equal to r
    optix.set_data("cubes", pos=cubes, r=rc, c=cc, geom="Parallelepipeds")

    # tetrahedrons look good as well, and they are really fast on RTX devices:
    #optix.set_data("tetras", pos=cubes, r=rc, c=cc, geom="Tetrahedrons")

    # if you prefer cubes aligned with xyz:
    #optix.set_data("cubes", pos=cubes, r=rc, c=cc, geom="Parallelepipeds", rnd=False)

    # or if you'd like some edges fixed:
    #v = np.zeros((rc.shape[0], 3)); v[:,1] = rc[:]
    #optix.set_data("cubes", pos=cubes, u=[0.05,0,0], v=v, w=[0,0,0.05], c=cc, geom="Parallelepipeds")

    # show coordinates box
    optix.set_coordinates()

    # show the UI window here - this method is calling some default
    # initialization for us, e.g. creates camera, so any modification
    # of these defaults should come below (or we provide on_initialization
    # callback)
    optix.show()

    # camera and lighting configured by hand
    optix.update_camera(eye=[5, 0, -8])
    optix.setup_light("light1",
                      color=10 * np.array([0.99, 0.9, 0.7]),
                      radius=2)

    print("done")
Пример #15
0
def main():

    # make some data first:
    rx = (-1, 1.8)
    rz = (-1, 1.8)
    n = 18

    x = np.linspace(rx[0], rx[1], n)
    z = np.linspace(rz[0], rz[1], n)

    X, Z = np.meshgrid(x, z)
    Y = np.sqrt(X**2 + Z**2)

    # positions of blocks
    data = np.stack((X.flatten(), np.zeros(n * n), Z.flatten())).T
    # heights of blocks
    v = np.zeros(data.shape)
    v[:, 1] = (Y.flatten() + 0.3 * np.random.rand(n * n))[:]

    optix = TkOptiX()  # create and configure, show the window later

    optix.set_param(max_accumulation_frames=50)  # accumulate up to 50 frames
    optix.set_background(0)  # black background
    optix.set_ambient([0, 0.2, 0.4])  # cold ambient light

    # add plot geometry
    size_u = 0.98 * (rx[1] - rx[0]) / (n - 1)
    size_w = 0.98 * (rz[1] - rz[0]) / (n - 1)
    optix.set_data("blocks",
                   pos=data,
                   u=[size_u, 0, 0],
                   v=v,
                   w=[0, 0, size_w],
                   c=np.random.rand(n * n),
                   geom="Parallelepipeds")

    # set camera and light position
    optix.setup_camera("cam1",
                       cam_type="DoF",
                       eye=[-0.3, 2, -0.3],
                       target=[1, 1, 1],
                       fov=60,
                       focal_scale=0.85)
    optix.setup_light("light1", pos=[3, 4.5, 1], color=[6, 5, 4.5], radius=2)

    # AI denoiser includes exposure and gamma corection, configured with the
    # same variables as the Gamma postprocessing algorithm.
    optix.set_float("tonemap_exposure", 0.5)
    optix.set_float("tonemap_gamma", 2.2)

    # Denoiser blend allows for different mixing with the raw image. Its value
    # can be modified also during the ray tracing.
    # Note: denoising is applied when > 4 accumulation frames are completed.
    optix.set_float("denoiser_blend", 0.25)
    optix.add_postproc("Denoiser")

    # Postprocessing stages are applied after AI denoiser (even if configured
    # in a different order).

    optix.set_float("levels_low_range", 0.1, 0.05, -0.05)
    optix.set_float("levels_high_range", 0.95, 0.85, 0.8)
    optix.add_postproc("Levels")

    optix.start()
    print("done")
Пример #16
0
def main():

    # make some data first:
    rx = (-1, 1.8)
    rz = (-1, 1.8)
    n = 18

    x = np.linspace(rx[0], rx[1], n)
    z = np.linspace(rz[0], rz[1], n)

    X, Z = np.meshgrid(x, z)
    Y = np.sqrt(X**2 + Z**2)

    # positions of blocks
    data = np.stack((X.flatten(), np.zeros(n * n), Z.flatten())).T
    # heights of blocks
    v = np.zeros(data.shape)
    v[:, 1] = (Y.flatten() + 0.3 * np.random.rand(n * n))[:]

    optix = TkOptiX()  # create and configure, show the window later

    optix.set_param(max_accumulation_frames=50)  # accumulate up to 50 frames
    optix.set_background(0)  # black background
    optix.set_ambient([0, 0.2, 0.4])  # cold ambient light

    # add plot geometry
    size_u = 0.98 * (rx[1] - rx[0]) / (n - 1)
    size_w = 0.98 * (rz[1] - rz[0]) / (n - 1)
    optix.set_data("blocks",
                   pos=data,
                   u=[size_u, 0, 0],
                   v=v,
                   w=[0, 0, size_w],
                   c=np.random.rand(n * n),
                   geom="Parallelepipeds")

    # set camera and light position
    optix.setup_camera("cam1",
                       cam_type="DoF",
                       eye=[-0.3, 2, -0.3],
                       target=[1, 1, 1],
                       fov=60,
                       focal_scale=0.85)
    optix.setup_light("light1", pos=[3, 4.5, 1], color=[6, 5, 4.5], radius=2)

    # Postprocessing configuration - uncomment what you'd like to include
    # or comment out all stages to see raw image. Try also combining
    # the mask overlay with one of tonal or levels corrections.

    # 1. Levels adjustment.
    #optix.set_float("levels_low_range", 0.1, 0.05, -0.05)
    #optix.set_float("levels_high_range", 0.9, 0.85, 0.8)
    #optix.add_postproc("Levels")

    # 2. Gamma correction.
    #optix.set_float("tonemap_exposure", 0.8)
    #optix.set_float("tonemap_igamma", 1 / 1.0)
    #optix.add_postproc("Gamma")

    # 3. Tonal correction with a custom curve.
    optix.set_float("tonemap_exposure", 0.8)
    # correction curve set explicitly:
    optix.set_texture_1d("tone_curve_gray", np.sqrt(np.linspace(0, 1, 64)))
    # correction curve calculated from control input/output values
    # (convenient if the curve was prepared in an image editor)
    #optix.set_correction_curve([[13,51], [54, 127], [170, 192]])
    optix.add_postproc("GrayCurve")

    # 4. Tonal correction with a custom RGB curves.
    #optix.set_float("tonemap_exposure", 0.8)
    #optix.set_texture_1d("tone_curve_r", np.sqrt(np.linspace(0.1, 1, 64)))
    #optix.set_texture_1d("tone_curve_g", np.sqrt(np.linspace(0, 1, 64)))
    #optix.set_texture_1d("tone_curve_b", np.sqrt(np.linspace(0, 1, 64)))
    #optix.add_postproc("RgbCurve")

    # 5. Overlay with a mask.
    #mx = (-1, 1)
    #mz = (-1, 1)
    #nm = 20

    #x = np.linspace(mx[0], mx[1], nm)
    #z = np.linspace(mz[0], mz[1], nm)

    #Mx, Mz = np.meshgrid(x, z)
    #M = np.abs(Mx) ** 3 + np.abs(Mz) ** 3
    #M = 1 - (0.6 / np.max(M)) * M

    #optix.set_texture_2d("frame_mask", M)
    #optix.add_postproc("Mask")

    optix.start()
    print("done")
Пример #17
0
def main():

    # Make some data first (arbitrary scles):

    data = np.random.normal(2, 0.8, 1000)
    h, x = np.histogram(data, bins=15, range=(0, 4))
    s = np.cumsum(h) / np.sum(h)
    e = 6 * np.sqrt(h) / np.sum(h)
    h = 3 * h / np.sum(h)
    bin_size = x[1] - x[0]

    # Create the plot:
    optix = TkOptiX()  # create and configure, show the window later

    # accumulate more frames (override default of step=1 and max=4 frames)
    optix.set_param(min_accumulation_step=2, max_accumulation_frames=100)

    # Add data:
    # - pos argument is used for bar positions
    # - u and w vectors are used to set base x and z sizes
    # - v is used to set bar heights.

    ps = np.zeros((h.shape[0], 3))
    ps[:, 0] = x[:-1]
    vs = np.zeros((h.shape[0], 3))
    vs[:, 1] = s
    optix.set_data("cumulative",
                   pos=ps,
                   u=[0.9 * bin_size, 0, 0],
                   v=vs,
                   w=[0, 0, 0.8 * bin_size],
                   c=[0.6, 0, 0],
                   geom="Parallelepipeds")

    ph = np.zeros((h.shape[0], 3))
    ph[:, 0] = x[:-1]
    ph[:, 2] = bin_size
    vh = np.zeros((h.shape[0], 3))
    vh[:, 1] = h
    optix.set_data("density",
                   pos=ph,
                   u=[0.9 * bin_size, 0, 0],
                   v=vh,
                   w=[0, 0, 0.8 * bin_size],
                   c=0.95,
                   geom="Parallelepipeds")

    pe = np.zeros((e.shape[0], 3))
    pe[:, 0] = x[:-1]
    pe[:, 1] = h
    pe[:, 2] = bin_size
    ve = np.zeros((e.shape[0], 3))
    ve[:, 1] = e
    optix.set_data("error",
                   pos=pe,
                   u=[0.9 * bin_size, 0, 0],
                   v=ve,
                   w=[0, 0, 0.8 * bin_size],
                   c=map_to_colors(e, "Blues"),
                   geom="Parallelepipeds")

    # Setup camera and light:
    optix.setup_camera("cam",
                       eye=[x[0], 1.5 * np.amax((h, s + e)), x[-1] - x[0]],
                       target=[(x[0] + x[-1]) / 2, 0, 0])
    optix.setup_light("l1", color=10)

    # show the UI window
    optix.show()

    print("done")
Пример #18
0
def main():
    b = 7000  # number of curves
    n = 60  # number pf nodes per curve
    dt = 0.08  # nodes distance

    ofs = 50 * np.random.rand(3)
    inp = 5 * np.random.rand(b, 3, 4) - 2.5
    for c in range(b):
        inp[c, 1:, :3] = inp[c, 0, :3]
        inp[c, :, 0] *= 1.75  # more spread in X
        inp[c, :, 3] = ofs  # sync the 4'th dim of the noise
    #print(inp)

    pos = np.zeros((b, n, 3), dtype=np.float32)
    r = np.zeros((b, n), dtype=np.float32)

    rnd = simplex(inp)
    #print(rnd)

    for t in range(n):
        rt = 2.0 * (t + 1) / (n + 2) - 1
        rt = 1 - rt * rt
        r[:, t] = 0.07 * rt * rt
        for c in range(b):
            mag = np.linalg.norm(rnd[c])
            r[c, t] *= 0.2 + 0.8 * mag  # modulate thickness

            rnd[c] = (dt / mag) * rnd[c]  # normalize and scale the step size
            inp[c, :, :3] += rnd[c]  # step in the field direction
            pos[c, t] = inp[c, 0, :3]

        rnd = simplex(inp, rnd)  # calculate noise at the next pos

    rt = TkOptiX(start_now=False)
    rt.set_param(
        min_accumulation_step=1,
        max_accumulation_frames=200,
        rt_timeout=100000  # accept lower fps
    )

    exposure = 1.2
    gamma = 1.8
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.set_float("denoiser_blend", 0.25)
    rt.add_postproc("Denoiser")

    rt.setup_material("plastic", m_plastic)

    for c in range(b):
        if np.random.uniform() < 0.05:
            rt.set_data("c" + str(c),
                        pos=pos[c],
                        r=1.1 * r[c],
                        c=[0.4, 0, 0],
                        geom="BezierChain")
        else:
            rt.set_data("c" + str(c),
                        pos=pos[c],
                        r=r[c],
                        c=0.94,
                        geom="BezierChain",
                        mat="plastic")

    rt.setup_camera("dof_cam",
                    eye=[0, 0, 12],
                    target=[0, 0, 0],
                    fov=57,
                    focal_scale=0.7,
                    cam_type="DoF")

    rt.setup_light("l1",
                   pos=[8, -3, 13],
                   color=1.5 * np.array([0.99, 0.97, 0.93]),
                   radius=5)
    rt.setup_light("l2",
                   pos=[-17, -7, 5],
                   u=[0, 0, -10],
                   v=[0, 14, 0],
                   color=1 * np.array([0.25, 0.28, 0.35]),
                   light_type="Parallelogram")
    rt.set_ambient([0.05, 0.07, 0.09])
    rt.set_background(0)
    rt.show()

    print("done")
Пример #19
0
def main():

    # Setup the raytracer:

    rt = TkOptiX()

    rt.set_param(min_accumulation_step=2,      # update image every 2 frames
                 max_accumulation_frames=250)  # accumulate 250 frames
    rt.set_uint("path_seg_range", 5, 15)       # allow many reflections/refractions

    exposure = 1.5; gamma = 2.2
    rt.set_float("tonemap_exposure", exposure)
    rt.set_float("tonemap_gamma", gamma)
    rt.add_postproc("Denoiser")                # AI denoiser, or the gamma correction only.
    #rt.add_postproc("Gamma")                  #    *** but not both together ***

    rt.set_background(0)
    rt.set_ambient(0)

    # Setup texture:

    # in one go, with gamma and exposure parameters saved to the scene:
    rt.load_texture("rainbow", "data/rainbow.jpg", prescale=0.3, baseline=0.7, gamma=2.2)

    # or through ndarray, allowing for custom processing:
    #rainbow = 0.7 + 0.3 * read_image("data/rainbow.jpg", normalized=True)
    #rainbow = make_color_2d(rainbow, gamma=2.2, channel_order="RGBA")
    #rt.set_texture_2d("rainbow", rainbow)

    # Setup materials:

    m_thin2 = copy.deepcopy(m_thin_walled)     # textured material based on the predefined thin-walled material
    m_thin2["ColorTextures"] = [ "rainbow" ]   # reference texture by name

    rt.setup_material("glass", m_clear_glass)
    rt.setup_material("thin", m_thin_walled)
    rt.setup_material("thin2", m_thin2)

    # Prepare a simple scene objects, camera and lights:

    rt.set_data("plane", geom="Parallelograms", pos=[[-15, 0, -15]], u=[30, 0, 0], v=[0, 0, 30], c=0.94)
    rt.set_data("block1", geom="Parallelepipeds", pos=[[-6, -0.07, -1]], u=[12, 0, 0], v=[0, 0.1, 0], w=[0, 0, 3], c=0.94)
    rt.set_data("block2", geom="Parallelepipeds", pos=[[-6, 0, -1]], u=[12, 0, 0], v=[0, 4, 0], w=[0, 0, 0.1], c=0.94)

    # Setup lights and the camera:

    rt.setup_light("light1", light_type="Parallelogram", pos=[-2.5, 2.5, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[6, 5.7, 5.4])
    rt.setup_light("light2", light_type="Parallelogram", pos=[-0.5, 3.2, 0], u=[0.8, 0, 0], v=[0, 0, 0.8], color=[8, 7.6, 7.2])
    rt.setup_light("light3", light_type="Parallelogram", pos=[1.5, 2.5, 3], u=[0.8, 0, 0], v=[0, -0.8, 0], color=[6, 5.7, 5.4])
    rt.setup_camera("cam1", cam_type="DoF", eye=[0, 0.4, 6], target=[0, 1, 0], aperture_radius=0.025, fov=35, focal_scale=0.9)

    # Make some bubbles:

    n = 20
    x = np.linspace(-3, 3, n)
    r = 0.3*np.cos(0.4*x)

    y = 0.8*np.sin(x) + 1.2
    z = 0.8*np.cos(x) + 0.4
    b1 = np.stack((x, y, z)).T
    rt.set_data("bubbles1", mat="thin", pos=b1, r=r, c=0.5+0.5*map_to_colors(x, "rainbow"))

    y = 0.8*np.sin(x + 3) + 1.2
    z = 0.8*np.cos(x + 3) + 0.4
    b2 = np.stack((x, y, z)).T
    rt.set_data("bubbles2", geom="ParticleSetTextured", mat="thin2", pos=b2, r=r)

    y = np.sin(x + 2) + 1.2
    z = np.cos(x + 2) + 0.4
    b3 = np.stack((x, y, z)).T
    rt.set_data("beads", mat="glass", pos=b3, r=0.75*r, c=10)

    y = np.sin(x + 5) + 1.3
    z = np.cos(x + 5) + 0.3
    b4 = np.stack((x, y, z)).T
    rt.set_data("balls", pos=b4, r=0.75*r, c=0.92)

    # Let's start:
    rt.start()

    print("done")
Пример #20
0
def main():

    # make some data first:
    b = 4
    n = 200
    k = 9.1
    l = 1.1
    m = 7.1

    r0 = 0.06
    q = 11

    x = np.sin(np.linspace(0, 2 * b * k * np.pi, b * n))
    y = np.cos(np.linspace(0, 2 * b * l * np.pi, b * n))
    z = np.sin(np.linspace(0, 2 * b * m * np.pi, b * n))
    pos = np.stack((x, y, z)).T

    r = r0 * 0.5 * (1 +
                    np.sin(np.linspace(0, 2 * b * q * np.pi, b * n))) + 0.002

    # create and configure, show the window later
    optix = TkOptiX()

    optix.set_param(min_accumulation_step=2, max_accumulation_frames=64)
    optix.setup_material("plastic", m_plastic)

    optix.setup_camera("dof_cam",
                       cam_type="DoF",
                       eye=[-4, 3, 4],
                       target=[0, 0, 0],
                       up=[0.21, 0.86, -0.46],
                       focal_scale=0.75)

    # some exposure and gamma adjutments
    optix.set_float("tonemap_exposure", 0.9)
    optix.set_float("tonemap_gamma", 1.4)
    optix.add_postproc("Gamma")

    ################################################################################
    # Try one of the background / lighting settings:

    # ------------------------------------------------------------------------------
    # 1. Ray tracer is initialized in `AmbientLight` mode. There is a constant
    #    background color and an omnidirectional light with the color independent
    #    from the background:

    #optix.setup_light("l1", color=4*np.array([0.99, 0.95, 0.9]), radius=3)
    #optix.set_background([0, 0.02, 0.1]) # ambient and background colors can be
    #optix.set_ambient(0.4)               # RGB array or a gray level

    # ------------------------------------------------------------------------------
    # 2. `Default` (although not set by default initialization) mode uses
    #    background color to paint the background and as the ambient light,
    #    so a brighter one is better looking here:

    #optix.set_background_mode("Default")
    #optix.setup_light("l1", color=np.array([0.99, 0.95, 0.9]), radius=3) # just a little light from the side
    #optix.set_background(0.94)

    # ------------------------------------------------------------------------------
    # 3. Environment map. Background texture is projected on the sphere with
    #    infinite radius, and it is also the source of the ambient light.

    # make a small RGB texture with a vertical gradient
    a = np.linspace(0.94, 0, 10)
    b = np.zeros((10, 2, 3))
    for i in range(10):
        b[i, 0] = np.full(3, a[i])
        b[i, 1] = np.full(3, a[i])

    # extend to RGBA (RGB is fine to use with `set_background()`, but is converted to
    # RGBA internally anyway)
    bg = np.zeros((10, 2, 4), dtype=np.float32)
    bg[:, :, :-1] = b

    optix.set_background_mode("TextureEnvironment")
    optix.setup_light("l1", color=np.array([0.99, 0.95, 0.9]),
                      radius=3)  # just a little light from the side
    optix.set_background(bg)

    # ------------------------------------------------------------------------------
    # 4. Fixed background texture. Background is just a wallpaper, you need to setup
    #    ambient light and/or other lights.

    # make a small RGB texture with a vertical gradient
    #a = np.linspace(0.94, 0, 10)
    #b = np.zeros((10, 2, 3))
    #for i in range(10):
    #    b[i,0]=np.full(3, a[i])
    #    b[i,1]=np.full(3, a[i])

    #optix.set_background_mode("TextureFixed")
    #optix.setup_light("l1", color=4*np.array([0.99, 0.95, 0.9]), radius=3)
    #optix.set_background(b)
    #optix.set_ambient(0.4)

    # ------------------------------------------------------------------------------
    # Note: background mode, lights, colors and textures can be all updated also
    # after the window is open, while the ray tracing running.
    ################################################################################

    # create a plot of parametric curve calculated above, and open the window
    optix.set_data("plot",
                   pos=pos,
                   r=r,
                   c=0.94,
                   geom="BezierChain",
                   mat="plastic")
    #optix.set_data("plot", pos=pos, r=r, c=0.94, geom="BSplineQuad", mat="plastic")
    #optix.set_data("plot", pos=pos, r=r, c=0.94, geom="BSplineCubic", mat="plastic")
    #optix.set_data("plot", pos=pos, r=r, c=0.94, geom="SegmentChain", mat="plastic")

    optix.start()

    print(optix.get_background_mode())

    print("done")