Shade online フォーラム
ログイン
ユーザ名:

パスワード:

IDとパスワードを記憶

パスワード紛失
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | 下へ
投稿者 スレッド
投稿数: 13
投稿日時: 2010-11-04 15:55
Re: コントロールポイントの座標取得に関して教えて下さい。
結果報告です。

取得したポイントやハンドルの座標を教えていただいた

xshade.scene().world_to_user_matrix
xshade.scene().active_shape().local_to_world_matrix

変換して移動量を計算、座標を出してから

xshade.scene().user_to_world_matrix
xshade.scene().active_shape().world_to_local_matrix

変換した座標にポイントやハンドルを移動して整列

このような形にしました。

これで、Shade V12に移行できます。
ありがとうございました。





投稿数: 13
投稿日時: 2010-10-30 21:02
Re: コントロールポイントの座標取得に関して教えて下さい。
加藤さん

色々試してみます。ありがとうございます。
投稿数: 189
投稿日時: 2010-10-30 17:14
Re: コントロールポイントの座標取得に関して教えて下さい。
すみません、たいへん失礼しました。

「 MASA_さんの指摘どおり… 」と書くべき所、「 さん 」が抜けてしまいました。
投稿数: 189
投稿日時: 2010-10-30 13:38
Re: コントロールポイントの座標取得に関して教えて下さい。
引用:

しんじさんは書きました:
ローカル座標系での作業もあり、ボールジョイント等も使用しています。
頻繁に使用するツールなのですが、すべての場合で作動するのは大変そうなので
どのように対応するか、よく考えてみたいと思います。


ジョイント類や自由曲面の matrix 扱いは基本的にパートのそれと同じですから、

 ・ 直線移動
 ・ 回転
 ・ 拡大縮小
 ・ 均等拡大縮小
 ・ ボールジョイント
 ・ パスジョイント

いずれがどのように入れ子関係になっていても先の script で大丈夫ですよ。
ただし、MASA_ の指摘どおり、スキンはダメなようです。

以下に前記3)のスクリプトを自由曲面に対する処理を含めて書き直しておきます。
それとサンプルファイルも添付しておきます。
サンプルファイルでは local 座標下で色々なジョイント類を入れ子にして最下層に線形状と自由曲面を入れてあります。
下記のスクリプトで position を get してみて下さい。


100.zip


def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	

#  第一選択オブジェクトを取得
scene = xshade.scene()
ob = scene.active_shape()


#  選択オブジェクトチェック
if (ob.type == 2) and (ob.part_type == 1) :	#  自由曲面の場合
	if ob.has_son :				#  中に線形状を含む
	 	ob_type = 1			#   有効な自由曲面
	else :
		ob_type = -1			#   有効でない自由曲面
elif ob.type == 4 :				#  線形状
	ob_type = 0
else :
	ob_type = -2
	
	

if ob_type >= 0 :
	p = ob.control_point(0).position		#  オブジェクトの第一選択ポイント座標

	#  m1 : オブジェクトの local_to_world_matrix
	if ob_type == 0 :				#  線形状	
		m1 = ob.local_to_world_matrix
	else :						#  自由曲面
		obL = scene.active_shapes					
		scene.select_child(1)
		m1 = scene.active_shape().local_to_world_matrix
		scene.active_shapes = obL
	v = cross_mat4(p, m1)


	m2 = scene.world_to_user_matrix	#  m2 : scene の world_to_user_matrix
	v = cross_mat4(v, m2)


	print v
	
elif ob_type == -1 :
	print 'error -  空の自由曲面'
else :
	print 'error -  線形状あるいは自由曲面を選択のこと'
	




また、ジョイント類の内、「 スイッチジョイント 」に対しては

 ・スイッチジョイント内の 線形状/自由曲面 を選択しての position get は OK
 ・スイッチジョイントで指定されているオブジェクトの position get ならば、  
  次のようにして指定されているオブジェクトを取得できます。

ob = xshade.scene().active_shape()	#  スイッチジョンとを選択しておいて実行
index = ob.switch_effector.selection	#  スイッチジョイントで選択するオブジェクトの index
ob2 = ob
ob2 = ob2.son.bro
for i in range(index) :
	ob2 = ob2.bro					#  index 値に従ってスイッチジョイント内のオブジェクトを取得
投稿数: 13
投稿日時: 2010-10-30 10:32
Re: コントロールポイントの座標取得に関して教えて下さい。
MASA_さん、加藤さん

色々と教えていただき、ありがとうございます。

