青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE General Transformation

Posted on 2015-01-22 20:30 eryar 閱讀(5919) 評論(1)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE General Transformation

eryar@163.com

Abstract. OpenCASCADE provides a general transformation class: gp_GTrsf. It can be a transformation from gp, an affinity, or you can define your own transformation giving the matrix of transformation. The general transformation contains the vectorial part of the transformation and the translation part. A GTrsf transformation is only applicable to coordinates. Be careful if you apply such a transformation to all points of a geometric object, as this can change the nature of the object and thus render it incoherent. Typically a circle is transformed into an ellipse by an affinity transformation. To avoid modifying the nature of an object, use a gp_Trsf transformation instead, as objects of this class respect the nature of geometric objects.

Key Words. OpenCASCADE, Transformation, Affinity Transformation

1. Introduction

仿射變換(Affinity Transformation)是指線性變換后接著平移。因此,仿射變換的集合是線性變換的超集,任何線性變換都是仿射變換,但不是所有的仿射變換都是線性變換。

仿射變換的定義如下:在空間直角坐標系下,點(x,y,z)與點(x’, y’,z’)之間的變換

wps_clip_image-2056

稱為仿射變換。如果采用特殊的齊次坐標來表達,仿射變換也可用下列形式:

wps_clip_image-15105

空間仿射變換是把平面變換到平面,直線變換到直線。兩個平行平面的像也是平行的。共線三點的的簡單比是不變量。平行六面體的體積是權為1的相對不變量。

OpenCASCADE的TKMath庫中提供了這上仿射變換類gp_GTrsf,它能執行比gp_Trsf更通用的變換。對于TopoDS_Shape,OpenCASCADE分別提供了如下兩個類進行變換:

v BRepBuilderAPI_GTransform

v BRepBuilderAPI_Transform

本文在OpenCASCADE Draw Test Harness中給出這兩個類實現變換的結果。如果不想改變幾何的特性,只想改變模型的位置或朝向,建議采用BRepBuilderAPI_Transform。

2.BRepBuilderAPI_Transform

OpenCASCADE中使用算法BRepBuilderAPI_Transform來實現:平移、旋轉、縮放及鏡像變換。在Draw Test Harness中實現的函數代碼如下所示:

