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

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>
            欧美在线啊v| 亚洲高清视频中文字幕| aa国产精品| 欧美日韩一区二区三区在线看| 日韩视频永久免费| 99成人精品| 国产日韩欧美亚洲一区| 久久亚洲私人国产精品va| 久久中文字幕导航| 99re66热这里只有精品3直播| 99re热精品| 国产日韩一区| 久久综合给合久久狠狠狠97色69| 欧美mv日韩mv国产网站| 亚洲精品视频一区| 午夜精品久久一牛影视| 在线精品国产成人综合| 亚洲精品在线二区| 国产亚洲综合性久久久影院| 亚洲第一在线综合在线| 欧美性色aⅴ视频一区日韩精品| 久久福利影视| 欧美激情一区二区三区在线视频| 亚洲欧美日韩在线播放| 久久综合给合久久狠狠狠97色69| 亚洲一区自拍| 蜜桃av久久久亚洲精品| 性色一区二区| 性久久久久久久| 亚洲经典在线看| 亚洲国产天堂久久国产91| 国产精品99久久99久久久二8 | 亚洲日本欧美日韩高观看| 欧美在线免费观看视频| 在线视频精品一| 国产精品区一区二区三区| av成人激情| 亚洲欧美日本国产有色| 亚洲国产视频一区二区| 亚洲三级免费观看| 久久在线观看视频| 亚洲国产天堂久久综合| 午夜在线视频观看日韩17c| 一区二区三区国产精品| 久久久久久久久久久一区 | 亚洲九九九在线观看| 午夜国产精品视频免费体验区| av成人免费在线| 欧美激情欧美激情在线五月| 欧美成人精品一区二区| 国产主播一区二区| 午夜精品一区二区三区电影天堂 | 亚洲国产一区在线| 欧美一区二视频在线免费观看| 亚洲综合第一| 欧美日韩理论| 亚洲精品国产精品国自产在线| 亚洲国产网站| 久久大逼视频| 久久国产精品一区二区三区四区| 久久精品欧美日韩| 一区二区日韩免费看| 欧美日韩一区二区在线播放| 久久国产精品色婷婷| 久久久久久噜噜噜久久久精品 | 欧美日韩国产综合视频在线| 国产精品亚洲美女av网站| 久久久福利视频| 久久精品国产成人| 久久久亚洲高清| 欧美日韩精选| 狠狠操狠狠色综合网| 国产视频精品网| 欧美日韩国产在线| 亚洲一区三区在线观看| 欧美激情区在线播放| 亚洲综合日韩在线| 亚洲国产精品久久久久秋霞影院| 亚洲国产另类精品专区| 在线观看欧美视频| 国产精品一二三| 欧美激情在线狂野欧美精品| 欧美日韩高清在线一区| 亚洲精品偷拍| 亚洲国产精品999| 噜噜噜91成人网| 久久一区亚洲| 亚洲欧美日韩国产中文在线| 狠狠色丁香婷综合久久| 久热精品视频在线| 99成人在线| 久久影视精品| 夜夜精品视频| 国产亚洲制服色| 欧美久久久久免费| 亚洲图片欧洲图片av| 亚洲精品在线观看视频| 欧美激情1区2区| 在线一区二区日韩| 欧美成人精品1314www| 一区二区三区 在线观看视| 国产女主播一区| 欧美极品影院| 久久国产精品久久国产精品| 亚洲免费黄色| 蜜臀av一级做a爰片久久| 亚洲欧美第一页| 亚洲欧洲日本mm| 国产欧美日韩中文字幕在线| 蘑菇福利视频一区播放| 性做久久久久久免费观看欧美| 亚洲精品国产品国语在线app| 欧美亚洲日本国产| 亚洲精品偷拍| 亚洲第一在线视频| 国产女人18毛片水18精品| 欧美黄免费看| 久久嫩草精品久久久精品| 亚洲综合999| 一区二区精品| 亚洲精品一区二区三区福利| 欧美成人久久| 麻豆精品一区二区av白丝在线| 午夜久久久久久久久久一区二区| 亚洲日韩欧美视频一区| 亚洲二区在线视频| 狠狠色伊人亚洲综合网站色| 免费视频一区二区三区在线观看| 午夜精品久久久久久久白皮肤| 亚洲精品美女久久7777777| 经典三级久久| 激情综合色丁香一区二区| 国产偷国产偷精品高清尤物| 国产精品免费久久久久久| 欧美日韩国产综合在线| 欧美精品在线一区| 欧美激情第10页| 欧美精选在线| 欧美日韩成人一区二区| 欧美精品18| 欧美日韩精选| 欧美午夜激情视频| 国产精品久久久久一区二区| 欧美日韩一区二区三区在线观看免| 欧美理论在线| 欧美视频在线免费| 国产精品成人一区二区三区吃奶| 欧美日韩精品免费观看视一区二区| 欧美精品午夜| 国产精品盗摄久久久| 国产精品嫩草影院一区二区| 国产美女高潮久久白浆| 国产一区二区三区四区五区美女 | 欧美精品一区二区精品网| 欧美片在线观看| 国产精品国产三级国产普通话99| 国产精品久久久久久久久婷婷| 国产精品老牛| 影视先锋久久| 99热这里只有成人精品国产| 亚洲一区免费视频| 久久精品国产77777蜜臀| 久久久91精品国产一区二区三区| 另类天堂视频在线观看| 亚洲二区在线| 亚洲曰本av电影| 久久久蜜桃一区二区人| 欧美精品v日韩精品v韩国精品v| 欧美日韩国产天堂| 国产日韩欧美视频在线| 亚洲经典一区| 亚洲一区中文| 你懂的亚洲视频| 亚洲精品永久免费| 欧美一区二区三区在线观看| 欧美 日韩 国产 一区| 国产精品久久综合| 亚洲承认在线| 性xx色xx综合久久久xx| 亚洲福利视频专区| 亚洲欧美一区二区三区在线| 欧美sm极限捆绑bd| 国产欧美日韩91| 99视频精品| 久久视频精品在线| 一区二区三区福利| 午夜精彩视频在线观看不卡| 模特精品在线| 亚洲欧美视频在线观看| 欧美精品日韩一本| 精品成人乱色一区二区| 亚洲欧美春色| 亚洲三级视频| 免费成人在线视频网站| 国产一区二区电影在线观看| 亚洲在线国产日韩欧美| 91久久精品国产91性色tv| 久久久福利视频| 国产三级欧美三级日产三级99| 一区二区三区视频免费在线观看|