ローカル座標系での作業もあり、ボールジョイント等も使用しています。
頻繁に使用するツールなのですが、すべての場合で作動するのは大変そうなので
どのように対応するか、よく考えてみたいと思います。

分からない事が出ましたら、よろしくお願いします。


投稿数: 189
投稿日時: 2010-10-28 23:23
Re: コントロールポイントの座標取得に関して教えて下さい。
< 追加 >

dummy パートを利用する方法の場合、対象が自由曲面であれば、

 4)複製したオブジェクトを dummy パート内に移動

の後に追加で

 4-2)複製した自由曲面に reset transformation をかける

としておきます。
投稿数: 189
投稿日時: 2010-10-28 21:16
Re: コントロールポイントの座標取得に関して教えて下さい。
MASA_さん、こんにちわ、

御指摘の通り、自由曲面を選択した場合はそのとおりですね。
ありがとうございます。

local_to_world_matrix は Shade 内部で逆マトリックス計算をして答えを出しているので、どうしても誤差が生じてしまいます。

まあそんなことをいちいち気にする必要があるかどうかは別にして、少しでも精度を上げようと思えば、次のような方法もありますね。
個人的にはいつもはこちらの方法を使っています。

1)当該オブジェクトの複製を作る
2)dummy パートを作成する。
3)dummy パートに cancel transformation をかける
4〕複製したオブジェクトを dummy パート内に移動
  → これで複製オブジェクトには一切の上位マトリックスはかからなくなります。
5)position を get する
6)dummy part を中に入れた複製オブジェクト共々削除
7)選択状態を復帰


アニメーションをやっていないのでスキンは使ったことがないのですが、なんとなく面倒くさそうな感じはありありですね。
投稿数: 308
投稿日時: 2010-10-28 13:56
Re: コントロールポイントの座標取得に関して教えて下さい。
加藤さんからの説明に、注意点を2点追加します。
1.自由曲面パートでは、パートを選択した状態で、パートに変換が掛かっている場合は、さらにパートの変換マトリックスを掛ける計算を追加する必要があります。面倒なので、自由曲面の場合、その子の線形状のShapeクラスで計算する手も有ります。
2.もし、そのポイントにスキンが掛かっている場合、ポイントは、最初のバインドジョイントの変換マトリックスの影響下に入り単純には計算できなくなります。
この場合は、ポイントのskinクラスでのskin_world_matrix
を利用してworld位置を取得する必要があります。
この切り替えは、skinバインドがあるかどうか調べないと分からないので結構面倒です。

これらの計算を全部纏めて実行する関数を作ろうかなと思ってましたが、作るより検証の方が大変なので躊躇してます。
投稿数: 13
投稿日時: 2010-10-28 09:19
Re: コントロールポイントの座標取得に関して教えて下さい。
加藤様

applescriptの時は、この辺りを考えなくても結果オーライで動いていました。
大変助かります、ありがとうございました。・・・・・感謝!感謝!
投稿数: 189
投稿日時: 2010-10-27 20:42
Re: コントロールポイントの座標取得に関して教えて下さい。
ついでですが、

ローカルマトリックスを使用した場合、ロクロとローカルマトリックスは処理としては同じなので( たぶん )、

・回転パート内に入っていて
・上位マトリックスがかかっていて
・ローカルマトリックスがかかっていて
・ロクロがかかっている

ような場合でも、下記3)のプログラムで見かけの座標を得ることができますよ。
投稿数: 189
投稿日時: 2010-10-27 20:08
Re: コントロールポイントの座標取得に関して教えて下さい。
< ごめんなさい、再訂正です >

しんじさん、こんにちわ

御質問の件ですが、


1)上位マトリックスがある場合、あるいは回転パート内に入っている場合

active_shape() の local_to_world_matrix を取得してそれを乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	
	

shape = xshade.scene().active_shape()
p = shape.control_point(0).position
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
print v





2)ロクロ機能を使用したとき

scene()) の world_to_user_matrix を取得してそれを乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])


shape = xshade.scene().active_shape()
p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
v = cross_mat4(p, m2)
print v






3)両方がある場合、

active_shape() の local_to_world_matrix を乗じてから
scene()) の world_to_user_matrix を乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	

shape = xshade.scene().active_shape()
p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
v = cross_mat4(v, m2)
print v

投稿数: 189
投稿日時: 2010-10-27 20:00
Re: コントロールポイントの座標取得に関して教えて下さい。
< 訂正版 >

