ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

volume_object_model_3d_relative_to_plane 体积计算

2022-07-01 00:36:16  阅读:219  来源: 互联网

标签:volume object relative plane 体积 平面 model 3d


*****************************************************
* volume_object_model_3d_relative_to_plane( : : ObjectModel3D, Plane, Mode, UseFaceOrientation : Volume)
*****************************************************
* 描述
* 该算子计算一个3D对象模型的面相对于一个平面的体积。该平面是一个x-y平面。
* 输入对象模型必须是三角化的或包含多边形集合。对于默认设置,如果网格划分是封闭的且有序的,该算子计算真实的体积。
* 对于网格划分不是封闭的或面不是连续的,计算的体积受到参数Mode和UseFaceOrientation的影响。
**************************
* 体积计算步骤
**************************
* 对模型进行三角化
* 投影三角面元的角点到指定平面
* 根据指定的UseFaceOrientation参数计算每个三棱柱的体积
* 分别计算平面之上和平面之下的体积和(计算时,使用体积的正负属性)
* 根据指定的Mode参数,对平面之上和平面之下进行操作
* 仅输出值,而不输出正负属性

* 参数解释
**************************
* Mode:
**************************
* 'signed'     >> 平面以上和平面以下的体积和
* 'unsigned' >> 平面之上的体积和减去平面之下的体积和
* 'positive'   >> 仅获取平面之上的体积和
* 'negative'  >> 仅获取平面之下的体积和
**************************
* UseFaceOrientation:
**************************
* 'true' >> 使用三角面元相对于指定平面的方向。如果从平面看向三角面元,三角面元的角点索引是按照顺时针方向排列,该点面是远离指定平面的。如果三角面元是远离平面的,则体积具有正属性,否则体积具有负属性。
* 'false' >> 仅考虑三角面元是在指定平面之上还是之下。在平面上为正,在平面下为负。
*****************************************************

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 698, 531, 'black', WindowHandle)
dev_open_window (0, 710, 698, 531, 'black', WindowHandleData)
set_font (WindowHandle, 'Courier New-Bold-14')
set_display_font(WindowHandleData, 16, 'mono', 'true', 'false')

*生成立方体
gen_box_object_model_3d ([0, 0, 0.08, 0, 0, 0, 0], 0.1, 0.2, 0.1, ObjectModel3DBox)

* 基元类型生成三角面
convex_hull_object_model_3d (ObjectModel3DBox, ObjectModel3DConvexHullBox)

***************************************************************************
* 获取模型的XYZ坐标
***************************************************************************
get_object_model_3d_params (ObjectModel3DConvexHullBox, 'point_coord_x', point_coord_x)
get_object_model_3d_params (ObjectModel3DConvexHullBox, 'point_coord_y', point_coord_y)
get_object_model_3d_params (ObjectModel3DConvexHullBox, 'point_coord_z', point_coord_z)

***************************************************************************
* 获取模型中各个三角面元的角点坐标在点坐标序列中的索引
***************************************************************************
get_object_model_3d_params (ObjectModel3DConvexHullBox, 'triangles', triangles)
Message:=[]
Message[0]:='三角面的顶点坐标序列索引'
for Index := 0 to |triangles|/3-1 by 1
Message[Index]:='三角面元'+(Index+1)$'3.0f'+' -> '+triangles[Index*3]$'2.0f'+','+triangles[Index*3+1]$'2.0f'+','+triangles[Index*3+2]$'2.0f'
endfor
dev_set_window(WindowHandleData)
dev_disp_text(Message, 'window', 'top', 'left', 'black', [], [])

***************************************************************************
* 生成平面
***************************************************************************
dev_set_window(WindowHandle)
gen_rectangle2_contour_xld (Rectangle, 0, 0, 0, 0.15, 0.15)
get_contour_xld (Rectangle, Row, Col)
* 世界坐标系为参考
pose_plane := [0, 0, 0, 0, 0, 0, 0]
gen_plane_object_model_3d (pose_plane, Col, Row, ObjectModel3DPlane)
convex_hull_object_model_3d (ObjectModel3DPlane, ObjectModel3DNormals)

***************************************************************************
* 根据指定的参数计算模型相对于平面的体积
***************************************************************************
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'signed', 'true', Volume0)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'unsigned', 'true', Volume1)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'positive', 'true', Volume2)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'negative', 'true', Volume3)

volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'signed', 'false', Volume4)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'unsigned', 'false', Volume5)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'positive', 'false', Volume6)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHullBox, pose_plane,'negative', 'false', Volume7)

******************************************************
* 1.应用参数 UseFaceOrientation 判断体积具有的正负属性
******************************************************
*由于投影之后只有索引为01,02,11,12的面元在指定平面上不共线,能够计算体积信息,
*其它三角面元的角点在平面的投影是共线的,不需要计算体积。

