しおんの部屋

3DCG とか スクリプト とか…

Blender の 情報エリア に 出力されない情報を出力させる方法 [ Blender 3DCG 小技 ]

2022年09月25日 | Blender Python
Blender ワンポイント情報!

今回は Blender の 情報エリア に関連する小技。

Editor_Type を info にすると、操作内容を示すPythonコードがエリア内に表示されるが、操作によっては表示されない場合がある。そんな時は Pythonコンソール で以下命令を試してみると良い。

bpy.app.debug_wm=True

試しに3D_View で[→]を押すと、いつもは表示されない以下情報が表示される。

bpy.ops.screen.frame_offset(delta=1)

但し、その他にもいろいろな情報が常に表示され続ける為、必要な情報を得たらすぐに以下を実行する方が良い。

bpy.app.debug_wm=False
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Quaternion の回転式の展開[Blender 3DCG]

2020年04月21日 | Blender Python
Quaternion の積の展開[Blender 3DCG]の続き

今回は Quaternionの積の展開結果 を利用して Quaternionの回転式 の展開を行う。

Quaternion(w,x,y,z) で 点(p,q,r) を回転した後の 点(P,Q,R) を求める式は
  (O,P,Q,R)=(w,x,y,z)(o,p,q,r)(w,-x,-y,-z)       O=0 , o=0
この式を展開用に、前回求めた Quaternionの積の展開結果① と ①を変形した② を準備する。
  (w,x,y,z)(o,p,q,r)          (a,b,c,d)(w,-x,-y,-z)
  =( wo-xp-yq-zr               =( +aw+bx+cy+dz
   , wp+xo+yr-zq                , -ax+bw-cz+dy
   , wq-xr+yo+zp                , -ay+bz+cw-dx
   , wr+xq-yp+zo ) …①         , -az-by+cx+dw ) …②
②の(a,b,c,d)に①を代入すれば、点(P,Q,R) を求める回転式が得られる。
( w,x,y,z,o,p,q,r はすべて実数なので通常の演算が可能 )
  (O,P,Q,R)
  =(w,x,y,z)(o,p,q,r)(w,-x,-y,-z)
  
  =( +(+wo-xp-yq-zr)w+(+wp+xo+yr-zq)x+(+wq-xr+yo+zp)y+(+wr+xq-yp+zo)z
   , -(+wo-xp-yq-zr)x+(+wp+xo+yr-zq)w-(+wq-xr+yo+zp)z+(+wr+xq-yp+zo)y
   , -(+wo-xp-yq-zr)y+(+wp+xo+yr-zq)z+(+wq-xr+yo+zp)w-(+wr+xq-yp+zo)x
   , -(+wo-xp-yq-zr)z-(+wp+xo+yr-zq)y+(+wq-xr+yo+zp)x+(+wr+xq-yp+zo)w )

  =( (+wo-xp-yq-zr)w +(+wp+xo+yr-zq)x +(+wq-xr+yo+zp)y +(+wr+xq-yp+zo)z
   , (-wo+xp+yq+zr)x +(+wp+xo+yr-zq)w +(-wq+xr-yo-zp)z +(+wr+xq-yp+zo)y
   , (-wo+xp+yq+zr)y +(+wp+xo+yr-zq)z +(+wq-xr+yo+zp)w +(-wr-xq+yp-zo)x
   , (-wo+xp+yq+zr)z +(-wp-xo-yr+zq)y +(+wq-xr+yo+zp)x +(+wr+xq-yp+zo)w )
  
  =( +wwo-xwp-ywq-zwr +wxp+xxo+yxr-zxq +wyq-xyr+yyo+zyp +wzr+xzq-yzp+zzo
   , -wxo+xxp+yxq+zxr +wwp+xwo+ywr-zwq -wzq+xzr-yzo-zzp +wyr+xyq-yyp+zyo
   , -wyo+xyp+yyq+zyr +wzp+xzo+yzr-zzq +wwq-xwr+ywo+zwp -wxr-xxq+yxp-zxo
   , -wzo+xzp+yzq+zzr -wyp-xyo-yyr+zyq +wxq-xxr+yxo+zxp +wwr+xwq-ywp+zwo )
  
  =( (+ww+xx+yy+zz)o +(-xw+wx+zy-yz)p +(-yw-zx+wy+xz)q +(-zw+yx-xy+wz)r
   , (-wx+xw-yz+zy)o +(+xx+ww-zz-yy)p +(+yx-zw-wz+xy)q +(+zx+yw+xz+wy)r
   , (-wy+xz+yw-zx)o +(+xy+wz+zw+yx)p +(+yy-zz+ww-xx)q +(+zy+yz-xw-wx)r
   , (-wz-xy+yx+zw)o +(+xz-wy+zx-yw)p +(+yz+zy+wx+xw)q +(+zz-yy-xx+ww)r )
  
  =( (+ww+xx+yy+zz)o +(-wx+wx+yz-yz)p +(-wy-zx+wy+zx)q +(-wz+xy-xy+wz)r
   , (-wx+wx-yz+yz)o +(+xx+ww-zz-yy)p +(+xy-wz-wz+xy)q +(+zx+wy+zx+wy)r
   , (-wy+zx+wy-zx)o +(+xy+wz+wz+xy)p +(+yy-zz+ww-xx)q +(+yz+yz-wx-wx)r
   , (-wz-xy+xy+wz)o +(+zx-wy+zx-wy)p +(+yz+yz+wx+wx)q +(+zz-yy-xx+ww)r )
  
  =( (ww+xx+yy+zz)o +(0          )p +(0          )q +(0          )r
   , (0          )o +(ww+xx-yy-zz)p +(2xy-2wz    )q +(2zx+2wy    )r
   , (0          )o +(2xy+2wz    )p +(ww-xx+yy-zz)q +(2yz-2wx    )r
   , (0          )o +(2zx-2wy    )p +(2yz+2wx    )q +(ww-xx-yy+zz)r )
