iCAx开思工具箱

标题: 【求助】关于旋转,缩放,平移物体 [打印本页]

作者: vcreat    时间: 2004-9-2 07:52
标题: 【求助】关于旋转,缩放,平移物体
各位能不能给一个在ug open api里面旋转,缩放,平移物体的大体思路。
  
我现在有一个旋转体(从一个封闭曲线图形旋转得到),想对他进行旋转,缩放,平移操作。
  
我的思路是用UF_mtx和UF_CSYS函数,想用UF_MTX_edit_matrix_of_obj, 用新的转换矩阵代替原来物体自带的矩阵,然后用UF_MODL_update更新,但是现在同样被卡在identifier了。。。真是败给identifier了,刚才的问题就是关于物体的identifier,现在又是关于矩阵的。。。。。UF_MTX_edit_matrix_of_obj需要新矩阵的identifer...但是我的变幻矩阵是通过UF_mtx4_rotation,UF_mtx4_scale之类的函数得到的,这些函数只能返回具体的double scale[16]矩阵(相当于[4][4]).但是没有矩阵的identifier.....又被卡住了。。。。要是说用遍历,type=UF_OBJ_solid_type还可能找到旋转体的identifer....那现在我是彻底没辙了,鬼知道矩阵是什么type!!也没有名字!!,找了半天也找不到如何得到矩阵identifer的函数,一天就这样白费,真是被这个open API打败了!!难道就不能让每个函数都把新生成的物体或者矩阵的identifier返回?
  
求大家帮帮忙吧,我个人觉得矩阵操作是物体变换的最好形式了,但是就是做不下去了,请大家看看是不是我哪里有错误,或者干脆思路就不对,应该用别的方法?谢谢大家啦,急呀
作者: 深夜摔键盘    时间: 2004-9-2 08:18
假如你的对象是在UG中,还做变换搞啥?
作者: 深夜摔键盘    时间: 2004-9-2 08:20
UF_MTX3_identity  
UF_MTX4_identity
看看这个是不是;
作者: suye007    时间: 2004-9-2 09:21
实用uf_trns.h里面的那几个函数,旋转,缩放,平移都有了
作者: vcreat    时间: 2004-9-3 06:23
不行,uf_trns.h里面的函数也都是些计算各种变换矩阵的函数,不能直接对物体进行操作,并且这些都是些老函数,估计现在早就被uf_mtx.h代替了
  
难道再没别的办法了吗?
作者: eagleflying    时间: 2004-9-3 13:26
give you an example:
  
//get an rotate matrix  
  FTN(uf5945)( origin,
              dir_vec,
              &ang_to_rotate,
              rot_matrix,
              &rcode
            );
//get an translate matrix
FTN(uf5943)( dist_to_trans,
             trans_matrix
           );
//combine an rotate and translate operation matrix  
FTN(uf5942)( rot_matrix,
             trans_matrix,
             product_matrix
           );
//realize objects rotate and translate  
FTN(uf5947)( product_matrix,
    &tag_vals,
    &count,
    &copy,     /* copy  */
    &layer,    /* Work Layer */
    &off_on,     /* Trace Curve off */
    &copied_tag_vals,
    &dummy,
    &rcode
    );
  
uf_trns.h funs can operate object and point translation.
作者: abeam    时间: 2004-9-3 13:55
to:eagleflying   
能不能写具体些撒,就一个函数在那里看不明白。能不能写个例子撒!!
作者: suye007    时间: 2004-9-3 14:54
vcreat wrote:
不行,uf_trns.h里面的函数也都是些计算各种变换矩阵的函数,不能直接对物体进行操作,并且这些都是些老函数,估计现在早就被uf_mtx.h代替了  
  
  难道再没别的办法了吗?

  
真是开玩笑!什么被叫uf_matx.h代替了?
你试试哪个好用了吗?自己没仔细看就说"都是些计算各种矩阵的函数"?uf5947不是可以实现旋转,平移?我反正都是用的这个函数,你实在不会俺也帮不了忙了......
作者: zzz    时间: 2004-9-3 17:03
旋转和平移的实体上不能有特征信息。
作者: abeam    时间: 2004-9-3 20:15
有特征信息的物体该用什么方法实现平移和旋转呢?
作者: vcreat    时间: 2004-9-4 06:43
是啊,我的这个选转体就是用剖面线旋转生成的,所以不属于单个物体。用uf5947实现不了变换,但是能顺利实现复制平移,所以说uf5947这个函数我还是没用错,但是把flag变成move就不行了,没有反应。
  
