﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3AIT%2F2.5%2FPy%2FScripts%2FCookbook%2FCode_snippets%2FArmatures</id>
	<title>Dev:IT/2.5/Py/Scripts/Cookbook/Code snippets/Armatures - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3AIT%2F2.5%2FPy%2FScripts%2FCookbook%2FCode_snippets%2FArmatures"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Armatures&amp;action=history"/>
	<updated>2026-05-09T15:27:51Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Armatures&amp;diff=105249&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Armatures&amp;diff=105249&amp;oldid=prev"/>
		<updated>2018-06-28T19:43:40Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 19:43時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Armatures&amp;diff=105248&amp;oldid=prev</id>
		<title>2011年8月10日 (水) 07:27にwiki&gt;ValterVBによる</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Armatures&amp;diff=105248&amp;oldid=prev"/>
		<updated>2011-08-10T07:27:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Page/Header|2.5x|Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Meshes|Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Three_ways_to_create_objects|100}}&lt;br /&gt;
=Armature=&lt;br /&gt;
==Armatura==&lt;br /&gt;
Questo programma crea un'armatura.&lt;br /&gt;
[[File:Code_Snippets_Armature.png|640px]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#---------------------------------------------------&lt;br /&gt;
# File armature.py&lt;br /&gt;
#---------------------------------------------------&lt;br /&gt;
import bpy, math&lt;br /&gt;
from mathutils import Vector, Matrix&lt;br /&gt;
&lt;br /&gt;
def createRig(name, origin, boneTable):&lt;br /&gt;
    # Create armature and object&lt;br /&gt;
    bpy.ops.object.add(&lt;br /&gt;
        type='ARMATURE', &lt;br /&gt;
        enter_editmode=True,&lt;br /&gt;
        location=origin)&lt;br /&gt;
    ob = bpy.context.object&lt;br /&gt;
    ob.show_x_ray = True&lt;br /&gt;
    ob.name = name&lt;br /&gt;
    amt = ob.data&lt;br /&gt;
    amt.name = name+'Amt'&lt;br /&gt;
    amt.show_axes = True&lt;br /&gt;
    &lt;br /&gt;
    # Create bones&lt;br /&gt;
    bpy.ops.object.mode_set(mode='EDIT')&lt;br /&gt;
    for (bname, pname, vector) in boneTable:        &lt;br /&gt;
        bone = amt.edit_bones.new(bname)&lt;br /&gt;
        if pname:&lt;br /&gt;
            parent = amt.edit_bones[pname]&lt;br /&gt;
            bone.parent = parent&lt;br /&gt;
            bone.head = parent.tail&lt;br /&gt;
            bone.use_connect = False&lt;br /&gt;
            (trans, rot, scale) = parent.matrix.decompose()&lt;br /&gt;
        else:&lt;br /&gt;
            bone.head = (0,0,0)&lt;br /&gt;
            rot = Matrix.Translation((0,0,0))	# identity matrix&lt;br /&gt;
        bone.tail = Vector(vector) * rot + bone.head&lt;br /&gt;
    bpy.ops.object.mode_set(mode='OBJECT')&lt;br /&gt;
    return ob&lt;br /&gt;
    &lt;br /&gt;
def poseRig(ob, poseTable):&lt;br /&gt;
    bpy.context.scene.objects.active = ob&lt;br /&gt;
    bpy.ops.object.mode_set(mode='POSE')&lt;br /&gt;
        &lt;br /&gt;
    for (bname, axis, angle) in poseTable:&lt;br /&gt;
        pbone = ob.pose.bones[bname]&lt;br /&gt;
        # Set rotation mode to Euler XYZ, easier to understand&lt;br /&gt;
        # than default quaternions&lt;br /&gt;
        pbone.rotation_mode = 'XYZ'&lt;br /&gt;
        # Documentation bug: Euler.rotate(angle,axis):&lt;br /&gt;
        # axis in ['x','y','z'] and not ['X','Y','Z']&lt;br /&gt;
        pbone.rotation_euler.rotate_axis(axis, math.radians(angle))&lt;br /&gt;
    bpy.ops.object.mode_set(mode='OBJECT')&lt;br /&gt;
    &lt;br /&gt;
def run(origo):&lt;br /&gt;
    origin = Vector(origo)&lt;br /&gt;
    # Table of bones in the form (bone, parent, vector)&lt;br /&gt;
    # The vector is given in local coordinates&lt;br /&gt;
    boneTable1 = [&lt;br /&gt;
        ('Base', None, (1,0,0)),&lt;br /&gt;
        ('Mid', 'Base', (1,0,0)),&lt;br /&gt;
        ('Tip', 'Mid', (0,0,1))&lt;br /&gt;
    ]&lt;br /&gt;
    bent = createRig('Bent', origin, boneTable1)&lt;br /&gt;
&lt;br /&gt;
    # The second rig is a straight line, i.e. bones run along local Y axis&lt;br /&gt;
    boneTable2 = [&lt;br /&gt;
        ('Base', None, (1,0,0)),&lt;br /&gt;
        ('Mid', 'Base', (0,0.5,0)),&lt;br /&gt;
        ('Mid2', 'Mid', (0,0.5,0)),&lt;br /&gt;
        ('Tip', 'Mid2', (0,1,0))&lt;br /&gt;
    ]&lt;br /&gt;
    straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)&lt;br /&gt;
    &lt;br /&gt;
    # Pose second rig&lt;br /&gt;
    poseTable2 = [&lt;br /&gt;
        ('Base', 'X', 90),&lt;br /&gt;
        ('Mid2', 'Z', 45),&lt;br /&gt;
        ('Tip', 'Y', -45)&lt;br /&gt;
    ]&lt;br /&gt;
    poseRig(straight, poseTable2)&lt;br /&gt;
    &lt;br /&gt;
    # Pose first rig&lt;br /&gt;
    poseTable1 = [&lt;br /&gt;
        ('Tip', 'Y', 45),&lt;br /&gt;
        ('Mid', 'Y', 45),&lt;br /&gt;
        ('Base', 'Y', 45)&lt;br /&gt;
    ]&lt;br /&gt;
    poseRig(bent, poseTable1)&lt;br /&gt;
    &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    run((0,5,0))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rigged mesh==&lt;br /&gt;