回転式としてまとめると o=0 , O=0 より以下が得られる。
  (0,P,Q,R)
  =(w,x,y,z)(0,p,q,r)(w,-x,-y,-z)
  =( 0
   , (ww+xx-yy-zz)p +(2xy-2wz    )q +(2zx+2wy    )r
   , (2xy+2wz    )p +(ww-xx+yy-zz)q +(2yz-2wx    )r
   , (2zx-2wy    )p +(2yz+2wx    )q +(ww-xx-yy+zz)r )
実際に Blender2.8 の Pythonコンソール で試算してみる。
通常の演算で求めた p2 と、今回の展開式から求めた p3 が一致していることがわかる。
--Python--

b1 = bpy.context.active_pose_bone
q1 = b1.rotation_quaternion
p1 = Quaternion((0,1.1,1.2,1.3))
w,x,y,z = q1
o,p,q,r = p1
#
p2 = q1 @ p1 @ q1.inverted()
p3 = Quaternion((0
                ,(w*w+x*x-y*y-z*z)*p+(2*x*y-2*w*z)*q+(2*z*x+2*w*y)*r
                ,(2*x*y+2*w*z)*p+(w*w-x*x+y*y-z*z)*q+(2*y*z-2*w*x)*r
                ,(2*z*x-2*w*y)*p+(2*y*z+2*w*x)*q+(w*w-x*x-y*y+z*z)*r))
#
print( "q1    =" , q1    )
print( "p1    =" , p1    )
print( "p2    =" , p2    )
print( "p3    =" , p3    )

--実行結果--