しんじさん、こんにちわ

御質問の件ですが、


1)上位マトリックスがある場合、あるいは回転パート内に入っている場合

active_shape() の local_to_world_matrix を取得してそれを乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	
	

shape = xshade.scene().active_shape()
p = shape.control_point(0).position
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
print v




2)ロクロ機能を使用したとき

scene()) の world_to_user_matrix を取得してそれを乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	

p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
v = cross_mat4(p, m2)
print v




3)両方がある場合、

active_shape() の local_to_world_matrix を乗じてから
scene()) の world_to_user_matrix を乗じてやります。

def cross_mat4(v, m):
	return (
		v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0],
		v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1],
		v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2])
	

p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
v = cross_mat4(v, m2)
print v
投稿数: 189
投稿日時: 2010-10-27 19:57
Re: コントロールポイントの座標取得に関して教えて下さい。
失礼
訂正します
投稿数: 189
投稿日時: 2010-10-27 19:55
Re: コントロールポイントの座標取得に関して教えて下さい。
しんじさん、こんにちわ

御質問の件ですが、


1)上位マトリックスがある場合、あるいは回転パート内に入っている場合

active_shape() の local_to_world_matrix を取得してそれを乗じてやります。

def matrix_cross(m1, m2) :
	m = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
	for i in range(4) :
		for j in range(4) :
			for k in range(4) :
				m[i][j] = m[i][j] + m1[i][k]*m2[k][j]
	return m
	
	

shape = xshade.scene().active_shape()
p = shape.control_point(0).position
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
print v




2)ロクロ機能を使用したとき

scene()) の world_to_user_matrix を取得してそれを乗じてやります。

def matrix_cross(m1, m2) :
	m = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
	for i in range(4) :
		for j in range(4) :
			for k in range(4) :
				m[i][j] = m[i][j] + m1[i][k]*m2[k][j]
	return m
	

p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
v = cross_mat4(p, m2)
print v




3)両方がある場合、

active_shape() の local_to_world_matrix を乗じてから
scene()) の world_to_user_matrix を乗じてやります。

def matrix_cross(m1, m2) :
	m = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
	for i in range(4) :
		for j in range(4) :
			for k in range(4) :
				m[i][j] = m[i][j] + m1[i][k]*m2[k][j]
	return m
	

p = shape.control_point(0).position
m2 = xshade.scene().world_to_user_matrix
m1 = shape.local_to_world_matrix
v = cross_mat4(p, m1)
v = cross_mat4(v, m2)
print v
投稿数: 13
投稿日時: 2010-10-27 10:49
コントロールポイントの座標取得に関して教えて下さい。
これまで、ポイントやハンドルの整列をapplescript(Xcode)で作っていました。
これをPython(widgets)で作成しようとすると座標取得がうまく行かなくて困っています。
対処方法を教えて下さい。

xshade.scene().active_shape().control_point(i).position
xshade.scene().active_shape().control_point(i).in_handle
を使用してコントロールポイントやハンドルの座標を取得する時、

一つは、線形状を含む自由曲面や上位パートのマトリクスに影響される事。

もう一つは、
同じような感じですが、回転パート等で移動しても移動前の座標になる事。

また、ろくろ機能を使用したとき、
線形状を正面に持って来たときの見せかけ?の座標が取得できない事。

説明が下手で申し訳ありません。よろしくお願いします。
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | トップ

最近の投稿

フォーラム スレッド 返信 閲覧 最終投稿
Free Talk DNAの2重らせんの水素結合部位の作成 0 11814 2016-08-01 21:37 Benthos
Free Talk パート内の名前を一括返還 2 14329 2016-03-07 12:21 画像投稿機
Dev Forum イームズシェルチェアーの作成 2 14211 2015-11-25 14:44 CR7
Free Talk MOVファイルについて 17 35368 2014-12-29 17:14 momokuma
Dev Forum 2種類の液体アニメーションを作る方法 0 14308 2014-11-13 10:42 mejapan
Free Talk 面取りについて 0 13424 2014-11-08 15:18 MoonChild
Free Talk 丸太を結ぶ縄の作成について 1 19631 2014-09-18 22:33 kenslab
Free Talk パーティクルフィジックスのメタパーティクルについて 0 13887 2014-09-03 20:40 penta
Free Talk データの保存に関して 2 13740 2014-08-18 01:24 sierra
Free Talk Shade 3D ver14での、ポリゴンメッシュへの変換以上終了 1 14167 2014-04-23 12:04 MASA_