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

eryar

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

OpenCASCADE Shape Location

Posted on 2016-09-07 00:06 eryar 閱讀(2774) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Shape Location

eryar@163.com

Abstract. The TopLoc package of OpenCASCADE gives resources to handle 3D local coordinate systems called Locations. A Location is a composition of elementary coordinate systems, each one is called a Datum. The Location keeps track of this composition. The paper will use the Draw Test Harness to illustrate the Location concept.

Key Words. Transformation, Location, Local Coordinate Systems

1.Introduction

對于三維空間中的各種模型,總是想要擺放到合適的位置,最終形成一個工廠的模型,一艘船的模型,一個建筑物的模型,等等。目前來看,所有的幾何相關的庫對模型變換的實現一般都是使用了矩陣變換。有的可能只保留了最終變換的結果矩陣數據,而OpenCASCADE的TopoDS_Shape中保留了Location信息。從其文檔可以看出,Location中保留了模型變換一系列的變換組合,并可以對這個變換進行Track追蹤。如何來正確理解這個Location的意義呢?下面結合Draw Test Harness來進行說明。

2.Draw Test

在Draw Test Harness中對模型進行變換的命令有:ttranslate, trotate, tmove, reset, tmirror, tscale.其中ttranslate, trotate, tmove, reset命令只會對模型位置進行調整,并不能讓模型發生變形,即是剛性變換。下面就通過對一個Box進行移動和旋轉,來看看TopoDS_Shape中的Location是如何變化的。在Draw Test Harness中輸入以下命令:

pload ALL 
box b 10 20 30 
vdisplay b 
vtrihedron vt 
dump b 

可以看到此時box的Location是沒有的:

wps277.tmp

Figure 2.1 Box Location in Original

當將box沿X方向移動一段距離后:

# translate by x direction 
ttranslate b 10 0 0 
vdisplay b 
dump b

wps288.tmp

Figure 2.2 Location of the translation box

由上圖可知,當對模型進行變換后,TopoDS_Shape中即有了Location數據,變換矩陣的平移部分(第4列數據)發生了變化。下面繼續沿X軸方向移動10:

# translate by x direction 
ttranslate b 10 0 0 
vdisplay b 
dump b

wps298.tmp

Figure 2.3 Translate Box in X Direction

由圖2.3可知,模型現在的位置是通過兩個Elementary變換得來的。最后一個Complex變換是上述所有變換的復合。下面再對模型進行繞Y軸旋轉45度:

# rotate by y axis 
trotate b 0 0 0 0 1 0 45 
vdisplay b 
dump b 

wps299.tmp

Figure 2.4 Rotate the Box

由上圖可知,經過旋轉變換后的模型有了4個Location:三個基本變換和一個復合變換,復合變換是所有基本變換的組合。

通過上面的示例,已經可以清晰理解OpenCASCADE中的Location的概念,雖然處理得有點復雜,通過Location可以對模型的變換軌跡有個詳細的跟蹤。這樣處理的好處就是對模型的變換過程進行了記錄,可以方便地回到歷史上的任意一個時刻;不好的地方就是程序理解起來麻煩,而且還需要有額外的內存來保存這些數據。
以下為上述所有Tcl腳本:

#
# test TopoDS_Shape location.
# Shing Liu(eryar@163.com)
# 2016-09-06 22:50


pload ALL

# initialize 
box b 10 20 30
vdisplay b
vtrihedron vt
dump b

# translate by x direction
ttranslate b 10 0 0
vdisplay b
dump b

# translate by x direction
ttranslate b 10 0 0
vdisplay b
dump b

# rotate by y axis
trotate b 0 0 0 0 1 0 45
vdisplay b
dump b


3.Draw Code

每個Draw Test Harness命令都可以方便地找到其實現代碼,其中模型變換命令的實現代碼如下:

//=======================================================================
// transform
//=======================================================================

