Re: 標準機能を使用するスクリプトの作成方法。
6件表示
すべてのコメント一覧へ
投稿ツリー
-
標準機能を使用するスクリプトの作成方法。 (asha, 2009/10/4 19:36)
-
Re: 標準機能を使用するスクリプトの作成方法。 (nanmo, 2009/10/4 21:05)
-
Re: 標準機能を使用するスクリプトの作成方法。 (asha, 2009/10/5 18:52)
-
Re: 標準機能を使用するスクリプトの作成方法。 (yamyam, 2009/10/6 7:37)
-
Re: 標準機能を使用するスクリプトの作成方法。 (asha, 2009/10/8 13:21)
- Re: 標準機能を使用するスクリプトの作成方法。 (uimac, 2009/10/10 1:15) «
-
Re: 標準機能を使用するスクリプトの作成方法。 (asha, 2009/10/8 13:21)
-
Re: 標準機能を使用するスクリプトの作成方法。 (yamyam, 2009/10/6 7:37)
-
Re: 標準機能を使用するスクリプトの作成方法。 (asha, 2009/10/5 18:52)
-
Re: 標準機能を使用するスクリプトの作成方法。 (nanmo, 2009/10/4 21:05)
uimac
投稿数: 49
私も少し考えてみましたが、自前で実装するのが一番早いと思います。
BlenderのMeshとArmatureのみで、ついでにShapeKey付きMeshに対応した「apply Scale and Rotate to obData」は、下記。
pythonからアクセスする手段は無いに等しいです。
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
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki