Shade3D 公式

05 labo module [ Shade Labo ]


#1

05 - 1 Download


**Ver. 1.1**( 2016 / 01 / 23 )

改善

vec3_bounding_box( )

          None を含む vec3 list に対応
          返り値の vec3 の要素を実数に変換


bezier_line_tangent( )

          特殊なケースについての記述を追加


追加

is_parallel(v1 as vec3, v2 as vec3, epsilon as double = 1e-4) as bool

is_parallel_2((v1 as vec3, v2 as vec3, opposite as bool = False, epsilon as double = 1e-4) as bool

set_bezier_patch(bP as vec3 matrix)

get_bezier_patch( )


Ver. 1.2( 2016 / 01 / 31 )
追加

bezier_surface_position(bP as vec3 matrix, s as float, t as float) as vec3

bezier_surface_u_line(bP as vec3 matrix, s as float, m as bool = False) as vec3 list or vec3 matrix

bezier_surface_v_line(bP as vec3 matrix, t as float, m as bool = False) as vec3 list or vec3 matrix

bezier_surface_u_tangent(bP as vec3 matrix, s as float, t as float) as vec3

bezier_surface_v_tangent(bP as vec3 matrix, s as float, t as float) as vec3

bezier_surface_normal(bP as vec3 matrix, s as float, t as float) as vec3

bezier_surface_u_tangent_2(bP as vec3 matrix, s as float, t as float, epsilon as float = 1e-9) as vec3

bezier_surface_v_tangent_2(bP as vec3 matrix, s as float, t as float, epsilon as float = 1e-9) as vec3

bezier_surface_normal_2(bP as vec3 matrix, s as float, t as float, epsilon as float = 1e-9) as vec3


Ver. 1.3( 2016 / 02 / 06 )
追加

bezier_line_subdivision( bz as vec3 list or vec3 matrix, t1 as float, t2 as float ) as vec3 list or vec3 matrix

bezier_patch_subdivision( bP as vec3 matrix, s1 as float, s2 as float, t1 as float, t2 as float ) as vec3 matrix


Ver. 1.4( 2016 / 02 / 13 )
追加

make_line(p as vec3 list, inH as vec3 list, outH as vec3 list, closed as bool, name as string = None )

smooth(xshade as xshade)

smooth_line(pL as vec3 list, inH as vec3 list, outH as vec3 list, closed as bool, target as int list = None)

smooth_handle(p0 as vec3, p1 as vec3, p2 as vec3) as vec3, vec3


Ver. 1.4.1( 2016 / 02 / 13 )
修正
          3重点に対してエラーとなるバグを修正

smooth_handle(p0 as vec3, p1 as vec3, p2 as vec3) as vec3, vec3




ここからダウンロードして下さい。

          download

インストール方法は [ 01 はじめに ] を参照下さい。


#2

05 - 2 Reference


関連記事:
  • 01 はじめに
  • 02 vec3 module
  • 03 matrix module
  • 04 quaternion module

module labo は Shade Labo で用いられる種々雑多なルーチン等を提供します。
**注記 - 1**

この中で書かれている vec3 は custum class vec3 のことであり、Shade の script reference に書かれている vec3 は list3 あるいは [ float, float, float ] と記述します。


注記 - 2

list として指定されている引数は特に注記なき場合 tuple 型でも可

vec3 list として指定されている引数には、vec3 ではなく list3 型でも許されるものがありますが、ここでは一切明記していません。




make_simple_line( xshade as xshade, pL as vec3 list, closed as bool = False, name as string = None )

  • リスト pL 内に格納された vec3 を折れ線の頂点座標として線形状を出力
  • closed : 線形状の開閉
  • name : 線形状名称

**make_line**(p as vec3 list, inH as vec3 list, outH as vec3 list, closed as bool, name as string = None )
  • p, inH, outH で与えられる線形状を出力する
  • p, inH, outH の list size は同一であること
  • closed : 線形状の開閉
  • name : 線形状名称

**get_bezier**( xshade as xshade, idx as int, transposel as bool = True ) as vec3 matrix
  • 選択線形状の指定する区間 idx ( 0基数 ) の bezier control point 座標を vec3 matrix として返す
  • idx < 0 ならば、全区間を対象とし、[ matrix, matrix, … ] として返す
  • デフォルトでは一列の matrix
  • transpose = False で一行 matrix

**make_bezier_line**( xshade as xshade, cp as vec3 list, name as string = None )
  • cp : bezier control point 座標を格納した vec3 list
  • cp = [ position, out_handle, in_handle, position ]

  • cp を線形状として出力する
  • name は線形状名称

**get_bezier_patch_base**( xshade as xshade, m as int, n as int, uuid as string = None ) as vec3 matrix
  • 自由曲面の指定する区間 m, n ( 0基数 ) の bezier patch 座標を vec3 matrix として返す
  • デフォルトでは選択自由曲面、uuid に Shade で取得した自由曲面の uuid を渡せば、そのデータを取得
  • 16個の座標値の内、取得できない4座標は None で返される

**set_bezier_patch(bP as vec3 matrix)**
  • 中央4点の controlpoint 座標未定義の patch base bP の未定義座標をセット

**get_bezier_patch(xshade as xshade, m as int, n as int, uuid as string = None ) as vec3 matrix**
  • 自由曲面の指定する区間 m, n ( 0基数 ) の bezier patch 座標を vec3 matrix として返す
  • デフォルトでは選択自由曲面、uuid に Shade で取得した自由曲面の uuid を渡せば、そのデータを取得

**make_bezier_surface**( xshade as xshade, bz as vec3 matrix, name as string = None )
  • bz : bezier patch 座標を格納した 4 x 4 の vec3 matrix
  • 中央の 4 要素については None でも可

  • bz を自由曲面として出力する
  • name は自由曲面名称

**get_bezier_patch_by_DXF**(xshade as xshade, m as int, n as int, uuid as string = None) as vec3 matrix
  • 自由曲面の指定する区間 m, n( 0基数 )の bezier patch 座標を DXF file 経由で vec3 matrix として返す
  • デフォルトでは選択自由曲面、uuid に Shade で取得した自由曲面の uuid を渡せば、そのデータを取得

**make_bezier_patch**(xshade as xshade, bP as vec3 matrix, name as string = None)
  • bezier patch bP を線形状群として出力
  • name は bezier patch を格納する part につける名称



**vec3_bounding_box**( L as vec3 list ) as [ vec3, vec3 ]
  • list に内包された全ての vec3 から bounding box を求め、[ min as vec3, max as vec3 ] として返す
  • vec3 以外の要素や不正な vec3 は無視される

**vec3_bounding_box_size**( L as vec3 list ) as [ float, float, float, float ]
  • list に内包された全ての vec3 から bounding box size を求め、[ x as float, y as float, z as float, xyz as float ] として返す。( xyz = x + y + z )
  • vec3 以外の要素や不正な vec3 は無視される

**vec3_mean**( L as vec3 list ) as vec3
  • list に内包された全ての vec3 の平均ベクトルを返す
  • vec3 以外の要素や不正な vec3 は無視される

**is_parallel(v1 as vec3, v2 as vec3, epsilon as double = 1e-4) as bool**
  • list に内包された全ての vec3 の平均ベクトルを返す
  • vec3 以外の要素や不正な vec3 は無視される

**is_parallel_2(v1 as vec3, v2 as vec3, opposite as bool = False, epsilon as double = 1e-4) as bool**
  • opposite = False ならば、2 つのベクトル v1, v2 が 同じ方向で平行であるか否かを返す
  • opposite = True ならば、2 つのベクトル v1, v2 が逆向きでで平行であるか否かを返す



**bezier_t**( t as float, transposed = False ) as matrix           return matrix(transposed, [t**3, t**2, t, 1])

bezier_t_derivative( t as float, transposed = False ) as matrix
          return matrix(transposed, [3t**2, 2t, 1, 0])

bezier_t_second_derivative( t as float, transposed = False ) as matrix
          return matrix(transposed, [6*t, 2, 0, 0])

bezier_m( ) as matrix
          mx = matrix()
          mx.append([-1, 3, -3, 1])
          mx.append([3, -6, 3, 0])
          mx.append([-3, 3, 0, 0])
          mx.append([1, 0, 0, 0])
          return mx

bezier_d( ) as matrix
          mx = matrix()
          mx.append([1, -1, 1, -1])
          mx.append([0, 1, -2, 3])
          mx.append([0, 0, 1, -3])
          mx.append([0, 0, 0, 1])
          return mx



**bezier_line_position**( bz as vec3 list, t as float ) as vec3
  • bz : bezier control point 座標を格納した vec3 list
  • bezier line bz の parameter t における座標値を返す

**bezier_line_tangent**( bz as vec3 list, t as float ) as vec3
  • bz : bezier control point 座標を格納した vec3 list
  • bezier line bz の parameter t における接線ベクトルを返す ( 単位ベクトル )

**bezier_surface_position(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における座標値を返す

**bezier_surface_u_line(bP as vec3 matrix, s as float, m as bool = False) as vec3 list or vec3 matrix**
  • bezier patch bP の parameter s における U 方向 bnezier line を返す
  • m == False ならば返り値は vec3 list、m == True ならば vec3 matrix とする

**bezier_surface_v_line(bP as vec3 matrix, t as float, m as bool = False) as vec3 list or vec3 matrix**
  • bezier patch bP の parameter t における V 方向 bnezier line を返す
  • m == False ならば返り値は vec3 list、m == True ならば vec3 matrix とする

**bezier_surface_u_tangent(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における U 方向接線ベクトルを返す
  • 極に極めて近い極回りの接線ベクトルを求める場合は bezier_surface_u_tangent_2( ) を使用のこと

**bezier_surface_v_tangent(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における V 方向接線ベクトルを返す
  • 極に極めて近い極回りの接線ベクトルを求める場合は bezier_surface_v_tangent_2( ) を使用のこと

**bezier_surface_normal(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における 法線ベクトルを返す
  • 極に極めて近い法線ベクトルを求める場合は bezier_surface_normal_2( ) を使用のこと

**bezier_surface_u_tangent_2(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における U 方向接線ベクトルを返す

**bezier_surface_v_tangent_2(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における V 方向接線ベクトルを返す

**bezier_surface_normal_2(bP as vec3 matrix, s as float, t as float) as vec3**
  • bezier patch bP の parameter s, t における 法線ベクトルを返す

**bezier_line_subdivision( bz as vec3 list or vec3 matrix, t1 as float, t2 as float ) as vec3 list or vec3 matrix**
  • bz : bezier control point 座標を格納した vec3 list or vec3 matrix
  • bezier line bz の parameter の区間 t1 ~ t2 における区分曲線 の control point 座標配列を返す

**bezier_patch_subdivision( bP as vec3 matrix, s1 as float, s2 as float, t1 as float, t2 as float ) as vec3 matrix**
  • bezier patch bP の parameter 区間 s1 ~ s2, t1 ~ t2 における区分曲面の bezier patch を返す

**bezier_simpson**( func as function, t1 as float, t2 as float, bz as vec3 list, simpsonN as int = 30 ) as float
  • Simpson法による bezier に係わる関数 func の区間 t1~ t2 の積分値を返す
  • simpsonN は最大分割数


       関数 func( bz, t ) as float
              bz : bezier control point 座標
              t : bezier parameter



**smooth**(xshade as xshade)
  • 3 点 p0, p1, p2 の座標から 中央のポイントの inhandle, outhandle 座標を返す
  • modify mode であれば、選択ポイントにのみ smooth をかける

**smooth_line**(pL as vec3 list, inH as vec3 list, outH as vec3 list, closed as bool, target as int list = None)
  • 点列 pL に smooth を施し、inH, outH に handle 座標を格納する
  • closed : 線形状の開閉情報
  • default では全てのポイントが smooth 対象だが、target list を指定すれば、
  • そこに格納されているポイント番号に対してのみ処理を行う

**smooth_handle**(p0 as vec3, p1 as vec3, p2 as vec3) as vec3, vec3
  • 3 点 p0, p1, p2 の座標から 中央のポイントの inhandle, outhandle 座標を返す

#3

05 - 3  改訂


**Ver. 1.5**  ( 2016 / 03 / 16 )
**コード追加**     0 ベクトルへの対応記述を追加

is_parallel(v1 as vec3, v2 as vec3, epsilon as double = 1e-4) as bool


バグ修正     閉じた面の最終ブロックの取得部分でのバグを修正

get_bezier_patch_base( xshade as xshade, m as int, n as int, uuid as string = None ) as vec3 matrix


追加

attitude_control_quaternion(u1 as vec3, v1 as vec3, u2 as vec3, v2 as vec3, fit as int = 0) as quaternion



Reference 追加


**attitude_control_quaternion**(u1 as vec3, v1 as vec3, u2 as vec3, v2 as vec3, fit as int = 0) as quaternion
  • 一組のベクトルu1, v1 を、もう一組のベクトル u2, v2 に一致させるような quaternion を返す
  • u1, v1 は単位ベクトルでなくてよいが、平行ではないこと
  • u2, v2 も単位ベクトルでなくてよいが、平行ではないこと
  • u1, v1 のなす角と u2, v2 のなす角が異なる場合、
         fit = 0 ならば、u1 と u2 を一致させる
         fit = 1 ならば、 u1,v1 の中間線と u2, v2 の中間線 を一致させる


ダウンロードはこちらから

     download


#4

05 - 4   改訂


**Ver. 1.5.1** ( 2016 04 / 24 )
**コード追加**      inhandle の長さがない ( bz[2] と bz[3] が同一 ) 場合の計算精度を高めるため、t の範囲によって求める式を使い分けするように変更

bezier_line_tangent( bz as vec3 list, t as float ) as vec3

def bezier_line_tangent(bz, t) :
	if bz == None :
		return None
	try :
		#  Ver.1.5.1 にて、 t の範囲によって求める式を使い分けするように変更
		#	これは inhandle の長さがない ( bz[2] と bz[3] が同一 ) 場合の計算精度を高めるため
		if t <= 0.5 :
			v = 3*t**2*(-bz[0] + 3*bz[1] - 3*bz[2] + bz[3]) + 6*t*(bz[0] - 2*bz[1] + bz[2]) + 3*(-bz[0] + bz[1])
		else :
			v = -3*(1 - t)**2*bz[0] + 3*(1 - t)*(1 - 3*t)*bz[1] + 3*t*(2 - 3*t)*bz[2] + 3*t**2*bz[3]
		v.norm()
		
		if v.abs2() < 0.5 :
			if t < 0.5 :				#  outhandle が出ていなくて t = 0
				v = bz[2] - bz[0]
			else :					#  inhandle がでていなくて t = 1
				v = bz[3] - bz[1]
			v.norm()
			
			if v.abs2() < 0.5 :		#  Ver.1.1 で記述を追加
				v = bz[3] - bz[0]
				v.norm()
		return v
	except :
		raise LaboError(3, 'bezier_line_tangent')	


ダウンロードはこちらから

     download


#5

05 - 5   改訂


**Ver. 1.5.2** ( 2016 06 / 04 )
**修正**     面積のない patch に対する処理を追加

      bezier_surface_u_tangent_2(bP as vec3 matrix, s as float, t as float, epsilon as float = 1e-9) as vec3

      bezier_surface_v_tangent_2(bP as vec3 matrix, s as float, t as float, epsilon as float = 1e-9) as vec3


**改善**     parameter 範囲 0〜0 に対応可              parameter 範囲が 0〜1 の場合に処理を簡潔に

      bezier_line_subdivision( bz as vec3 list or vec3 matrix, t1 as float, t2 as float ) as vec3 list or vec3 matrix


**改善**     parameter 範囲が 0〜1 の場合に処理を簡潔に

      bezier_patch_subdivision( bP as vec3 matrix, s1 as float, s2 as float, t1 as float, t2 as float ) as vec3 matrix



ダウンロードはこちらから

     download


#6

05 - 6   改訂


**Ver. 1.5.3** ( 2016 06 / 24 )
**変更**     rotational_quaternion( ) に与える vec3 引数を単位ベクトルに変更

      attitude_control_quaternion(u1 as vec3, v1 as vec3, u2 as vec3, v2 as vec3, fit as int = 0) as quaternion


**変更**     parameter vec3 引数を単位ベクトルに変更

     rotational_quaternion(v1 as vec3, v2 as vec3, altV as vec3) as quaternion

#	Ver.1.5 で追加
#	Ver. 1.5.3 で rotational_quaternion( ) に与える vec3 引数を単位ベクトルに変更
			
#  attitude_control_quaternion(u1 as vec3, v1 as vec3, u2 as vec3, v2 as vec3, fit as int = 0) as quaternion
#		
#	一組のベクトルu1, v1 を、もう一組のベクトルu2, v2 に一致させるような quaternion を返す
#	u1, v1 は単位ベクトルでなくてよいが、平行ではないこと
#	u2, v2 も単位ベクトルでなくてよいが、平行ではないこと
#	u1, v1 のなす角と u2, v2 のなす角が異なる場合、
#		fit = 0 ならば、u1 と u2 を一致させる
#		fit = 1 ならば、 u1,v1 の中間線と u2, v2 の中間線 を一致させる

def attitude_control_quaternion(u1, v1, u2, v2, fit = 0) :	

	#  w1, w2, ww1, ww2
	w1 = u1*v1
	w2 = u2*v2
	r1 = w1.norm()
	r2 = w2.norm()
	
	if r1 == 0 or r2 == 0 :
		return None						#  u1, v1 あるいは u2, v2 が、平行 or 0 vector 

	if fit == 0 :
		ww1 = vec3(u1)
		ww2 = vec3(u2)
	else :
		uu1 = vec3(u1)
		vv1 = vec3(v1)
		uu2 = vec3(u2)
		vv2 = vec3(v2)
		uu1.norm()
		vv1.norm()
		uu2.norm()
		vv2.norm()
		ww1 = uu1 + vv1
		ww2 = uu2 + vv2

	Q1 = rotational_quaternion(w1, w2, u1)				#  回転
	ww1 = Q1*ww1
	ww1.norm()
	ww2.norm()
	Q2 = rotational_quaternion(ww1, ww2, w2)			#  回転

	return Q2*Q1
	

	
#	Ver. 1.5 で追加
#	Ver. 1.5.3 で変更
#	
#  rotational_quaternion(v1 as vec3, v2 as vec3, altV as vec3) as quaternion
#
# 	原点回りに v1 が v2 に重なるような回転 quaternion を返す
#	180度回転になる場合は、altV の回りに回転する
#	v1, v2 は単位ベクトル

def rotational_quaternion(v1, v2, altV) :
	
	if v1.dot(v2) <= -1 + 1e-12 :				#  v1, v2 は単位ベクトル	Ver. 1.5.3 にて変更
		from math import pi
		return quaternion().rotation(altV, pi)
	else :
		return quaternion().slerp(v1, v2, 1)	

	#  Ver. 1.5.3
	#	quaternion().slerp() 内では v1*v2 で平行判定を行っている
	# 	レアなケースだが、v1, v2 が単位ベクトルであっても、v1.dot(v2) = -1 の時に (v1*v2).abs() != 0  となることが発生する
	#	本関数を呼び出す attitude_control_quaternion( ) の仕様に鑑み、下記を採用しないこととした
	
#	Q = quaternion().slerp(v1, v2, 1, False)	#  v1, v2 が180度平行の場合に erroe message を出力しない

#	if Q != None :
#		return Q
#	else :										#  v1, v2 が180度平行
#		from math import pi
#		return quaternion().rotation(altV, pi)	


ダウンロードはこちらから

     download


#7

05 - 7   追加


**Ver. 1.6** ( 2016 07 / 20 )
**追加**     class simple_graph( ) を追加

内容については 31 太さの変わる掃引 ( 1/3 ) を参照


ダウンロードはこちらから

     download





< Shade3D 16 >


Shade3D 16 では参照ファイル構成が変更になっています。

Mac の場合、labo.py, vec3.py, matrix.py, quaternion.py の各ファイルは次のフォルダに格納すればいいようです。

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python


Win ユーザーの方は次の script で参照ファイルを確認して下さい。

import sys
for s in(sys.path) :
	xshade.message(s)

#8

05 - 8  Download link 変更


**download link 変更** ( 2017 / 03 / 12 )
ここからダウンロードして下さい。

          download


#9

05 - 9    追加 / 改訂



Ver. 1.7    ( 2018 / 11 / 21 )


変更     Shade vesion に従って処理を分岐

     get_bezier_patch ( xshade as xshade, m as int, n as int, uuid as string = None, regacy as bool = None )


変更     handle 長さの 0 判定を レンダリング時のポリゴン分割のそれに合わせる

     set_bezier_patch ( bP as vec3 matrix )


追加     Shade version よって分岐された処理を追加

     set_bezier_patch_2 ( bP as vec3 matrix, bb as float list )


変更     Shade 18 以降の DXF file header 構成に対応

     get_bezier_patch_by_DXF ( xshade as xshade, m as int, n as int, uuid as string = None ) as vec3 matrix



ここからダウンロードして下さい。

      download