static Standard_Integer transform(Draw_Interpretor& ,Standard_Integer n,const char** a)
{
  if (n <= 1) return 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 < 3) return 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 < 5) return 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 < 9) return 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 < 8) return 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 < 6) return 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())
      {
        std::cerr << "Error: " << a[i] << " is not a valid shape\n";
        return 1;
      }
      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()) {
        std::cerr << "Error: " << a[i] << " is not a valid shape\n";
        return 1;
      }
      else {
        trf.Perform(S);
        if (!trf.IsDone())
          return 1;
        DBRep::Set(a[i],trf.Shape());
      }
    }
  }
  return 0;
}

對模型的變換主要使用類BRepBuilderAPI_Transform來完成。

4.Conclusion

通過上面的示例,已經可以清晰理解OpenCASCADE中的Location的概念,雖然處理得有點復雜,通過Location可以對模型的變換軌跡有個詳細的跟蹤。這樣處理的好處就是對模型的變換過程進行了記錄,可以方便地回到歷史上的任意一個時刻;不好的地方就是程序理解起來麻煩,而且還需要有額外的內存來保存這些數據。

理解了Location的概念,也就理解了OpenCASCADE的Brep文件中的一項基本內容,方便開發一些轉換接口。

關于矩陣變換在圖形學中的應用可以參考《3D數學基礎:圖形與游戲開發》。

5.References

1.Fletcher Dunn, Ian Parberry. 3D Math Primer for Graphics and Game Development. 清華大學出版社. 2005

