对同一高度的体着色

Posted liuxiaoqing1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对同一高度的体着色相关的知识,希望对你有一定的参考价值。

 1 #include <uf.h>
 2 #include <uf_ui.h>
 3 #include <uf_obj.h>
 4 #include <uf_modl_primitives.h>
 5 #include <uf_csys.h>
 6 #include <uf_layer.h>
 7 #include <uf_object_types.h>
 8 #include <uf_modl_utilities.h>
 9 #include <uf_part.h>
10 #include <uf_modl.h>
11 #include <uf_group.h>
12 #include <uf_ui.h>
13 #include <uf_layer.h>
14 #include <uf_obj.h>
15 #include <uf_object_types.h>
16 #include <uf_defs.h>
17 #include <uf_evalsf.h>
18 #include <vector>
19 #include <algorithm>
20 #include <NXOpen/ugmath.hxx>
21 #include <NXOpen/Body.hxx>
22 #include <NXOpen/NXObjectManager.hxx>
23 #include <NXOpen/Face.hxx>
24 using namespace std;
25 using namespace NXOpen;
  1 vector<int> color_num;
  2     vector<double> heigth;
  3     vector<tag_t> face1;
  4     int sss[20] = { 11,18,32,69,71,78,87,90,93,103,108,136,141,145,160,163,176,190,191,205 };
  5     color_num.insert(color_num.begin(), sss, sss + 20);
  6     sort(color_num.begin(), color_num.end());//排序
  7     //color_num.erase(unique(color_num.begin(), color_num.end()), color_num.end());//去重
  8 
  9     UF_initialize();
 10 
 11     //方法1:UF_OBJ_cycle_objs_in_part
 12     std::vector<tag_t> SolidVector;
 13     tag_t ObjectTag = NULL_TAG;
 14     int Type, SubType, Body_Type;
 15     UF_OBJ_disp_props_t disp_props;
 16     UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_solid_type, &ObjectTag);
 17     while (ObjectTag != NULL_TAG)
 18     {
 19         UF_OBJ_ask_display_properties(ObjectTag, &disp_props);
 20         UF_OBJ_ask_type_and_subtype(ObjectTag, &Type, &SubType);
 21         if (SubType == UF_solid_body_subtype && disp_props.blank_status == UF_OBJ_NOT_BLANKED)
 22         {
 23             UF_MODL_ask_body_type(ObjectTag, &Body_Type);
 24             if (Body_Type == UF_MODL_SOLID_BODY)
 25             {
 26                 SolidVector.push_back(ObjectTag);
 27             }
 28         }
 29         UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_solid_type, &ObjectTag);
 30     }//获取体的数量
 31     for (int i = 0; i < SolidVector.size(); i++)
 32     {
 33 
 34         Body *body1(dynamic_cast<Body *>(NXObjectManager::Get(SolidVector[i])));
 35         std::vector<Face*> face = body1->GetFaces();//通过体获得所有面
 36         double z = -10000;
 37         double z1 = 10000;
 38         tag_t highest = NULL;//最高面TAG
 39         for (int i = 0; i < face.size(); i++)//循环找到所有的面
 40         {
 41             //UF_DISP_set_highlight(face[i]->Tag(), 0);
 42             UF_EVALSF_p_t evaluator = NULL;
 43             double uv_min_max[4] = { 0.0, 1.0, 0.0, 1.0 };
 44             UF_EVALSF_initialize_2(face[i]->Tag(), &evaluator);//初始化一个面评估器结构    
 45             UF_EVALSF_ask_face_uv_minmax(evaluator, uv_min_max);//计算u,v参数空间一个面的最小值、最大值
 46             double uv_pair[2] = { 0.5 * (uv_min_max[0] + uv_min_max[1]), 0.5 * (uv_min_max[2] + uv_min_max[3]) };
 47             UF_MODL_SRF_VALUE_t surf_eval;
 48             UF_EVALSF_evaluate(evaluator, UF_MODL_EVAL_ALL, uv_pair, &surf_eval);
 49             Point3d origin(surf_eval.srf_pos[0], surf_eval.srf_pos[1], surf_eval.srf_pos[2]);//得到UV0.5的XYZ点坐标
 50             Vector3d vector1(surf_eval.srf_unormal[0], surf_eval.srf_unormal[1], surf_eval.srf_unormal[2]);//得到UV面的向量
 51             UF_EVALSF_free(&evaluator);
 52             if (z > surf_eval.srf_pos[2])//判断当Z值大于UV点Z值的时候
 53             {
 54                 z = z;
 55             }
 56             else//当Z值小于UV点Z值的时候
 57             {
 58                 z = surf_eval.srf_pos[2];//Z就等于UV点Z最大值
 59                 highest = face[i]->Tag();//找到这个面                                
 60             }
 61         }
 62         //设置面高亮显示
 63         //UF_DISP_set_highlight(highest, 0);
 64         face1.push_back(highest);
 65     }
 66 
 67 
 68     //获取高度数据
 69     for (int i = 0; i < face1.size(); i++)
 70     {
 71         int Type;
 72         double Point[3];
 73         double Dir[3];
 74         double Box[6];
 75         double Radius[3];
 76         double RadData[3];
 77         int NormDir;
 78         int     aaa = UF_MODL_ask_face_data(face1[i], &Type, Point, Dir, Box, Radius, RadData, &NormDir);
 79         heigth.push_back(Box[5]);
 80     }
 81 
 82     sort(heigth.begin(), heigth.end());//排序
 83     heigth.erase(unique(heigth.begin(), heigth.end()), heigth.end());//去重
 84     if (heigth.size() < 21)
 85     {
 86         //获取面数据
 87         for (int j = 0; j < face1.size(); j++)
 88         {
 89             int Type;
 90             double Point[3];
 91             double Dir[3];
 92             double Box[6];
 93             double Radius[3];
 94             double RadData[3];
 95             int NormDir;
 96 
 97             UF_MODL_ask_face_data(face1[j], &Type, Point, Dir, Box, Radius, RadData, &NormDir);
 98 
 99             tag_t facess = NULL_TAG;
100             UF_MODL_ask_face_body(face1[j], &facess);
101             vector<double>::iterator it = find(heigth.begin(), heigth.end(), Box[5]);
102             int res = it - heigth.begin();
103 
104             UF_OBJ_set_color(facess, color_num[res]);
105         }
106     }
107     else
108     {
109         UF_UI_open_listing_window();
110         //char msg[256];
111         //sprintf_s(msg, "%d,", res);
112         UF_UI_write_listing_window("高度个数超过20个,请重新排版!");
113     }
114     UF_terminate();

参考文章https://www.cnblogs.com/nxopen2018/p/10957425.html

以上是关于对同一高度的体着色的主要内容,如果未能解决你的问题,请参考以下文章

GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

GLSL 问题:一个程序中有多个着色器

片段着色器究竟如何用于纹理?

如何为光线投射生成相机光线

GLSL:使用片段着色器进行对象翻译

损坏的顶点和片段着色器