后来在斑竹的手把手教二次开发的帖子看到另一位朋友说用uf_MODL_move_features(),我也尝试了,先用UF_MODL_ask_body_feature()获得物体的feature list,然后把这个list和用uf_mtx函数(用uf_trns里面的函数计算的矩阵我也试了,一样不行)计算的变换矩阵一起放进uf_MODL_move_feature里面,最后还尝试把uf_MODL_update()换成UF_MODL_update_all_features(),也不行,屏幕倒是闪了一下,好像有什么操作,但是物体并没动,平移,旋转我都试了,一样没反应。scale还没有,准备明天试一试,请问zzz老大,那里出错拉?应该如何对features实现move变换?谢谢啦
作者: fourwood    时间: 2004-9-4 11:21
干吗不删了,重新做特征,何必呢
作者: vcreat    时间: 2004-9-4 16:59
怎么重新做呢?可是旋转体我只想到这种做法呀,就是先画剖面线,然后再旋转,这也是花旋转体的基本思路把。。。。大家还有什么办法呀
作者: goodluckwu    时间: 2004-9-6 15:52
我也碰到过你说的类似的问题,但是我的物体是没有特征的。所以我用了trns.h里的函数解决了。你说的问题其实也好办,既然是旋转体如果对它进行旋转和平移,你就把它的旋转轴和母线求出来,然后旋转平移。然后再建立旋转体就好了阿。如果是缩放,调整母线和旋转轴的距离就好了。如果缩放发生在平行于旋转轴的方向,就先对母线缩放(使用trns.h)然后在旋转好了。
作者: zzz    时间: 2004-9-6 16:42
可以先把特征参数去掉
UF_MODL_delete_body_parms()
作者: vcreat    时间: 2004-9-6 17:11
Thank you, goodluckwu and zzz boss!! I will try your ideas now.Thank you very much!!
作者: vcreat    时间: 2004-9-7 18:27
爱死zzz老大!!!!问题基本解决拉
  
不过还有两个问题要请教:
现在缩放还是没反应,不管是move还是copy, 这部分的代码几乎和平移,旋转一样,都是用UF_MTX4_scaling生成一个4x4的缩放矩阵(我也试了5944,可能是这个名字吧,记不清了,也是一个生成缩放矩阵的函数),经调试这个矩阵式没问题,然后用5947() 进行缩放,不管我把flag设成1还是2,物体一点变化都没有,但是屏幕会闪一下,似乎有什么操作,我也用uf_modl_update更新过了,没用。旋转体经过UF_MODL_delete_body_parms() 处理了,然后把tag传递出来,这些也没问题,因为平移和旋转都没问题,所以物体的identifier应该也是对的。又不知道怎么办了。。。。。不过我可以先用uf_MODL_create_scale先凑副交差,可是还是想知道为什么用5947就是不行。
  
第二个问题是,用UF_MODL_delete_body_parms()把物体删除了参数,那如果以后要访问这些参数怎么办?比如用uF_MODL_edit_exp更改其中的某些参数。 还有物体的features也被删除了么?还是继续保留在物体里?比如面,边等特征。谢谢啦
作者: abeam    时间: 2004-9-8 10:27
to:vcreat  
能不能把实现平移和旋转的代码贴出来,
让我们学习学习撒
呜呜~~拜托!!!
作者: vcreat    时间: 2004-9-8 15:21
No problem! I will post all source code later.
作者: abeam    时间: 2004-9-8 15:41
to:vcreat  
哈哈,爱死vcreat了,
加油,期待中哟~~~
作者: vcreat    时间: 2004-9-9 07:41
先别着急呀,我还等着各位大虾给我解释一下缩放,明天去学校把缩放的代码贴出来请大家指教一下那里有错
作者: abeam    时间: 2004-9-9 09:02
呜呜,记得明天还要把旋转,平移的代码贴出来哟~~
哈哈
期待ing~~
作者: goodluckwu    时间: 2004-9-9 13:58
vcreat wrote:
爱死zzz老大!!!!问题基本解决拉  
  
  不过还有两个问题要请教:  
  现在缩放还是没反应,不管是move还是copy, 这部分的代码几乎和平移,旋转一样,都是用UF_MTX4_scaling生成一个4x4的缩放矩阵(我也试了5944,可能是这个名字吧,记不清了,也是一个生成缩放矩阵的函数),经调试这个矩阵式没问题,然后用5947() 进行缩放,不管我把flag设成1还是2,物体一点变化都没有,但是屏幕会闪一下,似乎有什么操作,我也用uf_modl_update更新过了,没用。旋转体经过UF_MODL_delete_body_parms() 处理了,然后把tag传递出来,这些也没问题,因为平移和旋转都没问题,所以物体的identifier应该也是对的。又不知道怎么办了。。。。。不过我可以先用uf_MODL_create_scale先凑副交差,可是还是想知道为什么用5947就是不行。  
  
  第二个问题是,用UF_MODL_delete_body_parms()把物体删除了参数,那如果以后要访问这些参数怎么办?比如用uF_MODL_edit_exp更改其中的某些参数。 还有物体的features也被删除了么?还是继续保留在物体里?比如面,边等特征。谢谢啦

  