static Standard_Integer transform(Draw_Interpretor& di,Standard_Integer n,const char** a)
{
  
if (n <= 1return 1;

  gp_Trsf T;
  Standard_Integer last 
= n;
  
const char* aName = a[0];

  Standard_Boolean isBasic 
= Standard_False;

  
if (!strcmp(aName,"reset")) {
  }
  
else {
    isBasic 
= (aName[0== 'b');
    aName
++;

    
if (!strcmp(aName,"move")) {
      
if (n < 3return 1;
      TopoDS_Shape SL 
= DBRep::Get(a[n-1]);
      
if (SL.IsNull()) return 0;
      T 
= SL.Location().Transformation();
      last 
= n-1;
    }
    
else if (!strcmp(aName,"translate")) {
      
if (n < 5return 1;
      T.SetTranslation(gp_Vec(Draw::Atof(a[n
-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1])));
      last 
= n-3;
    }
    
else if (!strcmp(aName,"rotate")) {
      
if (n < 9return 1;
      T.SetRotation(gp_Ax1(gp_Pnt(Draw::Atof(a[n
-7]),Draw::Atof(a[n-6]),Draw::Atof(a[n-5])),
                    gp_Vec(Draw::Atof(a[n
-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2]))),
                    Draw::Atof(a[n
-1])* (M_PI / 180.0));
      last 
= n-7;
    }
    
else if (!strcmp(aName,"mirror")) {
      
if (n < 8return 1;
      T.SetMirror(gp_Ax2(gp_Pnt(Draw::Atof(a[n
-6]),Draw::Atof(a[n-5]),Draw::Atof(a[n-4])),
                  gp_Vec(Draw::Atof(a[n
-3]),Draw::Atof(a[n-2]),Draw::Atof(a[n-1]))));
      last 
= n-6;
    }
    
else if (!strcmp(aName,"scale")) {
      
if (n < 6return 1;
      T.SetScale(gp_Pnt(Draw::Atof(a[n
-4]),Draw::Atof(a[n-3]),Draw::Atof(a[n-2])),Draw::Atof(a[n-1]));
      last 
= n-4;
    }
  }

  
if (T.Form() == gp_Identity || isBasic) {
    TopLoc_Location L(T);
    
for (Standard_Integer i = 1; i < last; i++) {
      TopoDS_Shape S 
= DBRep::Get(a[i]);
      
if (S.IsNull())
        di 
<< a[i] << " is not a valid shape\n";
      
else
        DBRep::Set(a[i],S.Located(L));
    }
  }
  
else {
    BRepBuilderAPI_Transform trf(T);
    
for (Standard_Integer i = 1; i < last; i++) {
      TopoDS_Shape S 
= DBRep::Get(a[i]);
      
if (S.IsNull()) {
        di 
<< a[i] << " is not a valid shape\n";
      }
      
else {
        trf.Perform(S);
        
if (!trf.IsDone())
          
return 1;
        DBRep::Set(a[i],trf.Shape());
      }
    }
  }
  
return 0;
}

下面給出應用Tcl腳本來實現這些變換的例子:

# make rotated copies of a sphere in between two cylinders
# create a file source toto.tcl
# toto.tcl code:

pload ALL

#create a sphere
psphere s 3
ttranslate s 
25 0 12.

for {set i 0} {$i < 360} {incr i 20} {
    copy s s
$i
    trotate s
$i 0 0 0 0 0 1 $i
    
    vdisplay s
$i
}
# create two cylinders
pcylinder c1 30 5
copy c1 c2
ttranslate c2 
0 0 20
vdisplay c1 c2 s

腳本運行效果如下圖所示:

wps_clip_image-18963

Figure 2.1 Transform Tcl demo

從Draw中實現的函數來看,移動、旋轉及縮放變換都是使用類

BRepBuilderAPI_Transformation來實現。Tcl腳本中先創建出一個球體,再平移后,復制13份,最后又創建出兩個圓柱體。如果要對TopoDS_Shape進行變換且不改變其中的幾何性質,建議都使用這個類來完成。

3.BRepBuilderAPI_GTransform

在OpenCASCADE也可使用仿射變換BRepBuilderAPI_GTransform來對形狀實現上述變換操作,還可提供變形的變換,因此仿射變換是更一般的變換方法。在Draw中實現的函數代碼如下所示:

///=======================================================================
// gtransform
//=======================================================================
static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const char** a)
{
  
if (n <= 1return 1;
  
  Standard_Integer last 
= n;
  
  gp_Trsf T;
  gp_GTrsf GT(T);
  
//  gp_Mat rot(Draw::Atof(a[last-3]),0,0,0,Draw::Atof(a[last-2]),0,0,0,Draw::Atof(a[last-1]));
  gp_Mat rot(Draw::Atof(a[3]),0,0,0,Draw::Atof(a[4]),0,0,0,Draw::Atof(a[5]));
  GT.SetVectorialPart(rot);
  last 
-= 3;
  BRepBuilderAPI_GTransform gtrf(GT);
  BRepBuilderAPI_NurbsConvert nbscv;
  
//  for (Standard_Integer i = 1; i < last; i++) {
  
//    TopoDS_Shape S = DBRep::Get(a[i]);
  TopoDS_Shape S = DBRep::Get(a[2]);    
  
if (S.IsNull()) {
    
//cout << a[2] << " is not a valid shape" << endl;
    di << a[2<< " is not a valid shape" << "\n";
  }
  
else {
    gtrf.Perform(S);
    
if (gtrf.IsDone()){
      DBRep::Set(a[
1],gtrf.Shape());
    }
    
else {
      
return 1;
    }
  }
  
  
return 0;
}

根據仿射變換的定義,給定一個球面的數學表達式:

wps_clip_image-14741

應用如下的仿射變換,將會得到一個橢球面:

wps_clip_image-5848

由變換公式解得:

wps_clip_image-13797

將它代入球面方程得到:

wps_clip_image-17839

在Draw中使用BRepBuilderAPI_GTransform變換得到如下圖所示:

wps_clip_image-23346

Figure 3.1 Shape Deformation

關于仿射變換有個重要定理:一般仿射變換是正交變換、沿著三個互相正交方向的壓縮或放大和平移這三者的乘積。上述命令的實現代碼就是設置了仿射矩陣中的a,b和c值,從而達到對模型變形的效果。

4.Conclusion

在三維建模軟件中經常需要對模型的位置和其朝向進行變換,如果不想改變模型中的幾何特性,在OpenCASCADE中建議使用類BRepBuilderAPI_Transform來實現。如果需要對模型進行更通用的變換即仿射變換,可以使用類BRepBuilderAPI_GTransform來實現。使用此類后,會改變模型中的幾何特性,必須謹慎使用。

5. References

1. OpenCASCADE, OpenCASCADE Draw Test Harness User Guide, 2014

2. 蘇步表, 華宣積. 應用幾何教程. 復旦大學出版社. 2012

3. Fletcher Dunn. 3D Math Primer for Graphics and Game Development. Wordware. 2002

 

Feedback

# re: OpenCASCADE General Transformation  回復  更多評論   

2015-01-27 15:25 by 黑皮甘蔗
好久沒用過C++語言了,都忘記了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费福利视频| 亚洲国产日韩欧美一区二区三区| 国产精品美女久久久久av超清 | 国产欧美精品va在线观看| 亚洲国产精品一区二区三区| 亚洲精品乱码久久久久久黑人| 欧美电影免费| 亚洲在线免费观看| 久久久亚洲成人| 亚洲精品一区二区三区不| 欧美日韩一区二区视频在线| 亚洲欧美日韩成人| 亚洲国产精品久久久| 欧美有码在线观看视频| 亚洲精品视频在线观看网站| 国产精品二区在线| 欧美激情女人20p| 久久av一区| 亚洲欧美一区二区原创| 91久久国产综合久久| 久久综合伊人77777蜜臀| 一区二区日韩精品| 亚洲国产精品视频| 国产视频精品xxxx| 国产精品美女主播| 欧美午夜国产| 国产精品成人一区二区三区夜夜夜 | 欧美视频亚洲视频| 欧美激情自拍| 久久婷婷国产综合精品青草| 亚洲欧美电影在线观看| 日韩午夜免费视频| 一区二区三区.www| 亚洲精品视频在线看| 99国产精品国产精品毛片| 亚洲欧洲日韩综合二区| 亚洲人成毛片在线播放| 亚洲国产清纯| 日韩亚洲欧美成人一区| 夜夜嗨av一区二区三区| 这里是久久伊人| 亚洲一区二区在线看| 欧美在线视频一区二区三区| 欧美一区日韩一区| 美国成人直播| 欧美人交a欧美精品| 欧美色视频日本高清在线观看| 欧美精品www| 国产精品网站在线观看| 亚洲福利专区| 亚洲一区综合| 亚洲黄色天堂| 香蕉亚洲视频| 欧美系列一区| 亚洲国产精品成人综合色在线婷婷| 日韩一区二区精品在线观看| 亚洲欧美美女| 最新高清无码专区| 久久亚洲精品一区二区| 国产精品人人做人人爽| 日韩午夜av| 亚洲国产aⅴ天堂久久| 久久精品理论片| 国产精品大全| 亚洲色在线视频| 91久久久久久国产精品| 欧美不卡视频| 欲香欲色天天天综合和网| 久久大香伊蕉在人线观看热2| 欧美激情一区在线| 免费在线观看精品| 亚洲国产成人不卡| 欧美韩日亚洲| 欧美国产日韩精品| 亚洲一二三级电影| 亚洲毛片网站| 国产欧美日韩综合一区在线观看| 亚洲视频二区| 香蕉久久久久久久av网站| 国产欧美日韩视频| 美女视频黄a大片欧美| 久久天天躁狠狠躁夜夜av| 亚洲国产精品国自产拍av秋霞| 久久久久青草大香线综合精品| 久久国产免费| 999亚洲国产精| 午夜精品一区二区三区在线| 国产色视频一区| 欧美大片一区二区| 欧美日韩综合在线免费观看| 久久成人精品视频| 久久久精品视频成人| 国产视频综合在线| 午夜精品久久久久久久蜜桃app| 麻豆freexxxx性91精品| 欧美护士18xxxxhd| 欧美影院午夜播放| 欧美大成色www永久网站婷| 亚洲欧美综合精品久久成人| 久久久国产精品亚洲一区| 亚洲午夜精品在线| 免费在线亚洲| 日韩一区二区精品葵司在线| 亚洲一区二区三区激情| 欧美视频在线观看 亚洲欧| 久久人人看视频| 欧美三级乱码| 久久爱www.| 久久久久久9999| 性做久久久久久免费观看欧美| 国产亚洲成精品久久| 亚洲欧美一区二区原创| 国产一区白浆| 亚洲国产精品一区制服丝袜| 欧美日韩亚洲天堂| 亚洲午夜小视频| 亚洲专区一区二区三区| 亚洲日本在线观看| 在线亚洲欧美| 一区二区三区成人| 久久精品理论片| 久久久久久精| 亚洲国产成人av| 欧美国产日韩一二三区| 亚洲人成毛片在线播放| 亚洲精品国产品国语在线app| 免费91麻豆精品国产自产在线观看| 久久理论片午夜琪琪电影网| 亚洲第一二三四五区| 欧美日本国产| 欧美亚洲综合在线| 亚洲国产成人精品久久| 99视频精品全部免费在线| 国产精品久久久久三级| 香蕉久久精品日日躁夜夜躁| 欧美大片专区| 亚洲夜间福利| 亚洲国产精品精华液网站| 欧美日韩国产免费| 另类人畜视频在线| 亚洲免费在线| 亚洲精品看片| 亚洲高清自拍| 美女国内精品自产拍在线播放| 亚洲精品视频一区| 国产欧美日韩亚洲一区二区三区| 欧美sm重口味系列视频在线观看| 亚洲自拍都市欧美小说| 亚洲国产日韩美| 久久在线免费观看| 亚洲欧美在线免费| 亚洲欧洲一区二区三区在线观看| 亚洲图中文字幕| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 一本在线高清不卡dvd| 欧美激情视频一区二区三区免费 | 国产精品一区二区三区乱码 | 亚洲免费视频一区二区| 亚洲第一精品夜夜躁人人爽| 国产精品一二三四区| 欧美系列一区| 国产免费成人| 在线观看福利一区| 激情婷婷久久| 亚洲精品视频免费观看| 中文日韩在线视频| 亚洲欧美日韩中文播放| 久久精品国产亚洲高清剧情介绍| 欧美一区二视频| 欧美不卡福利| 一区二区欧美在线| 午夜亚洲性色福利视频| 久久综合久久久| 欧美日韩在线视频观看| 国产日韩欧美麻豆| 亚洲日本中文字幕区| 亚洲欧美激情视频| 欧美成人激情视频| 亚洲视频视频在线| 久久婷婷av| 国产日韩在线视频| 日韩视频不卡中文| 久久久99国产精品免费| 日韩一级二级三级| 久久中文精品| 国内精品国语自产拍在线观看| 亚洲人线精品午夜| 免费成人av在线| 亚洲在线观看免费| 欧美韩日精品| 亚洲国产一二三| 欧美成人免费观看| 欧美在线免费| 国产欧美日韩在线| 亚洲欧美大片| 中文在线不卡视频| 欧美视频不卡中文| 亚洲午夜国产一区99re久久| 亚洲精品乱码久久久久久久久| 久久综合电影|