BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3865|回复: 13

成功在Blender里面加入自己的功能:Cloth气体压力模拟

[复制链接]
发表于 2012-4-8 11:31:36 | 显示全部楼层 |阅读模式
本帖最后由 acme_pjz 于 2013-3-18 21:45 编辑

如题,成功把代码黑到Blender cloth simulation里面,目前先测试一下代码是否能读取自定义属性,结果测试成功PS:Blender太强大了,自定义的属性也支持动画

blender262.3-1.png

blender262.3-0.png

PS:问一个问题,要是想往Blender cloth simulation里面加一些功能,是否可以只写Python代码,而不用修改Blender内部代码呢?
另一个问题:目前我是先在Object面板的自定义属性中手工添加了一个新属性,然后C代码通过ID-Property API读取自定义属性,但是Blender标准的修改器估计不是用这种方法读取属性的,不知道在什么模块中读取的……

发表于 2012-4-11 15:36:43 | 显示全部楼层
关于你的第一个问题,是否只写python代码而不用修改blender内部代码,取决于你所涉及的是什么功能,请参考下面的链接,里面列出了利用python接口可以做和不可以做的事情。
http://www.blender.org/documenta ... nfo_quickstart.html

blender中数据接口(data API)是通过RNA来实现的。参考
http://wiki.blender.org/index.ph ... rchitecture/DataAPI

不知道你这个自定义的属性是blender本身原有的属性,你只是通过python代码将这个属性在界面上显示出来,还是说你为某个数据结构(例如Mesh)添加了一个全新的属性(即在DNA_mesh_types.h中为mesh结构体添加了一个新的数据成员)。我相信你指的是前者。根据属性的类型(假设为int型),你可以通过RNA_property_int_get函数来取得(在RNA_access.h)文件中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-12 22:59:59 | 显示全部楼层
火星杰 发表于 2012-4-11 15:36
关于你的第一个问题,是否只写python代码而不用修改blender内部代码,取决于你所涉及的是什么功能,请参考 ...

现在我已经把C代码改掉了,至于Modifier属性问题,我也改了,把结构体和rna_cloth.c和Python界面定义文件改了,现在新增的属性显示在Cloth面板里面了……不过还有一个问题,我设置的一个属性的默认值是1.0,但是如果打开旧的blend文件里面已经有Cloth modifier的话,那个属性读出来会变成0.0,完全不按照我设置的默认值读出来,目前还不知道怎么修改……

附件是新的界面截图,还有针对r45571的patch文件

无标题-1.png

out.zip

3.51 KB, 下载次数: 1579

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-12 23:31:11 | 显示全部楼层
我在blendercoders IRC上跟老外谈过我这个补丁,他们让我在Blenderartists上面发贴:http://blenderartists.org/forum/ ... ressure-enhancement 还让我把编译好的文件上传到Graphicall(现在还没上传)……
回复 支持 反对

使用道具 举报

发表于 2012-4-13 16:24:01 | 显示全部楼层
acme_pjz 发表于 2012-4-12 22:59
现在我已经把C代码改掉了,至于Modifier属性问题,我也改了,把结构体和rna_cloth.c和Python界面定义文件 ...

老外回答很详细了。

旧的blend文件中没有你新定义的那个属性,读进来时,blender就直接设置为0.0.

你可以在readfile.c的do_version中检测如blend文件的版本低于你当前的版本,就为这个新属性设置默认值。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-14 00:15:21 | 显示全部楼层
火星杰 发表于 2012-4-13 16:24
老外回答很详细了。

旧的blend文件中没有你新定义的那个属性,读进来时,blender就直接设置为0.0.

我看到回答了,不过我看了看do_version函数,里面写得又臭又长,所以我没修改,生怕什么地方改乱了……我采纳了老外的另一个建议,在物理模拟的时候判断参数是否是0.0,如果是的话就用默认值代替……

另外我把Patch上传到Blender Patch Tracker上面去了:http://projects.blender.org/trac ... p_id=9&atid=127
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-19 22:23:08 | 显示全部楼层
现在还有一个问题:为了方便修改体积,我打算加一个按钮,点击之后计算体积(通过Python脚本),现在按钮加进去了,不过计算体积是通过Mesh对象的Polygons集合来进行计算的,有一些问题:没有判断每个Polygon的边数,导致程序计算结果不对,或者脚本运行出错;另外当物体形变之后应该读取Point cache里面的顶点坐标,而且我觉得体积计算函数应该放到C代码里面以增加运行效率,然后导出此函数以通过Python调用,不知道应该怎么搞比较好
回复 支持 反对

使用道具 举报

发表于 2012-4-19 23:41:29 | 显示全部楼层
acme_pjz 发表于 2012-4-19 22:23
现在还有一个问题:为了方便修改体积,我打算加一个按钮,点击之后计算体积(通过Python脚本),现在按钮加 ...

不知道你是不是采用如下的步骤,如果不是的话,你可以尝试一下。

1)在文件source\blender\editors\mesh\mesh_intern.h添加一个新的函数声明
void MESH_OT_calc_volume(struct wmOperatorType *ot);

2)在source\blender\editors\mesh\mesh_ops.c文件的函数
void ED_operatortypes_mesh(void)中添加
WM_operatortype_append(MESH_OT_calc_volume);

3) 在source\blender\editors\mesh\editmesh_mods.c文件中添加MESH_OT_calc_volume的实现,通常需要写如下几个函数:

3.1)operator函数的定义
void MESH_OT_calc_volume(wmOperatorType *ot)
{
        /* identifiers */
        ot->name= "Calc mesh volume";
        ot->description= "calculate the volume of mesh";
        ot->idname= "MESH_OT_calc_volume";
       
        /* api callbacks */
        ot->exec= MESH_OT_calc_volume_exec;
        ot->invoke=MESH_OT_calc_volume_invoke;
        ot->poll= ED_operator_editmesh;
       
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}

3.2)invoke函数和exec函数也需要写,你可以看看editmesh_mods.c中的文件做参考。
其中exec中应该实行你真正的体积计算功能。

4)上述操作完成后,你就可以在Blender中调用了。可以通过按空格键,弹出命令查询窗口,输入calc mesh volume,就可以调用了。但是为了能够在界面中看到这个按钮,你需要在python脚本中添加。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-20 12:34:39 | 显示全部楼层
火星杰 发表于 2012-4-19 23:41
不知道你是不是采用如下的步骤,如果不是的话,你可以尝试一下。

1)在文件source\blender\editors\mesh ...

非常感谢有空我研究一下……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-16 15:13:17 | 显示全部楼层
我把我这个补丁和老外的一个补丁合并了一下,升级到最新2.66.1版 我刚刚注册GraphiCall,点击上传文件需要手工审核-_-||| 所以只好先传到115去:http://q.115.com/102775/1201215.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-10-17 09:12 , Processed in 0.020753 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表