User Tools

Site Tools


Sidebar

Dan's Wiki

DokuWiki Instructions (local) DokuWiki Manual
Site Checker (Orphans Wanted)

Edit Sidebar

projects:houseofcards:start

This is an old revision of the document!


House of Cards Blender Project

Wanting to make a huge virtual house of cards and placing a large picture, tiling across certain panels of the cards. Need to UV map to portion of a big graphic with Python scripting.

Initial proof of concept jittered. Fixed by changing Scene→Rigid Body World → Steps Per Second from 60 to 120.

My example c:\Projects\HouseOfCards\panelTest.blend has one object “Panel” which has two material slots,

  • Pink
  • Card Face

In Python console, to look at the “Panel” dominoe:

dir (bpy.data.objects["Panel"]);

Returns lots of methods, values.

ob = bpy.data.objects["Panel"];
print (ob.active_material.name);
// -> Pink
>> type(ob.material_slots);
<class 'bpy_prop_collection'>
 
>>> len(ob.material_slots);
2
 
>>> list(ob.material_slots);
[bpy.data.objects['Panel'].material_slots[0], 
  bpy.data.objects['Panel'].material_slots[1]]

Show name of material slot (there are two in this example)

>> ob.material_slots[0].name
'Card Face'

Show vertices

ob = bpy.data.objects["Panel"];
mesh = ob.data;
for vertex in mesh.vertices:
   print(vertex.co)

Following need to be run in Object mode

UVs are stored in a UV layer:

for loop in ob.data.loops :
    uv_coords = ob.data.uv_layers[0].data[loop.index].uv
    print(uv_coords)

Vertices

ob = bpy.data.objects["Panel"];
mesh = ob.data;
for vertex in mesh.vertices:
   print(vertex.co)

Assigned vertices of card front and back to Vertex Groups:

Card FrontCard Rank/Suit
Card BackCard Back - Photo

Let's find the vertex groups, to print out their UVs:

ob = bpy.data.objects["Panel"];
vgCardBack = ob.vertex_groups['Card Back'];
print('Card Back');
for vertex in vgCardBack.vertices:
   print(vertex.co)
vgCardFront = ob.vertex_groups['Card Front'];
print('Card Front');
for vertex in vgCardFront.vertices:
   print(vertex.co)

Find vertices in Vertex Group

Original, from http://blenderartists.org/forum/showthread.php?252350-Selecting-vertices-of-a-vertex-group

import bpy
 
# find the index of the target group
for obj in bpy.data.objects:
  if type(obj.data) != bpy.types.Mesh:
    continue
 
  # This is an Object with a Mesh, see if it has the supported group name
  groupIndex = -1
  for i in range(0, len(obj.vertex_groups)):
    group = obj.vertex_groups[i]
    if group.name == "Test":
      groupIndex = i
 
  print("Checking %s for assigned vertices." % (obj.name))
 
  # Now access the vertices that are assigned to this group
  mesh = obj.data
  for v in mesh.vertices:
 
    for vertGroup in v.groups:
      if vertGroup.group == groupIndex:
 
        print("Vertex %d is part of group."%(v.index))

Modified to work with “Panel” example blend file:

import bpy
 
# find the index of the target group
ob = bpy.data.objects["Panel"];
 
# Print all vertices
mesh = ob.data;
for vertex in mesh.vertices:
   print(vertex.co)
 
 
# This is an Object with a Mesh, see if it has the supported group name
groupIndex = -1
for i in range(0, len(ob.vertex_groups)):
   group = ob.vertex_groups[i]
   if group.name == "Card Back":
      groupIndex = i
 
print("Checking %s for assigned vertices." % (ob.name))
 
# Now access the vertices that are assigned to this group
mesh = ob.data
for v in mesh.vertices:
 
   for vertGroup in v.groups:
      if vertGroup.group == groupIndex:
         print("Vertex %d is part of group."%(v.index))

Using BMesh

https://www.blender.org/api/blender_python_api_2_77_1/bmesh.html#module-bmesh

import bpy
import bmesh
 
ob = bpy.data.objects["Panel"];
 
# Get the active mesh
me = ob.data
 
# Get a BMesh representation
bm = bmesh.new()   # create an empty BMesh
bm.from_mesh(me)   # fill it in from a Mesh
 
# Modify the BMesh, can do anything here...
for v in bm.verts:
    v.co.x -= 1.0
 
# Finish up, write the bmesh back to the mesh
bm.to_mesh(me)
bm.free()  # free and prevent further access

Shows Vertexes and UVs

import bpy
import bmesh
 
ob = bpy.data.objects["Panel"];
 
# Get the active mesh
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
 
for face in bm.faces:
    print("face index %d" % face.index);
    for loop in face.loops:
        uv = loop[uv_lay].uv
        print("Loop UV: %f, %f" % uv[:])
        vert = loop.vert
        print("Loop Vertex: (%f,%f,%f)" % vert.co[:])
 
projects/houseofcards/start.1467659652.txt.gz · Last modified: 2016/07/04 19:14 by dwheele