Questo programma aggiunge un'armatura a una mesh. L'armatura ha tre ossa (Base, Mid, Tip) e vincoli (constraints):&lt;br /&gt;
#Un vincolo IK. ''Mid -&amp;gt; Tip''&lt;br /&gt;
#Un vincolo Stretch To. ''Mid -&amp;gt; Tip''&lt;br /&gt;
#Un vincolo Copy Rotation. ''Base -&amp;gt; Tip''&lt;br /&gt;
La mesh è deformata dall'armatura. Quindi un modificatore armatura e i corrispondenti vertex group sono creati.&lt;br /&gt;
[[File:Code_Snippets_RiggedMesh.png|640px]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#----------------------------------------------------------&lt;br /&gt;
# File rigged_mesh.py&lt;br /&gt;
#----------------------------------------------------------&lt;br /&gt;
import bpy, mathutils&lt;br /&gt;
&lt;br /&gt;
def createArmature(origin):&lt;br /&gt;
    # Create armature and object&lt;br /&gt;
    amt = bpy.data.armatures.new('MyRigData')&lt;br /&gt;
    rig = bpy.data.objects.new('MyRig', amt)&lt;br /&gt;
    rig.location = origin&lt;br /&gt;
    rig.show_x_ray = True&lt;br /&gt;
    amt.show_names = True&lt;br /&gt;
    # Link object to scene&lt;br /&gt;
    scn = bpy.context.scene&lt;br /&gt;
    scn.objects.link(rig)&lt;br /&gt;
    scn.objects.active = rig&lt;br /&gt;
    scn.update()&lt;br /&gt;
&lt;br /&gt;
    # Create bones&lt;br /&gt;
#next two lines by PKHG SVN 36504 W32&lt;br /&gt;
    bpy.ops.object.editmode_toggle()&lt;br /&gt;
#    bpy.ops.object.mode_set(mode='EDIT')&lt;br /&gt;
#original does not work??!!    bpy.ops.object.mode_set(mode='EDIT')&lt;br /&gt;
    base = amt.edit_bones.new('Base')&lt;br /&gt;
    base.head = (0,0,0)&lt;br /&gt;
    base.tail = (0,0,1)&lt;br /&gt;
&lt;br /&gt;
    mid = amt.edit_bones.new('Mid')&lt;br /&gt;
    mid.head = (0,0,1)&lt;br /&gt;
    mid.tail = (0,0,2)&lt;br /&gt;
    mid.parent = base&lt;br /&gt;
    mid.use_connect = True&lt;br /&gt;
&lt;br /&gt;
    tip = amt.edit_bones.new('Tip')&lt;br /&gt;
    tip.head = (0,0,2)&lt;br /&gt;
    tip.tail = (0,0,3)&lt;br /&gt;
&lt;br /&gt;
    # Bone constraints. Armature must be in pose mode.&lt;br /&gt;
    bpy.ops.object.mode_set(mode='POSE')&lt;br /&gt;
&lt;br /&gt;
    # IK constraint Mid -&amp;gt; Tip&lt;br /&gt;
    pMid = rig.pose.bones['Mid']&lt;br /&gt;
    cns1 = pMid.constraints.new('IK')&lt;br /&gt;
    cns1.name = 'Ik'&lt;br /&gt;
    cns1.target = rig&lt;br /&gt;
    cns1.subtarget = 'Tip'&lt;br /&gt;
    cns1.chain_count = 1&lt;br /&gt;
&lt;br /&gt;
    # StretchTo constraint Mid -&amp;gt; Tip with influence 0.5&lt;br /&gt;
    cns2 = pMid.constraints.new('STRETCH_TO')&lt;br /&gt;
    cns2.name = 'Stretchy'&lt;br /&gt;
    cns2.target = rig&lt;br /&gt;
    cns2.subtarget = 'Tip'&lt;br /&gt;
    cns2.influence = 0.5&lt;br /&gt;
    cns2.keep_axis = 'PLANE_X'&lt;br /&gt;
    cns2.volume = 'VOLUME_XZX'&lt;br /&gt;
&lt;br /&gt;
    # Copy rotation constraints Base -&amp;gt; Tip&lt;br /&gt;
    pBase = rig.pose.bones['Base']&lt;br /&gt;
    cns3 = pBase.constraints.new('COPY_ROTATION')&lt;br /&gt;
    cns3.name = 'Copy_Rotation'&lt;br /&gt;
    cns3.target = rig&lt;br /&gt;
    cns3.subtarget = 'Tip'&lt;br /&gt;
    cns3.owner_space = 'WORLD'&lt;br /&gt;
    cns3.target_space = 'WORLD'&lt;br /&gt;
&lt;br /&gt;
    bpy.ops.object.mode_set(mode='OBJECT')&lt;br /&gt;
    return rig&lt;br /&gt;
&lt;br /&gt;
def createMesh(origin):&lt;br /&gt;
    # Create mesh and object&lt;br /&gt;
    me = bpy.data.meshes.new('Mesh')&lt;br /&gt;
    ob = bpy.data.objects.new('MeshObject', me)&lt;br /&gt;
    ob.location = origin&lt;br /&gt;
    # Link object to scene&lt;br /&gt;
    scn = bpy.context.scene&lt;br /&gt;
    scn.objects.link(ob)&lt;br /&gt;
    scn.objects.active = ob&lt;br /&gt;
    scn.update()&lt;br /&gt;
&lt;br /&gt;
    # List of vertex coordinates&lt;br /&gt;
    verts = [&lt;br /&gt;
        (0.5, 0.5,0), (0.5,-0.5,0), (-0.5,-0.5,0), (-0.5,0.5,0),&lt;br /&gt;
        (0.5,0.5,1), (0.5,-0.5,1), (-0.5,-0.5,1), (-0.5,0.5,1),&lt;br /&gt;
        (-0.5,0.5,2), (-0.5,-0.5,2), (0.5,-0.5,2), (0.5,0.5,2),&lt;br /&gt;
        (0.5,0.5,3), (0.5,-0.5,3), (-0.5,-0.5,3), (-0.5, 0.5,3)&lt;br /&gt;
    ]&lt;br /&gt;
    # List of faces.&lt;br /&gt;
    faces = [&lt;br /&gt;
        (0, 1, 2, 3),&lt;br /&gt;
        (0, 4, 5, 1),&lt;br /&gt;
        (1, 5, 6, 2),&lt;br /&gt;
        (2, 6, 7, 3),&lt;br /&gt;
        (4, 0, 3, 7),&lt;br /&gt;
        (4, 7, 8, 11),&lt;br /&gt;
        (7, 6, 9, 8),&lt;br /&gt;
        (6, 5, 10, 9),&lt;br /&gt;
        (5, 4, 11, 10),&lt;br /&gt;
        (10, 11, 12, 13),&lt;br /&gt;
        (9, 10, 13, 14),&lt;br /&gt;
        (8, 9, 14, 15),&lt;br /&gt;
        (11, 8, 15, 12),&lt;br /&gt;
        (12, 15, 14, 13)&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
    # Create mesh from given verts, edges, faces. Either edges or&lt;br /&gt;
    # faces should be [], or you ask for problems&lt;br /&gt;
    me.from_pydata(verts, [], faces)&lt;br /&gt;
&lt;br /&gt;
    # Update mesh with new data&lt;br /&gt;
    me.update(calc_edges=True)&lt;br /&gt;
    return ob&lt;br /&gt;
&lt;br /&gt;
def skinMesh(ob, rig):&lt;br /&gt;
    # List of vertex groups, in the form (vertex, weight)&lt;br /&gt;
    vgroups = {}&lt;br /&gt;
    vgroups['Base'] = [&lt;br /&gt;
        (0, 1.0), (1, 1.0), (2, 1.0), (3, 1.0),&lt;br /&gt;
        (4, 0.5), (5, 0.5), (6, 0.5), (7, 0.5)]&lt;br /&gt;
    vgroups['Mid'] = [&lt;br /&gt;
        (4, 0.5), (5, 0.5), (6, 0.5), (7, 0.5),&lt;br /&gt;
        (8, 1.0), (9, 1.0), (10, 1.0), (11, 1.0)]&lt;br /&gt;
    vgroups['Tip'] = [(12, 1.0), (13, 1.0), (14, 1.0), (15, 1.0)]&lt;br /&gt;
&lt;br /&gt;
    # Create vertex groups, and add verts and weights&lt;br /&gt;
    # First arg in assignment is a list, can assign several verts at once&lt;br /&gt;
    for name, vgroup in vgroups.items():&lt;br /&gt;
        grp = ob.vertex_groups.new(name)&lt;br /&gt;
        for (v, w) in vgroup:&lt;br /&gt;
            grp.add([v], w, 'REPLACE')&lt;br /&gt;
&lt;br /&gt;
    # Give mesh object an armature modifier, using vertex groups but&lt;br /&gt;
    # not envelopes&lt;br /&gt;
    mod = ob.modifiers.new('MyRigModif', 'ARMATURE')&lt;br /&gt;
    mod.object = rig&lt;br /&gt;
    mod.use_bone_envelopes = False&lt;br /&gt;
    mod.use_vertex_groups = True&lt;br /&gt;
&lt;br /&gt;
def run(origin):&lt;br /&gt;
    rig = createArmature(origin)&lt;br /&gt;
    ob = createMesh(origin)&lt;br /&gt;
    skinMesh(ob, rig)&lt;br /&gt;
&lt;br /&gt;
    # Move and rotate the tip bone in pose mode&lt;br /&gt;
    bpy.context.scene.objects.active = rig&lt;br /&gt;
    bpy.ops.object.mode_set(mode='POSE')&lt;br /&gt;
    ptip = rig.pose.bones['Tip']&lt;br /&gt;
    ptip.location = (0.2,-0.5,0)&lt;br /&gt;
    rotMatrix = mathutils.Matrix.Rotation(0.6, 3, 'X')&lt;br /&gt;
    ptip.rotation_quaternion = rotMatrix.to_quaternion()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    run((0,0,0))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Edit mode versus pose mode==&lt;br /&gt;
Gli attributi delle ossa che agiscono sulla posizione di riposo di un'armatura (head, tail, roll, parent, use connect, etx) sono disponibili solo in Edit Mode (usa un osso in ob.data.edit_bones), mentre gli attributi che coinvolgono il posizionamento richiedono che l'armatura sia in Pose Mode (usa un osso in ob.pose.bones). Per quanto ne so, l'unico modo per passare da Edit Mode a Pose Mode e viceversa, è con una chiamata a un operatore&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;bpy.ops.object.mode_set(mode='EDIT')&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;bpy.ops.object.mode_set(mode='POSE')&amp;lt;/source&amp;gt;&lt;br /&gt;
Dal momento che gli operatori agiscono sull'oggetto attivo, ci dobbiamo assicurare che l'oggetto corretto è attivo impostando &amp;lt;code&amp;gt;bpy.context.scene.objects.active&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Questo programma copia l'angolo roll da un rig (chiamato 'SrcRig') a un altro rig (chiamato 'TrgRig'). Entrambe le armature devono avere lo stesso numero di ossa con nomi identici.&lt;br /&gt;
[[File:Code_Snippets_CopyRoll.png|640px]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#----------------------------------------------------------&lt;br /&gt;
# File copy_roll.py&lt;br /&gt;
#----------------------------------------------------------&lt;br /&gt;
import bpy&lt;br /&gt;
&lt;br /&gt;
def copyRolls(src, trg):&lt;br /&gt;
    rolls = {}&lt;br /&gt;
&lt;br /&gt;
    bpy.context.scene.objects.active = src&lt;br /&gt;
    bpy.ops.object.mode_set(mode='EDIT')&lt;br /&gt;
    for eb in src.data.edit_bones:&lt;br /&gt;
        rolls[eb.name] = eb.roll&lt;br /&gt;
    bpy.ops.object.mode_set(mode='POSE')&lt;br /&gt;
&lt;br /&gt;
    bpy.context.scene.objects.active = trg&lt;br /&gt;
    bpy.ops.object.mode_set(mode='EDIT')&lt;br /&gt;
    for eb in trg.data.edit_bones:&lt;br /&gt;
        oldRoll = eb.roll&lt;br /&gt;
        eb.roll = rolls[eb.name]&lt;br /&gt;
        print(eb.name, oldRoll, eb.roll)&lt;br /&gt;
    bpy.ops.object.mode_set(mode='POSE')&lt;br /&gt;
&lt;br /&gt;
objects = bpy.context.scene.objects&lt;br /&gt;
copyRolls(objects['SrcRig'], objects['TrgRig'])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Page/Footer|Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Meshes|Dev:IT/2.5/Py/Scripts/Cookbook/Code_snippets/Three_ways_to_create_objects}}&lt;/div&gt;</summary>
		<author><name>wiki&gt;ValterVB</name></author>
		
	</entry>
</feed>