Re: 標準機能を使用するスクリプトの作成方法。

投稿ツリー


このトピックの投稿一覧へ

通常 Re: 標準機能を使用するスクリプトの作成方法。

msg# 1.1.1.1.1.1
depth:
5
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/10/10 1:15
uimac  常連   投稿数: 49
私も少し考えてみましたが、自前で実装するのが一番早いと思います。
BlenderのMeshとArmatureのみで、ついでにShapeKey付きMeshに対応した「apply Scale and Rotate to obData」は、下記。
pythonからアクセスする手段は無いに等しいです。

// src/editobject.c
// static void apply_objects_internal( int apply_scale, int apply_rot )
{
	Base *base, *basact;
	Object *ob;
	bArmature *arm;
	Mesh *me;
	MVert *mvert;
	float mat[3][3];
	int a, change = 0;
	
	float *fp;
	KeyBlock *block;
	
	if (!apply_scale && !apply_rot) {
		/* do nothing? */
		error("Nothing to do!");
		return;
	}
	/* first check if we can execute */
	for (base= FIRSTBASE; base; base= base->next) {
		if TESTBASELIB(base) {
ob= base->object;
if(ob->type==OB_MESH) {
	me= ob->data;
	
	if(me->id.us>1) {
		error("Can't apply to a multi user mesh, doing nothing.");
		return;
	}
	// by uimac
	//if(me->key) {
	//	error("Can't apply to a mesh with vertex keys, doing nothing.");
	//	return;
	//}
}
else if (ob->type==OB_ARMATURE) {
	arm= ob->data;
	
	if(arm->id.us>1) {
		error("Can't apply to a multi user armature, doing nothing.");
		return;
	}
}
		}
	}
	
	/* now execute */
	basact= BASACT;
	base= FIRSTBASE;
	for (base= FIRSTBASE; base; base= base->next) {
		if TESTBASELIB(base) {
ob= base->object;

if(ob->type==OB_MESH) {
	if (apply_scale && apply_rot)
		object_to_mat3(ob, mat);
	else if (apply_scale)
		object_scale_to_mat3(ob, mat);
	else
		object_rot_to_mat3(ob, mat);

	me= ob->data;
	
	// by uimac
	if(me->key) {
	 for (block = (KeyBlock*)me->key->block.first; block; block = block->next) {
	  fp = (float*)block->data;
	  for(a = 0; a < block->totelem; a++, fp+= 3) {
	   Mat3MulVecfl(mat, fp);
	  }
	 }
	}

	/* see checks above */
	
	mvert= me->mvert;
	for(a=0; a<me->totvert; a++, mvert++) {
		Mat3MulVecfl(mat, mvert->co); // 要はこれ
	}
	if (apply_scale)
		ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
	if (apply_rot)
		ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
	/*QuatOne(ob->quat);*/ /* Quats arnt used yet */
	
	where_is_object(ob);
	
	/* texspace and normals */
	BASACT= base;
	enter_editmode(EM_WAITCURSOR);
	BIF_undo_push("Applied object");	/* editmode undo itself */
	exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
	BASACT= basact;
	
	change = 1;
}
else if (ob->type==OB_ARMATURE) {
	if (apply_scale && apply_rot)
		object_to_mat3(ob, mat);
	else if (apply_scale)
		object_scale_to_mat3(ob, mat);
	else
		object_rot_to_mat3(ob, mat);
	arm= ob->data;
	
	/* see checks above */
	apply_rot_armature(ob, mat); //他のファイルで定義されてますね。ググると出てきます
	
	/* Reset the object's transforms */
	if (apply_scale)
		ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
	if (apply_rot)
		ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
	/*QuatOne(ob->quat); (not used anymore)*/
	
	where_is_object(ob);
	
	change = 1;
}

// 以下略

投票数:14 平均点:7.14

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki