User Tools

Site Tools


projects:houseofcards:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projects:houseofcards:start [2016/07/04 19:14]
dwheele
projects:houseofcards:start [2017/11/18 18:03] (current)
dwheele
Line 7: Line 7:
   * [[pythonoperators|Python Operators from Blender]]   * [[pythonoperators|Python Operators from Blender]]
   * [[cardfaceinfo|Card Face Graphic Info]]   * [[cardfaceinfo|Card Face Graphic Info]]
 +  * [[blenderarraynumbering|Blender Array Numbering]]
 +  * [[shufflecards|Shuffle Cards Routine in Python]]
 +  * [[physicssettings|Physics Settings]]
 +  * [[workingpython|Work Python Scripts (backup)]]
 +  * [[playingcardspecifics|Playing Card Specifics]]
  
 My example ''c:\Projects\HouseOfCards\panelTest.blend'' has one object "Panel" which has two material slots, My example ''c:\Projects\HouseOfCards\panelTest.blend'' has one object "Panel" which has two material slots,
Line 54: Line 59:
 **Following need to be run in Object mode** **Following need to be run in Object mode**
  
-UVs are stored in a UV layer:+==== Printing UVs for Object ==== 
 + 
 +UVs are stored in a UV layer, but still need to know which uv_layer goes with which face:
  
 <code python> <code python>
 +ob = bpy.data.objects["Panel"];
 +for uv_layer in ob.data.uv_layers:
 +    print("uv_layer: %s" % uv_layer.name)
 +
 for loop in ob.data.loops : for loop in ob.data.loops :
     uv_coords = ob.data.uv_layers[0].data[loop.index].uv     uv_coords = ob.data.uv_layers[0].data[loop.index].uv
-    print(uv_coords)+    print("Loop %d: %s" % (loop.index, uv_coords))
 </code> </code>
 +
 +==== Get UVs per Face, Example from web ====
 +
 +https://blenderartists.org/forum/showthread.php?254004-Accessing-UV-data-in-Python-script
 +
 +<code python>
 +import bpy
 +ob = bpy.data.objects["Panel"];
 +me = ob.data;
 +
 +for f in me.polygons:
 +    print("Polygon", f.index, "from loop index", f.loop_start, "and length", f.loop_total)
 +    for i in f.loop_indices: # <-- python Range object with the proper indices already set
 +        l = me.loops[i] # The loop entry this polygon point refers to
 +        v = me.vertices[l.vertex_index] # The vertex data that loop entry refers to
 +        print("\tLoop index", l.index, "points to vertex index", l.vertex_index, \
 +            "at position", v.co)
 +        for j,ul in enumerate(me.uv_layers):
 +            print("\t\tUV Map", j, "has coordinates", ul.data[l.index].uv, \
 +                "for this loop index")
 +</code>
 +
 +Noticing that the polygon where the vertex index set (2, 3, 6, 7, in my case) equals the set in the Vertex Group I defined, **has the proper UV set.**
 +
 +Their explanation:
 +
 +The me.loops object is really a lookup list, and each entry is NOT a loop in and of itself. The "loops" are really polygons and are stored in the me.polygons structure. Using me.polygons, you can slice the me.loops list into chunks.
 +
 +Running this on the default cube shows that me.polygons has six entries (the six faces of the cube). Each polygon refers to four loop indexes, making the me.loops list 24 entries long.
 +
 +Every UV layer in me.uv_layers has a "data" attribute that is a list that is the same length as the me.loops list. Every me.loops entry relates to the same index entry in the me.uv_layers[n].data list.
 +
 +
 +
 +==== Printing Vertices Per Mesh ====
  
 **Vertices** **Vertices**
Line 118: Line 164:
         print("Vertex %d is part of group."%(v.index))         print("Vertex %d is part of group."%(v.index))
 </code> </code>
 +
 +==== Non-BMesh, Working script ====
  
 Modified to work with "Panel" example blend file: Modified to work with "Panel" example blend file:
Line 128: Line 176:
  
 # Print all vertices # Print all vertices
 +print("\nPrinting all vertices.")
 mesh = ob.data; mesh = ob.data;
 for vertex in mesh.vertices: for vertex in mesh.vertices:
Line 135: Line 184:
 # This is an Object with a Mesh, see if it has the supported group name # This is an Object with a Mesh, see if it has the supported group name
 groupIndex = -1 groupIndex = -1
 +groupName = "Card Back"
 +
 for i in range(0, len(ob.vertex_groups)): for i in range(0, len(ob.vertex_groups)):
    group = ob.vertex_groups[i]    group = ob.vertex_groups[i]