* UseFaceOrientation = 'true' 沿着指定平面的法线方向看向组成三角面元的角点的索引顺序。
* 01 >> 0, 1, 2 :平面之上, 逆时针,体积具有负属性,0.1 * 0.2 * 0.13 * 0.5 = 0.0013(-)
* 02 >> 0, 3, 2 :平面之上, 逆时针,体积具有负属性,0.1 * 0.2 * 0.13 * 0.5 = 0.0013(-)
* 11 >> 7, 5, 4 : 平面之上,顺时针,体积具有正属性,0.1 * 0.2 * 0.03 * 0.5 = 0.0003(+)
* 12 >> 7, 4, 6 : 平面之上,顺时针,体积具有正属性,0.1 * 0.2 * 0.03 * 0.5 = 0.0003(+)

* UseFaceOrientation = 'false'
* 01 >> 0, 1, 2 : 平面之上,体积具有正属性,0.1 * 0.2 * 0.13 * 0.5 = 0.0013(+)
* 02 >> 0, 3, 2 : 平面之上,体积具有正属性,0.1 * 0.2 * 0.13 * 0.5 = 0.0013(+)
* 11 >> 7, 5, 4 : 平面之上,体积具有正属性,0.1 * 0.2 * 0.03 * 0.5 = 0.0003(+)
* 12 >> 7, 4, 6 : 平面之上,体积具有正属性,0.1 * 0.2 * 0.03 * 0.5 = 0.0003(+)

******************************************************
* 2.分别计算平面之上和平面之下的体积
******************************************************
* 平面之上(UseFaceOrientation = 'true'): (-0.0013) + (-0.0013) + (0.0003) + (0.003) = 0.002
* 平面之下(UseFaceOrientation = 'true'): ( 0) + ( 0) + ( 0) + ( 0) = 0
* 平面之上(UseFaceOrientation = 'false'):( 0.0013) + ( 0.0013) + (0.0003) + (0.003) = 0.0032
* 平面之下(UseFaceOrientation = 'false'):( 0) + ( 0) + ( 0) + ( 0) = 0

******************************************************
* 3.应用参数Mode对指定平面之上和之下的体积进行运算
*****************************************************
* UseFaceOrientation = 'true'
* Mode = 'signed': 0.002 + 0 = 0.002
* Mode = 'unsigned': 0.002 - 0 = 0.002
* Mode = 'positive': 0.002
* Mode = 'negative': 0
* UseFaceOrientation = 'false'
* Mode = 'signed': 0.0032 + 0 = 0.0032
* Mode = 'unsigned': 0.0032 - 0 = 0.0032
* Mode = 'positive': 0.0032
* Mode = 'negative': 0


***************************************************************************
* 显示模型
***************************************************************************
CamParam := ['area_scan_division', 0.06, 0, 8.5e-006, 8.5e-006, 349, 265, 698, 531]
Pose := [0.0144074,-0.00394058,5.89431,107.148,357.864,262.975,0]
GenParamName1 := ['colored','disp_pose','alpha','disp_lines','color_0','color_1']
GenParamValue1 := [12,'true',0.6,'true','cyan','magenta']
disp_object_model_3d (WindowHandle, [ObjectModel3DPlane, ObjectModel3DConvexHullBox], CamParam, Pose, GenParamName1, GenParamValue1)

***************************************************************************
* 显示坐标点的索引
***************************************************************************
* 设置窗口显示区域
dev_set_part (0,0,CamParam[8],CamParam[7])
* 将位姿转换为变换矩阵,获取世界坐标系到相机坐标系的变换矩阵
pose_to_hom_mat3d (Pose, HomMat3D)
* 根据变换矩阵,获取世界坐标系下的点在相机坐标系中的坐标
affine_trans_point_3d (HomMat3D, point_coord_x, point_coord_y, point_coord_z, Qx, Qy, Qz)
* 将相机坐标系中的点转换到图像坐标系
project_3d_point( Qx, Qy, Qz, CamParam , Row, Column)
* 在图像窗口显示点的坐标索引
for Index := 0 to |Row| - 1 by 1
dev_disp_text (Index + '(' + point_coord_x[Index] + ','+ point_coord_y[Index] + ','+ point_coord_z[Index] + ')', \
'image', \
Row[Index], Column[Index], \
'green', 'box', 'false')
endfor

***************************************************************************
* 释放模型
***************************************************************************
clear_object_model_3d (ObjectModel3DNormals)
clear_object_model_3d (ObjectModel3DConvexHullBox)
clear_object_model_3d (ObjectModel3DPlane)
clear_object_model_3d (ObjectModel3DBox)

标签:volume,object,relative,plane,体积,平面,model,3d
来源: https://www.cnblogs.com/touch-skyer/p/16430076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有