获取Civil 3D 三角网曲面TinSurface中每个小三角形的法向量
2013-01-24 18:53
423 查看
Civil3D2012以后版本提供的曲面的.netAPI,通过.netAPI可以获得TinSurface的所有三角形(TinSurfaceTriangle)信息,包含顶点(Vertex)和边(Edge)。但TinSurfaceTriangle对象没有提供表示该三角形法向量(normal)的函数方法,下面自己来实现一个。思路的利用小三角形的顶点信息构建一个AutoCAD的plane实体,进而获取法向量:
Vector3dGetNormal(TinSurfaceTriangletriangle) { Point3dpoint1=triangle.Vertex1.Location; Point3dpoint2=triangle.Vertex2.Location; Point3dpoint3=triangle.Vertex3.Location; Vector3dnormal; using(Planeplan=newPlane( point1, point1.GetVectorTo(point2), point1.GetVectorTo(point3))) { normal=plan.Normal.GetNormal(); }; returnnormal; } 另一种方法:
Vector3dGetNormal2(TinSurfaceTriangletriangle) { Point3dpoint1=triangle.Vertex1.Location; Point3dpoint2=triangle.Vertex2.Location; Point3dpoint3=triangle.Vertex3.Location; Vector3dv1=point1.GetVectorTo(point2).GetNormal(); Vector3dv2=point1.GetVectorTo(point3).GetNormal(); Vector3dnormal=v2.CrossProduct(v1).GetNormal(); returnnormal; }
下面是对曲面操作的一个测试函数:
[CommandMethod("PrintSurfaceInfo")]
publicvoidPrintSurfaceInfo()
{
ObjectIdsurfaceId=ObjectId.Null;
do
{
surfaceId=this.PromptForTinSurface();
}
while(surfaceId==ObjectId.Null);
Databasedb=CurrentEditor.Document.Database;
using(Transactiontrans=db.TransactionManager.StartTransaction())
{
TinSurfacesurface=trans.GetObject(surfaceId,OpenMode.ForRead)asTinSurface;
inttriCount=surface.Triangles.Count;
StringBuildermsg=newStringBuilder();
msg.Append("\nSurfacetrianglecount:"+triCount.ToString());
foreach(TinSurfaceTriangletriinsurface.Triangles)
{
msg.Append(GetTriangleInfo(tri));
}
CurrentEditor.WriteMessage(msg.ToString());
}
}
stringGetTriangleInfo(TinSurfaceTriangletriangle)
{
StringBuildersb=newStringBuilder();
sb.Append("\n");
sb.Append("\nPoint1:"+triangle.Vertex1.Location.ToString());
sb.Append("\nPoint2:"+triangle.Vertex2.Location.ToString());
sb.Append("\nPoint3:"+triangle.Vertex3.Location.ToString());
sb.Append("\nNormal:"+GetNormal2(triangle).ToString());
returnsb.ToString();
}
Vector3dGetNormal(TinSurfaceTriangletriangle)
{
Point3dpoint1=triangle.Vertex1.Location;
Point3dpoint2=triangle.Vertex2.Location;
Point3dpoint3=triangle.Vertex3.Location;
Vector3dnormal;
using(Planeplan=newPlane(
point1,
point2.GetVectorTo(point1),
point3.GetVectorTo(point1)))
{
normal=plan.Normal;
};
returnnormal;
}
ObjectIdPromptForTinSurface()
{
stringpromptMsg="\nSelectaTinSurface";
stringrejectMsg="\nThesurfaceyouselectedisnotTinSurface";
PromptEntityOptionsopts=newPromptEntityOptions(promptMsg);
opts.SetRejectMessage(rejectMsg);
opts.AddAllowedClass(typeof(TinSurface),false);
PromptEntityResultentRes=CurrentEditor.GetEntity(opts);
if(entRes.Status==PromptStatus.OK)
{
returnentRes.ObjectId;
}
returnObjectId.Null;
}
CivilDocumentCivilDoc{
get{
returnCivilApplication.ActiveDocument;
}
}
EditorCurrentEditor{
get{
returnApplication.DocumentManager.MdiActiveDocument.Editor;
}
}
相关文章推荐
- Civil 3D 2013利用API把三角网曲面提取为栅格网
- 【python系列】python画3d曲面图(surface3d_demo)
- Q98:三角形网格细分Bezier曲面时,注意三角形顶点的顺序(确保其对应的法向量向外)
- Civil 3D 中使用COM API导入DEM数据创建曲面
- 利用Civil 3D API更改曲面的样式
- Civil 3D 2012基于.net 的曲面API Webcast 7月8号下午进行
- AutoCAD Civil 3D 2014的开发文档在哪里?
- ex2_2 different presentation of a surface in 3D
- OpenGL编程(六)通过三角形绘画出3D模型
- 聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标
- jquery循环获取每个表格的ID
- [在线技术活动]Civil 3D 部件编辑器详解
- dedecms 获取图集里每个图片的地址,用正则实现
- matplotlib绘图系列----3D曲面图与散点图
- 获取每个分类下的N条记录
- vc.net 游戏开发 第四章 创建Direct3D渲染和显示3D三角形
- 浅谈CIVIL 3D
- echart3 多图联动获取点击的数据,并把每个图上的数据取出后放入各自的div中
- /LGC图形渲染/3D 图形编程的数学基础(1) 向量及其运算
- 【Unity 3D学习】获取鼠标滑动方向(上下左右)-控制摄像机围绕物体旋转