q1    = <Quaternion (w=0.6884, x="0.7204," y="0.0192," z="0.0822)">
p1    = <Quaternion (w=0.0000, x="1.1000," y="1.2000," z="1.3000)">
p2    = <Quaternion (w=0.0000, x="1.1700," y="-1.1921," z="1.2450)">
p3    = <Quaternion (w=0.0000, x="1.1700," y="-1.1921," z="1.2450)">
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Quaternion の積の展開[Blender 3DCG]

2020年04月17日 | Blender Python
肩のポージングは難しい[Blender 3DCG] で予告したが、方向を変えないで quaternion の Y=0 にするための計算方法方法について数回に分けて説明しようと思う。

まずは最も基本となる quaternion の積から始める。
webを見れば展開後の式が見つかるのだが…
色々と方向性を探る段階で ある程度 自力で展開してみたので、その過程を示す。
とは言っても…詳しい理論に踏み込む気はない ( 本質的には理解できていない^^; )

Quaternion(w,x,y,z)は、ijk=ii=jj=kk=-1 を満たす 基底元i,j,k を用いて w+xi+yj+zk と示せる。
この時 quaternion の積の展開は、一般的な積の展開に近い形で行うことができる。
但し、基底元i,j,k は掛ける順序が重要であるため、展開時 i,j,k を掛ける順序を崩してはいけない。
w,x,y,z は実数なので、掛ける順序を入れ替えても問題ない。

実際に積の展開を行う前に、基底元の積についてマトリクスを作っておく。
マトリクスの全要素は、ijk=ii=jj=kk=-1 から、以下の手順で導き出すことができる。
 ijk=-1
 →(右側からkを掛ける)ijkk=-k   →(kkを-1に置き換える)ij=k 
 →(左側からiを掛ける) iij=ik   →(iiを-1に置き換える)-j=ik
 →(右側からkを掛ける) -jk=ikk  →(kkを-1に置き換える)jk=i 
 →(左側からjを掛ける) jjk=ji   →(jjを-1に置き換える)-k=ji
 →(右側からiを掛ける) -ki=jii  →(iiを-1に置き換える)ki=j 
 →(左側からkを掛ける) kki=kj   →(kkを-1に置き換える)-i=kj
基底元の積のマトリクス としてまとめると…
     i_     j_     k_    
 _i  ii=-1  ji=-k  ki= j 
 _j  ij= k  jj=-1  kj=-i 
 _k  ik=-j  jk= i  kk=-1
このマトリクスを使用して、Quaternion( w,x,y,z ) と Quaternion( o,p,q,r )の積を展開する。
  ( w+xi+yj+zk )( o+pi+qj+rk )
  
  =   wo   + xo i  + yo j  + zo k 
    + wp i + xp ii + yp ji + zp ki
    + wq j + xq ij + yq jj + zq kj
    + wr k + xr ik + yr jk + zr kk
  
  =   wo   + xo i + yo j + zo k
    + wp i - xp   - yp k + zp j
    + wq j + xq k - yq   - zq i
    + wr k - xr j + yr i - zr  
  
  =   wo   - xp   - yq   - zr  
    + wp i + xo i + yr i - zq i
    + wq j - xr j + yo j + zp j
    + wr k + xq k - yp k + zo k
  
  =   ( wo-xp-yq-zr )
    + ( wp+xo+yr-zq )i
    + ( wq-xr+yo+zp )j
    + ( wr+xq-yp+zo )k
以上より Quaternion の積の展開結果は以下となる。
  (w,x,y,z)(o,p,q,r)
  =( wo-xp-yq-zr 
   , wp+xo+yr-zq 
   , wq-xr+yo+zp 
   , wr+xq-yp+zo )
実際に Blender2.8 の Pythonコンソール で試算してみる。
q3 が 今回の展開結果から計算した値だが、 q1 と q2 の積 ( q1 @ q2 )と一致している事がわかる。
--Python--

q1 = bpy.data.objects['Armature'].pose.bones["Bone1"].rotation_quaternion
q2 = bpy.data.objects['Armature'].pose.bones["Bone2"].rotation_quaternion
w,x,y,z = q1
o,p,q,r = q2
q3 = Quaternion((
        w*o-x*p-y*q-z*r,w*p+x*o+y*r-z*q,w*q-x*r+y*o+z*p,w*r+x*q-y*p+z*o))

print( "q1       =" , q1       )
print( "q2       =" , q2       )
print( "q3       =" , q3       )
print( "q1@q2    =" , q1@q2    )
print( "q1@q2-q3 =" , q1@q2-q3 )

--実行結果--

q1       = <Quaternion (w=0.6884, x="0.7204," y="0.0192," z="0.0822)">
q2       = <Quaternion (w=0.6750, x="0.6885," y="-0.1859," z="-0.1893)">
q3       = <Quaternion (w=-0.0122, x="0.9719," y="0.0779," z="-0.2220)">
q1@q2    = <Quaternion (w=-0.0122, x="0.9719," y="0.0779," z="-0.2220)">
q1@q2-q3 = <Quaternion (w=0.0000, x="0.0000," y="0.0000," z="-0.0000)">
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Blender Pythonメモ スプライン補完できなかった 汗

2016年09月04日 | Blender Python
python だしスプライン補完は簡単にできると思い、
numpy と scipy.interpolate をimportしようと思ったら
Blender に scipy.interpolate が入っていなかった。
簡単にできないじゃないか・・・^^;
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Blender Pythonメモ 直方体を作る

2016年08月17日 | Blender Python
Python のメモ

オブジェクト名"o1" メッシュ名"m1" で直方体を作る例。


変数 V に頂点情報 E に辺情報 F に面情報を設定する。

import bpy
m1=bpy.data.meshes.new("m1")
o1=bpy.data.objects.new("o1",m1)
V=[(0,0,0),(1,0,0),(1,2,0),(0,2,0),(0,0,3),(1,0,3),(1,2,3),(0,2,3)]
E=[]
F=[(0,1,2,3),(2,3,7,6),(4,5,6,7),(0,3,7,4),(1,2,6,5),(0,1,5,4)]
o1.data.from_pydata(V,E,F)
o1.data.update()
bpy.context.scene.objects.link(o1)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Blender Pythonメモ 初期設定

2016年07月14日 | Blender Python
オブジェクトを取得
# Blender では Python は Python_Console か Text_Editor で実行する。

# Python_Console では 起動時に以下が自動的に実行されている。

import bpy
C = bpy.context
D = bpy.data

# Text_Editor では、使用前にこれら( 特にimport文 )を実行する必要がある。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Blender Pythonメモ オブジェクトを取得

2016年07月12日 | Blender Python
# オブジェクト名を指定してオブジェクトを取得
o1 = bpy.data.objects[ 'Plane' ]

# 全てのオブジェクトのリストを取得
os = bpy.data.objects
o1 = os[ 0 ] # 一つ目のオブジェクト

# アクティブなオブジェクトを取得
o1 = bpy.context.scene.objects.active

# 選択された全てのオブジェクトのリストを取得
os = bpy.context.selected_objects
o1 = os[ 0 ] # 一つ目のオブジェクト
Blender Pythonメモ 初期設定
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする