今年も水着まちゅりに参加しました。
今回は椅子に座ったポーズに決めていたのですが、なかなか思うようにならず何回かえたことか…
やっとこんな感じになりました。
久し振りに髪型も変えました。
![](https://blogimg.goo.ne.jp/user_image/53/c4/a5e9bb40a5cc7b6a603b907cd78b86e5.jpg)
今年は暑いので室内です。
今回は椅子に座ったポーズに決めていたのですが、なかなか思うようにならず何回かえたことか…
やっとこんな感じになりました。
久し振りに髪型も変えました。
![](https://blogimg.goo.ne.jp/user_image/53/c4/a5e9bb40a5cc7b6a603b907cd78b86e5.jpg)
今年は暑いので室内です。
# # 確認用コード # 表示が全て 0 なら確認OK # 属性によっては 1e-7程度 の演算誤差が発生する # import numpy # # matrix と length を head と tail と roll に変換する関数 def matrix_length_2_head_tail_roll( m , l ): a , r = bpy.types.Bone.AxisRollFromMatrix( m.to_3x3() ) h = m.translation t = a * l + h return h , t , r # # head と tail と roll を matrix と length に変換する関数 def head_tail_roll_2_matrix_length( h , t , r ): a = t - h l = a.length m = Matrix().Translation( h ) @ bpy.types.Bone.MatrixFromAxisRoll( a , r ).to_4x4() return m , l # # 一致確認用関数 ( 各要素の差を取り、最も大きい値を表示 ) def f(p,q):return max([abs(a-b) for a,b in zip(numpy.ravel(p),numpy.ravel(q))]) # # editモードに変更 _ = bpy.ops.object.mode_set( mode = 'EDIT' ) # # 選択されたedit_boneを取得 b = bpy.context.active_bone # # matrix_length_2_head_tail_roll の確認 h1 , t1 , r1 = matrix_length_2_head_tail_roll( b.matrix , b.length ) print( f"name { b.name }" ) print( f"head1 {f( b.head , h1 )}" ) print( f"tail1 {f( b.tail , t1 )}" ) print( f"roll1 {f( b.roll , r1 )}" ) # # head_tail_roll_2_matrix_length の確認 m1 , l1 = head_tail_roll_2_matrix_length( b.head , b.tail , b.roll ) print( f"mat {f( b.matrix , m1 )}" ) print( f"len {f( b.length , l1 )}" ) # # boneの local空間 から armature空間 への変換の確認 h2 = b.matrix @ Vector((0,0,0)) t2 = b.matrix @ Vector((0,b.length,0)) print( f"head2 {f( b.head , h2 )}" ) print( f"tail2 {f( b.tail , t2 )}" )