NFT
1

 
 
Hi

Genesis

Policy: 9ff102...100a
Owner:

    Metadata:

    {
      "name": "Genesis",
      "files": [
        {
          "src": "ipfs://QmXS1iD8jjeXuEPZguRbbQWU8dnEcymigJpDdyGQ7Wa1nc",
          "name": "Genesis",
          "mediaType": "model/gltf-binary"
        },
        {
          "src": [
            "{'index': '0000', 'name': 'Genesis', 'composition': 'horizontal",
            "', 'textures': {'front': {'index': 0, 'num_props': 0, 'properti",
            "es': {'multipliers': [], 'colors': [], 'distributions': [], 'ro",
            "tations': []}}, 'right': {'index': 0, 'num_props': 0, 'properti",
            "es': {'multipliers': [], 'colors': [], 'distributions': [], 'ro",
            "tations': []}}, 'rear': {'index': 0, 'num_props': 0, 'propertie",
            "s': {'multipliers': [], 'colors': [], 'distributions': [], 'rot",
            "ations': []}}, 'left': {'index': 0, 'num_props': 0, 'properties",
            "': {'multipliers': [], 'colors': [], 'distributions': [], 'rota",
            "tions': []}}, 'top': {'index': 0, 'num_props': 0, 'properties':",
            " {'multipliers': [], 'colors': [], 'distributions': [], 'rotati",
            "ons': []}}, 'bottom': {'index': 0, 'num_props': 0, 'properties'",
            ": {'multipliers': [], 'colors': [], 'distributions': [], 'rotat",
            "ions': []}}}}"
          ],
          "name": "Genesis",
          "mediaType": "text/json"
        },
        {
          "src": [
            "# unspins.qoob v1.1",
            "import bpy",
            "from bpy import context, data, ops",
            "import numpy as np",
            "import math",
            "import json",
            "from PIL import Image, ImageDraw",
            "",
            "# Set texture dimensions",
            "dim = 1024",
            "",
            "# Provide JSON file name with metadata",
            "qoob_json = 'qoob.json'",
            "",
            "with open(qoob_json) as f:",
            "    qoob = json.load(f)",
            "",
            "def norm(x , mean , std):",
            "    p = (np.pi*std) * np.exp(-0.5*((x-mean)/std)**2)",
            "    return p",
            "",
            "def scale_make2d(s,res):",
            "    u_range = 4294967293",
            "    scaled = np.interp(s, (s.min(), s.max()), (0, u_range))",
            "    two_d = np.tile(scaled, (res, 1))",
            "    return two_d",
            "",
            "def gen_face(face,res):",
            "    x = list(range(res))",
            "    u_range = 4294967293",
            "    mean = np.mean(x)",
            "    std = res /6",
            "    r = list(range(0,int(res/2)))",
            "    ramp = r + r[::-1]",
            "    p_1d = np.array(ramp)",
            "    c_1d = np.array(range(0,res))",
            "",
            "",
            "    p_2d = scale_make2d(p_1d,res)",
            "    c_2d = scale_make2d(c_1d,res)",
            "    dists = {'Normal': p_2d, 'CDF': c_2d}",
            "    channels = {'Red': 0, 'Green': 1, 'Blue': 2}",
            "    idx = face['index']",
            "    props = face['properties']",
            "    n = np.zeros((res, res, 3)).astype(np.uint32)",
            "    print(' - Generating texture: ' + str(idx).zfill(4))",
            "",
            "    for i in range(face['num_props']):",
            "        mult = props['multipliers'][i]",
            "        col = props['colors'][i]",
            "        dist = props['distributions'][i]",
            "        rot = props['rotations'][i]",
            "        c = channels[col]",
            "        buffer =  mult * np.rot90(dists[dist], k=(rot / 90))",
            "        n[ :, :, c ] = n[ :, :, c ] + buffer",
            "",
            "    n = np.interp(n, (0, u_range), (0, 255)).astype(np.uint8)",
            "    pil_texture = Image.fromarray(n)",
            "",
            "    return pil_texture",
            "",
            "def gen_texture(qoob):",
            "    xm = int(dim / 2)",
            "    bg = Image.new('RGBA', (dim * 4, dim * 4), (0,0,0,0))",
            "    draw = ImageDraw.Draw(bg)",
            "    ftop = gen_face(qoob['textures']['top'],dim+2)",
            "    ffront = gen_face(qoob['textures']['front'],dim)",
            "    fbottom = gen_face(qoob['textures']['bottom'],dim+2)",
            "    fleft = gen_face(qoob['textures']['left'],dim+2)",
            "    fright = gen_face(qoob['textures']['right'],dim+2)",
            "    frear = gen_face(qoob['textures']['rear'],dim+2)",
            "",
            "",
            "    bg.paste(im=ftop,box=(xm+dim-1, 0))",
            "    bg.paste(im=ffront,box=(xm+dim, dim))",
            "    bg.paste(im=fbottom,box=(xm+dim-1, dim * 2))",
            "    bg.paste(im=fleft,box=(xm-1, dim-1))",
            "    bg.paste(im=fright,box=(xm-1 + dim * 2, dim-1))",
            "",
            "    if qoob['composition'] == 'vertical':",
            "        bg.paste(im=frear,box=(xm+dim-1, dim * 3))",
            "    if qoob['composition'] == 'horizontal':",
            "        frear = frear.transpose(Image.ROTATE_180)",
            "        bg.paste(im=frear,box=(xm+dim-1, dim * 3))",
            "",
            "    bg = bg.transpose(Image.FLIP_TOP_BOTTOM)",
            "    bn = 1.0 / 255.0",
            "    bt = bpy.data.images.new('uvmap', ",
            "                             width=dim*4,",
            "                             height=dim*4,",
            "                             alpha=True)",
            "    bg = bg.convert('RGBA')",
            "    bt.pixels.foreach_set((np.asarray(bg,",
            "                                      dtype=np.float32)",
            "                           *bn).ravel())",
            "    bt.pack()",
            "    return bt",
            "",
            "if __name__ == '__main__':",
            "    ",
            "    qbid = qoob['index']",
            "    print('- Creating qoob'+qbid)",
            "    ",
            "    for item in bpy.data.objects:",
            "        bpy.data.objects.remove(item)",
            "",
            "",
            "    hig = dim/1000",
            "    lev = dim/10000",
            "    alt = hig*math.sqrt(3)/2",
            "    mesh = bpy.ops.mesh",
            "    mesh.primitive_cube_add(location=(0,0,0),size=hig)",
            "    bpy.context.object.name = 'qoob'",
            "    bpy.context.object.data.name = 'qoob'",
            "",
            "    for m in bpy.data.materials:",
            "        bpy.data.materials.remove(m)",
            "        bpy.ops.object.material_slot_remove()",
            "",
            "    scene = bpy.data.scenes['Scene']",
            "    bpy.data.objects['qoob'].select_set(True)",
            "    mat = bpy.data.materials.new(name='Material')",
            "    mat.use_nodes = True",
            "    bsdf = mat.node_tree.nodes['Principled BSDF']",
            "    ti = mat.node_tree.nodes.new('ShaderNodeTexImage')",
            "    ti.image = gen_texture(qoob)",
            "    mlinks = mat.node_tree.links",
            "    mlinks.new(bsdf.inputs['Base Color'], ti.outputs['Color'])",
            "    mlinks.new(bsdf.inputs['Emission'], ti.outputs['Color'])",
            "    mat.blend_method = 'BLEND'",
            "    ctx = context.view_layer.objects.active",
            "    ctx.data.materials.append(mat)",
            "    bsdf.inputs['Metallic'].default_value=0.3",
            "    bsdf.inputs['Specular'].default_value=0.5",
            "    bsdf.inputs['Roughness'].default_value=0.25",
            "    bsdf.inputs['Sheen Tint'].default_value=0.5",
            "    bsdf.inputs['IOR'].default_value=1.87",
            "    bsdf.inputs['Emission Strength'].default_value=0.7",
            "    bsdf.inputs['Alpha'].default_value= 0.9",
            "    scene.render.engine = 'BLENDER_EEVEE'",
            "",
            "",
            "    scene.frame_start = 0",
            "    scene.frame_end = 960",
            "    obj = bpy.context.active_object",
            "    obj.rotation_euler[0] = math.radians(45)",
            "    obj.rotation_euler[1] = math.radians(35.26)",
            "    obj.rotation_euler[2] = math.radians(-90)",
            "    obj.keyframe_insert(data_path='rotation_euler', frame=0)",
            "",
            "    obj.rotation_euler[0] = math.radians(45)",
            "    obj.rotation_euler[1] = math.radians(395.26)",
            "    obj.rotation_euler[2] = math.radians(630)",
            "    obj.keyframe_insert(data_path='rotation_euler', frame=960)",
            "",
            "    for i in range(30,961,60):",
            "        obj.location = 0, 0, alt + lev/2",
            "        obj.keyframe_insert(data_path='location', frame=i)",
            "",
            "    for i in range(60,961,120):",
            "        obj.location = 0, 0, alt + lev",
            "        obj.keyframe_insert(data_path='location', frame=i)",
            "",
            "    for i in range(0,961,120):",
            "        obj.location = 0, 0, alt",
            "        obj.keyframe_insert(data_path='location', frame=i)",
            "        ",
            "    fco = obj.animation_data.action.fcurves",
            "    fcc = len(fco.items())",
            "    for i in range(fcc):",
            "        fc = fco[i]",
            "        for mod in fc.modifiers:",
            "            try:",
            "                fc.modifiers.remove(mod)",
            "            except:",
            "                pass",
            "",
            "",
            "        modifier = fc.modifiers.new(type='CYCLES')",
            "        modifier.mode_before = 'REPEAT'",
            "        modifier.mode_after = 'REPEAT'",
            "",
            "    mesh = bpy.ops.mesh",
            "    mesh.primitive_uv_sphere_add(radius=0.000000001,",
            "                                 enter_editmode=False,",
            "                                 align='WORLD',",
            "                                 location=(0,0,alt+lev))",
            "    bpy.context.object.name = 'dome'",
            "    bpy.context.object.data.name = 'dome'",
            "    ",
            "    ctx= bpy.context.copy()",
            "    ctx['active_object'] = None",
            "",
            "    print('- Exporting ' + 'qoob'+qbid+'.glb')",
            "    bpy.ops.export_scene.gltf(",
            "        ctx,",
            "        export_format='GLB', ",
            "        export_image_format='AUTO', ",
            "        export_texcoords=True, ",
            "        export_materials='EXPORT', ",
            "        export_colors=True, ",
            "        export_cameras=False,",
            "        export_apply=False, ",
            "        export_animations=True, ",
            "        export_frame_range=True, ",
            "        export_frame_step=1, ",
            "        export_lights=False,  ",
            "        filepath='qoob'+qbid, ",
            "        filter_glob='*.glb'",
            "        )"
          ],
          "code": "qoob.py",
          "mediaType": "text/python"
        },
        {
          "env": "qoob.yml",
          "src": [
            "name: qoob",
            "channels:",
            "  - defaults",
            "dependencies:",
            "  - python=3.8.8",
            "  - numpy=1.21.2",
            "  - pillow=8.4.0",
            "  - json=2.0.9",
            "  - bpy=3.0.1"
          ],
          "mediaType": "text/yaml"
        }
      ],
      "image": "ipfs://QmNWYE1c6sJvwvvJHNFKWKU4CDzHoUXmjSfi5jRVxvNhii",
      "index": "0000",
      "Creator": "WooH",
      "Project": "unspins.qoob",
      "Website": "https://unspins.io/",
      "mediaType": "image/png",
      "Properties": {
        "Sum": 0,
        "Textures": {
          "top": "0000",
          "left": "0000",
          "rear": "0000",
          "front": "0000",
          "right": "0000",
          "bottom": "0000"
        },
        "Composition": "Horizontal",
        "Occurrences": 6
      },
      "Description": "Algorithmic 3D Art"
    }
    ...cl1ck