-   if group.name == "Card Back":+   if group.name == groupName:
       groupIndex = i       groupIndex = i
  
-print("Checking %s for assigned vertices." % (ob.name))+print("Checking %s for assigned vertices, groupIndex is %f" % (ob.name, groupIndex))
  
 # Now access the vertices that are assigned to this group # Now access the vertices that are assigned to this group
Line 148: Line 199:
    for vertGroup in v.groups:    for vertGroup in v.groups:
       if vertGroup.group == groupIndex:       if vertGroup.group == groupIndex:
-         print("Vertex %d is part of group."%(v.index))+         print("Vertex %d is part of group %s."%(v.index, groupName)) 
 + 
 +# Find the UVs to go with these Vertices 
 </code> </code>
  
Line 179: Line 233:
  
 **Shows Vertexes and UVs** **Shows Vertexes and UVs**
 +
 +Per face.
  
 <code python> <code python>
Line 205: Line 261:
 </code> </code>
  
 +Let's try finding the face defined by the verts in the Vertex Group "Card Back".
 +
 +<code python>
 +import bpy
 +import bmesh
 +
 +ob = bpy.data.objects["Panel"];
 +me = ob.data
 +
 +# Get a BMesh representation
 +bm = bmesh.new()   # create an empty BMesh
 +bm.from_mesh(me)   # fill it in from a Mesh
 +uv_lay = bm.loops.layers.uv.active
 +
 +# Find the vertex group vertices
 +
 +groupIndex = -1
 +
 +# This is an Object with a Mesh, see if it has the supported group name
 +for i in range(0, len(ob.vertex_groups)):
 +   group = ob.vertex_groups[i]
 +   if group.name == "Card Back":
 +      groupIndex = i
 +
 +
 +# Now access the vertices that are assigned to this group
 +
 +bmVertGroupMembers = []
 +
 +for v in me.vertices:
 +   for vertGroup in v.groups:
 +      if vertGroup.group == groupIndex:
 +         print("Vertex %d is part of group."%(v.index))
 +         bmVertGroupMembers.new(v)
 +         
 +# Following doesn't work 
 +groupFace = bm.faces.get(bmVertGroupMembers);
 +
 +print ("groupFace len: %d" % len(groupFace))
 +
 +</code>
 +
 +Going back to non-BMESH method. In BMesh, it is difficult to assemble the correct types.
 +
 +==== Get Face from Mesh defined by Vertex Group ====
 +
 +<code python>
 +import bpy
 +ob = bpy.data.objects["Panel"];
 +
 +
 +def getFaceFromObjectContainingVertexGroup(ob, vertexGroupName):
 +
 +  # First, get list of Vertexes in Vertex Group
 +
 +  groupIndex = -1
 +
 +  # This is an Object with a Mesh, see if it has the supported group name
 +  for i in range(0, len(ob.vertex_groups)):
 +    group = ob.vertex_groups[i]
 +    if group.name == vertexGroupName:
 +      groupIndex = i
 +
 +  # if we didn't find it, exit
 +  if (groupIndex < 0):
 +    return null
 +
 +  # Now access the vertices that are assigned to this group
 +
 +  bmVertGroupMembers = []
 +
 +  for v in ob.data.vertices:
 +    for vertGroup in v.groups:
 +      if vertGroup.group == groupIndex:
 +         print("Vertex %d is part of group."%(v.index))
 +         bmVertGroupMembers.append(v)
 +
 +  # at this point, we have a list of vertices in bmVertGroupMembers
 +  # belonging to group vertexGroupName, with index groupIndex
 +         
 +for f in me.polygons:
 +    print("Polygon", f.index, "from loop index", f.loop_start, "and length", f.loop_total)
 +    for i in f.loop_indices: # <-- python Range object with the proper indices already set
 +        l = me.loops[i] # The loop entry this polygon point refers to
 +        v = me.vertices[l.vertex_index] # The vertex data that loop entry refers to
 +        print("\tLoop index", l.index, "points to vertex index", l.vertex_index, \
 +            "at position", v.co)
 +        for j,ul in enumerate(me.uv_layers):
 +            print("\t\tUV Map", j, "has coordinates", ul.data[l.index].uv, \
 +                "for this loop index")
 +
 +</code>
  
projects/houseofcards/start.1467659652.txt.gz · Last modified: 2016/07/04 19:14 by dwheele