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

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE General Transformation

Posted on 2015-01-22 20:30 eryar 閱讀(5955) 評(píng)論(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)是指線性變換后接著平移。因此,仿射變換的集合是線性變換的超集,任何線性變換都是仿射變換,但不是所有的仿射變換都是線性變換。

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

wps_clip_image-2056

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

wps_clip_image-15105

空間仿射變換是把平面變換到平面,直線變換到直線。兩個(gè)平行平面的像也是平行的。共線三點(diǎn)的的簡(jiǎn)單比是不變量。平行六面體的體積是權(quán)為1的相對(duì)不變量。

OpenCASCADE的TKMath庫中提供了這上仿射變換類gp_GTrsf,它能執(zhí)行比gp_Trsf更通用的變換。對(duì)于TopoDS_Shape,OpenCASCADE分別提供了如下兩個(gè)類進(jìn)行變換:

v BRepBuilderAPI_GTransform

v BRepBuilderAPI_Transform

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

2.BRepBuilderAPI_Transform

OpenCASCADE中使用算法BRepBuilderAPI_Transform來實(shí)現(xiàn):平移、旋轉(zhuǎn)、縮放及鏡像變換。在Draw Test Harness中實(shí)現(xiàn)的函數(shù)代碼如下所示:

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;
}

下面給出應(yīng)用Tcl腳本來實(shí)現(xiàn)這些變換的例子:

# 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

腳本運(yùn)行效果如下圖所示:

wps_clip_image-18963

Figure 2.1 Transform Tcl demo

從Draw中實(shí)現(xiàn)的函數(shù)來看,移動(dòng)、旋轉(zhuǎn)及縮放變換都是使用類

BRepBuilderAPI_Transformation來實(shí)現(xiàn)。Tcl腳本中先創(chuàng)建出一個(gè)球體,再平移后,復(fù)制13份,最后又創(chuàng)建出兩個(gè)圓柱體。如果要對(duì)TopoDS_Shape進(jìn)行變換且不改變其中的幾何性質(zhì),建議都使用這個(gè)類來完成。

3.BRepBuilderAPI_GTransform

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

///=======================================================================
// 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;
}

根據(jù)仿射變換的定義,給定一個(gè)球面的數(shù)學(xué)表達(dá)式:

wps_clip_image-14741

應(yīng)用如下的仿射變換,將會(huì)得到一個(gè)橢球面:

wps_clip_image-5848

由變換公式解得:

wps_clip_image-13797

將它代入球面方程得到:

wps_clip_image-17839

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

wps_clip_image-23346

Figure 3.1 Shape Deformation

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

4.Conclusion

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

5. References

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

2. 蘇步表, 華宣積. 應(yīng)用幾何教程. 復(fù)旦大學(xué)出版社. 2012

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

 

Feedback