2.OpenCASCADE Draw Test Harness User Guide.

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 欧美成人a视频| 午夜欧美精品久久久久久久| 国产精品夜夜嗨| 久久精品最新地址| 久久综合伊人| 日韩一级视频免费观看在线| 一区二区三区精品国产| 国产一区二区三区久久精品| 免费视频一区二区三区在线观看| 久久伊人免费视频| 一区二区三区四区五区在线 | 国产欧美日韩亚洲精品| 久久精品一本久久99精品| 久久精品国产欧美亚洲人人爽| 韩日午夜在线资源一区二区| 欧美激情第3页| 欧美喷潮久久久xxxxx| 欧美在线亚洲一区| 久久综合给合久久狠狠色| 日韩一级在线观看| 久久国产精品久久久久久电车| 亚洲国产片色| 亚洲一区视频| 91久久精品国产91久久| 亚洲午夜伦理| 在线免费观看视频一区| 一区二区三区视频观看| 国产性色一区二区| 亚洲人体1000| 极品尤物久久久av免费看| 亚洲精品一级| 一区二区亚洲精品| 在线一区二区三区四区五区| 亚洲片在线观看| 亚洲欧美日韩成人高清在线一区| 亚洲精品美女免费| 久久国产精品久久精品国产| 亚洲性线免费观看视频成熟| 久久亚洲不卡| 欧美制服丝袜| 欧美日韩在线播放三区四区| 久久婷婷蜜乳一本欲蜜臀| 欧美日韩一区二区三区| 亚洲电影免费观看高清| 黄色日韩网站| 亚洲欧美日韩在线综合| 免费观看成人| 老司机精品导航| 国产日本欧美在线观看| 在线视频日本亚洲性| 日韩一级黄色av| 美女精品国产| 欧美ab在线视频| 国产综合第一页| 亚洲欧美制服另类日韩| 亚洲欧美日韩精品一区二区| 欧美日韩国产综合视频在线| 亚洲精品国产视频| 亚洲另类在线一区| 欧美在线啊v| 欧美色另类天堂2015| 亚洲国产欧美另类丝袜| 日韩视频中午一区| 欧美激情综合网| 亚洲黄色一区| 亚洲最新视频在线| 欧美日韩在线播放一区| 亚洲人成在线播放网站岛国| 99国产精品99久久久久久| 欧美极品一区| 日韩亚洲欧美成人| 午夜精品久久久久影视| 国产精品视频久久久| 亚洲一二三区在线| 久久久久一本一区二区青青蜜月| 国产永久精品大片wwwapp| 久久精品视频在线看| 欧美大成色www永久网站婷| 亚洲日本无吗高清不卡| 欧美日韩国产专区| 亚洲欧美在线网| 免费在线日韩av| 日韩一级二级三级| 国产欧美日韩不卡| 久久精品2019中文字幕| 欧美电影免费观看网站| 一区二区三区四区五区视频 | 亚洲欧美日韩精品综合在线观看| 久久精品一本| 亚洲激情图片小说视频| 国产精品福利av| 久久嫩草精品久久久精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美性淫爽ww久久久久无| 亚洲影音一区| 欧美成人自拍视频| 亚洲在线一区二区三区| 精品91免费| 国产精品国产三级国产专播精品人 | 亚洲一区二区网站| 国产日韩亚洲欧美| 欧美成人资源| 亚洲欧美日韩视频二区| 亚洲国产精品久久久久| 欧美一区二区三区的| 亚洲欧洲在线视频| 国产日韩欧美一区二区三区四区| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲日韩欧美视频| 久久在线视频在线| 亚洲一区二区免费在线| 亚洲国产成人久久| 国产人久久人人人人爽| 欧美日韩国产综合新一区| 久久超碰97人人做人人爱| 夜夜嗨av色综合久久久综合网| 免费看的黄色欧美网站| 午夜欧美精品久久久久久久| 亚洲免费高清视频| 亚洲第一精品久久忘忧草社区| 国产精品亚洲综合| 欧美日韩一区三区四区| 午夜精品久久久久久久久| 亚洲国产高清高潮精品美女| 国产亚洲成年网址在线观看| 欧美午夜a级限制福利片| 麻豆精品网站| 久久久91精品国产| 羞羞色国产精品| 一本一本a久久| 亚洲区欧美区| 亚洲国产99精品国自产| 免费亚洲网站| 裸体女人亚洲精品一区| 久久久999国产| 香蕉乱码成人久久天堂爱免费| 在线亚洲高清视频| 中国成人在线视频| 夜夜嗨av色一区二区不卡| 亚洲美女电影在线| 亚洲精品视频免费在线观看| 亚洲二区在线视频| 亚洲国产精品欧美一二99| 亚洲经典自拍| 亚洲国产一区在线| 亚洲欧洲一区二区天堂久久| 亚洲精品免费一二三区| 亚洲国产成人av在线| 亚洲激情婷婷| 中文成人激情娱乐网| 亚洲欧美激情一区| 久久久久国产精品一区| 噜噜噜91成人网| 亚洲高清av| 一区二区三区欧美| 午夜免费日韩视频| 久久久久久久精| 欧美韩国在线| 欧美午夜大胆人体| 国产精品有限公司| 亚洲福利专区| 日韩一级精品视频在线观看| 亚洲一区在线免费观看| 欧美亚洲免费高清在线观看| 久久综合国产精品台湾中文娱乐网| 老司机久久99久久精品播放免费| 欧美国产日韩在线观看| 亚洲精品国产精品乱码不99| 亚洲色图自拍| 久久久久高清| 欧美午夜电影网| 国内久久精品| 亚洲午夜激情网页| 久久嫩草精品久久久精品一| 亚洲国产成人tv| 亚洲一区中文字幕在线观看| 乱中年女人伦av一区二区| 欧美日韩亚洲一区二区三区在线观看 | 中文精品视频| 久久九九精品99国产精品| 欧美高清视频在线播放| 国产精品99久久久久久www| 久久精品视频在线播放| 欧美三级在线| 亚洲麻豆一区| 久久久久久综合| 国产精品超碰97尤物18| 亚洲国产欧美精品| 午夜在线精品偷拍| 91久久久在线| 久久精品视频va| 国产精品日韩欧美一区二区三区 | 亚洲精品乱码久久久久久久久| 午夜在线不卡| 日韩午夜激情| 另类天堂视频在线观看| 国产日韩在线亚洲字幕中文|