第一个问题我也碰到了(我用的是59XX),至今没有解决(幸好只是我自己做着玩的东西,如果是项目就……)。我用了UF_MODL_delete_body_parms()也不行,郁闷啊。也就是说我没有办法:)
  
第二个问题的答案就简单了:没有办法。删除了参数之后就变成了非参数化的东西,无法再通过修改参数的方法来修改。这也是我为什么没有建议你使用UF_MODL_delete_body_parms()的原因,像我前面的帖子里说的做法虽然麻烦很多,但是可以保证参数依然存在。
作者: abeam    时间: 2004-9-12 08:57
那这些问题该怎样解决那??
呜呜,
有没有办法解决呀~~
作者: sincosxu    时间: 2007-9-27 10:18
标题:
等了三年了,还是没看到贴出代码....................
大家共同进步啊.....
作者: LIUCHANGLIN    时间: 2008-6-24 12:58
呵呵,我等了四年,还没看到贴出代码....................哈哈哈哈
哈哈
哈哈
哈哈
哈哈
作者: hongweiyu2005    时间: 2008-6-29 10:48
旋转和平移的实体上有特征信息-------能做到吗
作者: Jkklk    时间: 2008-7-5 21:10
楼主不厚道啊,自个问题解决了,就不跟大家分享代码了,哈哈,以后谁还帮你呢!
作者: lightshining    时间: 2009-2-13 16:40
五年了。。。。。。
作者: wansqs    时间: 2009-7-29 16:23
27#  

这位仁兄能和你交流交流吗?最近在做项目遇到了问题,可以的话加我QQ啊553915701
作者: 苏州人    时间: 2009-11-26 17:27
这个问题最难得地方就是计算出旋转,移动的矩阵
然后用函数 UFS.Trns.TransformObjects()去实现就可以了。。

没有上面各位高手讲的复杂的,关于这些矩阵在计算机图形学的书上有,看一下就可以了
作者: printsimp    时间: 2010-1-8 22:59
矩阵太复杂了,搞不懂
作者: yanjin    时间: 2013-6-2 21:47
平移旋转变换类,用OPEN GRIP最快了,代码简单易懂。。。。

UG OPEN API平移变换代码如下,已通过编译,选择物体变换


double rp1 [ 16 ];
tag_p_t objects;
int  n_objects=0;
int  move_or_copy=1;
int  cdest_layer=0;
int  trace_curves=1;
tag_t  copies;
tag_t trace_curve_group;
int  status=0;
int count=0;

int i=0;

int response=0;
const double from_origin [ 3 ]={0,0,0};
const double from_x_axis [ 3 ]={1,0,0};
const double from_y_axis [ 3 ]={0,1,0} ;
const double to_origin [ 3 ]={100,0,0};
const double to_x_axis [ 3 ]={1,0,0} ;
const double to_y_axis [ 3 ]={0,1,0};



UF_MTX4_csys_to_csys(
from_origin,
from_x_axis  ,
from_y_axis,
to_origin ,
to_x_axis  ,
to_y_axis ,
rp1

);

/* Initialize the API environment */
    if( UF_CALL(UF_initialize()) )
    {
        /* Failed to initialize */
        return;
    }

        UF_UI_select_with_class_dialog("","",1,NULL,NULL,&response,&count,&objects);



        if(response==UF_UI_OK&&count>0){

                for(i=0;i<count;i++){

UF_DISP_set_highlight(objects[i],0);
                }

        }

uf5947(rp1,objects , &count,  &move_or_copy, &cdest_layer, &trace_curves, &copies, &trace_curve_group, &status );















    UF_CALL(UF_terminate());




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3