# re: OpenCASCADE General Transformation  回復(fù)  更多評(píng)論   

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>
            国产精品99久久久久久宅男| 亚洲成在线观看| 亚洲黄色尤物视频| 国产精品v亚洲精品v日韩精品 | 亚洲一区二区3| 在线观看一区视频| 国产美女高潮久久白浆| 欧美激情区在线播放| 久久久久久电影| 亚洲欧美日韩在线综合| 日韩视频一区二区在线观看 | 久久精品噜噜噜成人av农村| 一区二区三区高清不卡| 91久久精品美女高潮| 蜜桃av一区二区三区| 欧美一区二区三区免费观看 | 欧美日韩福利在线观看| 老司机午夜精品视频| 欧美专区在线观看| 欧美亚洲一区二区在线观看| 国产精品99久久久久久久久久久久| 亚洲国产欧美一区二区三区同亚洲| 久久久免费观看视频| 欧美在线观看网址综合| 亚洲影视中文字幕| 亚洲香蕉伊综合在人在线视看| 亚洲美女av黄| 亚洲美女在线观看| 亚洲精品乱码久久久久久蜜桃91| 在线观看亚洲精品视频| 激情亚洲网站| 黄色av日韩| 精品成人在线观看| 亚洲第一区中文99精品| 在线日韩中文字幕| 在线日韩欧美视频| 亚洲国产精品久久久久秋霞蜜臀| 亚洲大片精品永久免费| 亚洲国产精品一区二区www在线| 亚洲成人资源网| 亚洲欧洲精品一区二区三区不卡| 亚洲国产天堂久久国产91| 亚洲黄色在线看| 亚洲精品一区二区三区婷婷月| 亚洲激情视频网| av成人免费在线| 亚洲线精品一区二区三区八戒| 亚洲一区高清| 欧美一区二区三区另类| 久久久91精品| 你懂的视频欧美| 亚洲国产高潮在线观看| 亚洲精品综合在线| 亚洲视频成人| 欧美自拍偷拍| 欧美福利小视频| 欧美日韩在线免费视频| 国产精品一区三区| 一区二区三区在线不卡| 亚洲久久一区二区| 亚洲影院污污.| 久久精品亚洲热| 欧美国产精品久久| 99re6这里只有精品| 亚洲欧美在线网| 久久伊人一区二区| 欧美日韩免费一区二区三区视频| 国产乱码精品一区二区三区不卡| 一区免费在线| 一本一道久久综合狠狠老精东影业| 性欧美xxxx视频在线观看| 裸体女人亚洲精品一区| 亚洲欧洲一区二区天堂久久| 亚洲性感激情| 久久米奇亚洲| 欧美午夜一区二区| 在线成人中文字幕| 亚洲欧美国产一区二区三区| 久久婷婷丁香| 日韩视频在线一区二区三区| 欧美一乱一性一交一视频| 欧美电影打屁股sp| 国产精品入口夜色视频大尺度| 在线视频成人| 午夜精品福利在线观看| 欧美激情亚洲另类| 午夜精品福利一区二区蜜股av| 免费成人网www| 国产九区一区在线| 日韩视频在线永久播放| 久久午夜激情| 一区二区三区视频免费在线观看| 久久久噜噜噜久久| 国产精品xxxxx| 亚洲国产一成人久久精品| 羞羞色国产精品| 亚洲精品影院在线观看| 久久久久久久网站| 国产精品影音先锋| 一本色道久久综合亚洲精品小说| 免费日韩av电影| 亚洲欧美日韩国产中文| 欧美日韩喷水| 91久久国产自产拍夜夜嗨| 久久九九有精品国产23| 亚洲无线一线二线三线区别av| 免费在线观看精品| 一色屋精品视频免费看| 欧美在现视频| 亚洲一区二区三区在线播放| 欧美激情影音先锋| 在线观看亚洲| 老色鬼久久亚洲一区二区| 午夜精品久久久久久久久久久久久| 欧美日韩一区二区在线| 日韩视频在线永久播放| 欧美va日韩va| 久久久久成人精品免费播放动漫| 国产精品欧美在线| 亚洲综合国产| 99视频在线观看一区三区| 欧美日韩国产成人在线免费| 亚洲精品一二三| 亚洲国产精品一区二区www在线| 久久艳片www.17c.com| 红桃视频亚洲| 美女网站久久| 久久永久免费| 亚洲丰满少妇videoshd| 麻豆久久婷婷| 久久亚洲不卡| 亚洲欧洲日本一区二区三区| 你懂的成人av| 欧美xx69| 99精品视频免费全部在线| 亚洲人成网站777色婷婷| 欧美精品videossex性护士| 99天天综合性| 一区二区国产精品| 国产精品区一区二区三区| 午夜国产精品影院在线观看 | 欧美成ee人免费视频| 亚洲欧洲在线视频| 亚洲精品免费网站| 欧美色综合网| 亚洲欧美日韩综合一区| 午夜精品理论片| 激情文学一区| 亚洲承认在线| 欧美日韩免费看| 欧美一级大片在线观看| 久久精品国产一区二区三| 在线视频国产日韩| 亚洲欧洲综合| 国产精品高潮在线| 久久久91精品国产| 麻豆精品91| 亚洲香蕉成视频在线观看| 亚洲欧美伊人| 亚洲电影一级黄| 日韩视频在线观看| 国产麻豆精品久久一二三| 嫩草影视亚洲| 欧美视频精品一区| 久久久综合网站| 欧美国产在线视频| 欧美一区二区大片| 蜜臀av国产精品久久久久| 亚洲一区二区精品在线| 久久精品99无色码中文字幕 | 一二三区精品福利视频| 国产嫩草影院久久久久| 欧美h视频在线| 欧美午夜激情在线| 久久香蕉精品| 欧美三级不卡| 牛牛国产精品| 国产精品社区| 欧美国产在线电影| 国产精品社区| 亚洲高清免费| 国产三级欧美三级| 亚洲国产天堂久久国产91| 国产欧美日韩免费看aⅴ视频| 欧美国产综合一区二区| 国产日本欧美视频| 亚洲欧洲一区二区三区| 激情久久综合| 亚洲天堂成人| 亚洲精品在线观看视频| 亚洲欧美综合精品久久成人| 亚洲免费电影在线观看| 久久精品亚洲精品| 午夜精品久久久久| 欧美精品三级日韩久久| 免费观看不卡av| 国产一区二区电影在线观看 | 国产日韩欧美不卡在线| 最新亚洲电影| 1000部精品久久久久久久久|