zoukankan      html  css  js  c++  java
  • [10] 圆管(Pipe)图形的生成算法


    顶点数据的生成

     1 bool                        YfBuildPipeVertices
     2 (
     3     Yreal                   radius, 
     4     Yreal                   assistRadius, 
     5     Yreal                   height, 
     6     Yuint                   slices,
     7     YeOriginPose            originPose, 
     8     Yuint                   vertexStriding, 
     9     Yuint                   vertexPos,
    10     void*                   pVerticesBuffer
    11 )
    12 {
    13     if (slices < 2 || !pVerticesBuffer)
    14     {
    15         return false;
    16     }
    17 
    18     Yuint numVertices  = slices * 4;
    19 
    20     // 顶点赋值
    21     char* vertexPtr   = (char*)pVerticesBuffer + vertexPos;
    22     YsVector3* curVertexPtr   = NULL;
    23     Yuint nOffset = 0;
    24 
    25     Yreal originOffsetY = 0.0f;
    26     if (originPose == YE_ORIGIN_POSE_TOP)
    27     {
    28         originOffsetY = -height;
    29     }
    30     else if (originPose == YE_ORIGIN_POSE_CENTER)
    31     {
    32         originOffsetY = -height * 0.5f;
    33     }
    34 
    35     Yreal angleXZ;
    36     Yreal posX, posZ;        
    37     for (Yuint i = 0; i < slices; i++)
    38     {
    39         angleXZ = YD_REAL_TWAIN_PI * i / slices;
    40         posX = yf_sin(angleXZ);
    41         posZ = yf_cos(angleXZ);
    42 
    43         // 上顶点
    44         {
    45             //
    46             nOffset = (i * 2) * vertexStriding; 
    47             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
    48             curVertexPtr->x = radius * posX;
    49             curVertexPtr->y = height + originOffsetY;
    50             curVertexPtr->z = radius * posZ;
    51 
    52             //
    53             nOffset += vertexStriding;
    54             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
    55             curVertexPtr->x = assistRadius * posX;
    56             curVertexPtr->y = height + originOffsetY;
    57             curVertexPtr->z = assistRadius * posZ;
    58         }
    59 
    60         // 下顶点
    61         {
    62             //
    63             nOffset = (slices * 2 + i * 2) * vertexStriding; 
    64             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
    65             curVertexPtr->x = radius * posX;
    66             curVertexPtr->y = originOffsetY;
    67             curVertexPtr->z = radius * posZ;
    68 
    69             //
    70             nOffset += vertexStriding;
    71             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
    72             curVertexPtr->x = assistRadius * posX;
    73             curVertexPtr->y = originOffsetY;
    74             curVertexPtr->z = assistRadius * posZ;
    75         }
    76     }
    77 
    78     return true;
    79 }   

    三角形索引数据的生成

      1 bool                        YfBuildPipeTriIndices
      2 (
      3     Yuint                   slices,
      4     YeIndexType             indexType,
      5     Yuint                   indexStriding,  
      6     Yuint                   indexPos,
      7     void*                   pTriIndicesBuffer
      8 )
      9 {
     10     if (slices < 3 || !pTriIndicesBuffer)
     11     {
     12         return false;
     13     }
     14 
     15     Yuint numVertices  = slices * 4;
     16     Yuint numTriangles = slices * 8;
     17     if (indexType == YE_INDEX_16_BIT && 
     18         numVertices > YD_MAX_UNSIGNED_INT16)
     19     {
     20         return false;
     21     }
     22 
     23     Yuint halfVtxNum = numVertices / 2;
     24 
     25     // 索引赋值
     26     char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
     27     Yuint nOffset = 0;
     28     if (indexType == YE_INDEX_16_BIT)
     29     {
     30         YsTriIndex16* triIndexPtr = NULL;
     31         for (Yuint i = 0; i < slices; i++)
     32         {
     33             // 外面
     34             nOffset = (i * 8) * indexStriding;
     35             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     36             triIndexPtr->index0 = i * 2;
     37             triIndexPtr->index1 = halfVtxNum + i * 2;
     38             triIndexPtr->index2 = (i + 1) % slices * 2;
     39 
     40             nOffset += indexStriding;
     41             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     42             triIndexPtr->index0 = (i + 1) % slices * 2;
     43             triIndexPtr->index1 = halfVtxNum + i * 2;
     44             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2;
     45 
     46             // 里面
     47             nOffset += indexStriding;
     48             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     49             triIndexPtr->index0 = i * 2 + 1;
     50             triIndexPtr->index1 = (i + 1) % slices * 2 + 1;
     51             triIndexPtr->index2 = halfVtxNum + i * 2 + 1;
     52 
     53             nOffset += indexStriding;
     54             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     55             triIndexPtr->index0 = (i + 1) % slices * 2 + 1;
     56             triIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
     57             triIndexPtr->index2 = halfVtxNum + i * 2 + 1;
     58 
     59             // 上面
     60             nOffset += indexStriding;
     61             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     62             triIndexPtr->index0 = i * 2;
     63             triIndexPtr->index1 = (i + 1) % slices * 2 + 1;
     64             triIndexPtr->index2 = i * 2 + 1;
     65 
     66             nOffset += indexStriding;
     67             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     68             triIndexPtr->index0 = i * 2;
     69             triIndexPtr->index1 = (i + 1) % slices * 2;
     70             triIndexPtr->index2 = (i + 1) % slices * 2 + 1;
     71 
     72             // 下面
     73             nOffset += indexStriding;
     74             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     75             triIndexPtr->index0 = halfVtxNum + i * 2;
     76             triIndexPtr->index1 = halfVtxNum + i * 2 + 1;
     77             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2 + 1;
     78 
     79             nOffset += indexStriding;
     80             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
     81             triIndexPtr->index0 = halfVtxNum + i * 2;
     82             triIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
     83             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2;
     84         }
     85     }
     86     else
     87     {
     88         YsTriIndex32* triIndexPtr = NULL;
     89         for (Yuint i = 0; i < slices; i++)
     90         {
     91             // 外面
     92             nOffset = (i * 8) * indexStriding;
     93             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
     94             triIndexPtr->index0 = i * 2;
     95             triIndexPtr->index1 = halfVtxNum + i * 2;
     96             triIndexPtr->index2 = (i + 1) % slices * 2;
     97 
     98             nOffset += indexStriding;
     99             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    100             triIndexPtr->index0 = (i + 1) % slices * 2;
    101             triIndexPtr->index1 = halfVtxNum + i * 2;
    102             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2;
    103 
    104             // 里面
    105             nOffset += indexStriding;
    106             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    107             triIndexPtr->index0 = i * 2 + 1;
    108             triIndexPtr->index1 = (i + 1) % slices * 2 + 1;
    109             triIndexPtr->index2 = halfVtxNum + i * 2 + 1;
    110 
    111             nOffset += indexStriding;
    112             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    113             triIndexPtr->index0 = (i + 1) % slices * 2 + 1;
    114             triIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
    115             triIndexPtr->index2 = halfVtxNum + i * 2 + 1;
    116 
    117             // 上面
    118             nOffset += indexStriding;
    119             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    120             triIndexPtr->index0 = i * 2;
    121             triIndexPtr->index1 = (i + 1) % slices * 2 + 1;
    122             triIndexPtr->index2 = i * 2 + 1;
    123 
    124             nOffset += indexStriding;
    125             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    126             triIndexPtr->index0 = i * 2;
    127             triIndexPtr->index1 = (i + 1) % slices * 2;
    128             triIndexPtr->index2 = (i + 1) % slices * 2 + 1;
    129 
    130             // 下面
    131             nOffset += indexStriding;
    132             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    133             triIndexPtr->index0 = halfVtxNum + i * 2;
    134             triIndexPtr->index1 = halfVtxNum + i * 2 + 1;
    135             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2 + 1;
    136 
    137             nOffset += indexStriding;
    138             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    139             triIndexPtr->index0 = halfVtxNum + i * 2;
    140             triIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
    141             triIndexPtr->index2 = halfVtxNum + (i + 1) % slices * 2;
    142         }
    143     }
    144 
    145     return true;
    146 }   

    线框索引数据的生成

      1 bool                        YfBuildPipeWireIndices
      2 (
      3     Yuint                   slices,
      4     YeIndexType             indexType,
      5     Yuint                   indexStriding,  
      6     Yuint                   indexPos,
      7     void*                   pWireIndicesBuffer
      8 )
      9 {
     10     if (slices < 2 || !pWireIndicesBuffer)
     11     {
     12         return false;
     13     }
     14 
     15     Yuint numVertices = slices * 4;
     16     Yuint numLines    = slices * 8;
     17     if (indexType == YE_INDEX_16_BIT && 
     18         numVertices > YD_MAX_UNSIGNED_INT16)
     19     {
     20         return false;
     21     }
     22 
     23     Yuint halfVtxNum = numVertices / 2;
     24 
     25     // 索引赋值
     26     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
     27     Yuint nOffset = 0;
     28     if (indexType == YE_INDEX_16_BIT)
     29     {
     30         YsLineIndex16* lineIndexPtr = NULL;
     31         for (Yuint i= 0; i < slices; i++)
     32         {
     33             // 外面
     34             nOffset = (i * 8) * indexStriding;
     35             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     36             lineIndexPtr->index0 = i * 2;
     37             lineIndexPtr->index1 = halfVtxNum + i * 2;
     38 
     39             // 里面
     40             nOffset += indexStriding;
     41             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     42             lineIndexPtr->index0 = i * 2 + 1;
     43             lineIndexPtr->index1 = halfVtxNum + i * 2 + 1;
     44 
     45             // 上面
     46             nOffset += indexStriding;
     47             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     48             lineIndexPtr->index0 = i * 2;
     49             lineIndexPtr->index1 = i * 2 + 1;
     50 
     51             nOffset += indexStriding;
     52             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     53             lineIndexPtr->index0 = i * 2;
     54             lineIndexPtr->index1 = (i + 1) % slices * 2;
     55 
     56             nOffset += indexStriding;
     57             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     58             lineIndexPtr->index0 = i * 2 + 1;
     59             lineIndexPtr->index1 = (i + 1) % slices * 2 + 1;
     60 
     61             // 下面
     62             nOffset += indexStriding;
     63             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     64             lineIndexPtr->index0 = halfVtxNum + i * 2;
     65             lineIndexPtr->index1 = halfVtxNum + i * 2 + 1;
     66 
     67             nOffset += indexStriding;
     68             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     69             lineIndexPtr->index0 = halfVtxNum + i * 2;
     70             lineIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2;
     71 
     72             nOffset += indexStriding;
     73             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
     74             lineIndexPtr->index0 = halfVtxNum + i * 2 + 1;
     75             lineIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
     76         }
     77     }
     78     else
     79     {
     80         YsLineIndex32* lineIndexPtr = NULL;
     81         for (Yuint i= 0; i < slices; i++)
     82         {
     83             // 外面
     84             nOffset = (i * 8) * indexStriding;
     85             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
     86             lineIndexPtr->index0 = i * 2;
     87             lineIndexPtr->index1 = halfVtxNum + i * 2;
     88 
     89             // 里面
     90             nOffset += indexStriding;
     91             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
     92             lineIndexPtr->index0 = i * 2 + 1;
     93             lineIndexPtr->index1 = halfVtxNum + i * 2 + 1;
     94 
     95             // 上面
     96             nOffset += indexStriding;
     97             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
     98             lineIndexPtr->index0 = i * 2;
     99             lineIndexPtr->index1 = i * 2 + 1;
    100 
    101             nOffset += indexStriding;
    102             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    103             lineIndexPtr->index0 = i * 2;
    104             lineIndexPtr->index1 = (i + 1) % slices * 2;
    105 
    106             nOffset += indexStriding;
    107             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    108             lineIndexPtr->index0 = i * 2 + 1;
    109             lineIndexPtr->index1 = (i + 1) % slices * 2 + 1;
    110 
    111             // 下面
    112             nOffset += indexStriding;
    113             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    114             lineIndexPtr->index0 = halfVtxNum + i * 2;
    115             lineIndexPtr->index1 = halfVtxNum + i * 2 + 1;
    116 
    117             nOffset += indexStriding;
    118             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    119             lineIndexPtr->index0 = halfVtxNum + i * 2;
    120             lineIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2;
    121 
    122             nOffset += indexStriding;
    123             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    124             lineIndexPtr->index0 = halfVtxNum + i * 2 + 1;
    125             lineIndexPtr->index1 = halfVtxNum + (i + 1) % slices * 2 + 1;
    126         }
    127     }
    128 
    129     return true;
    130 }


     

  • 相关阅读:
    web前端技术社区分享
    programming-challenges Shoemaker&#39;s Problem (110405) 题解
    caffe 训练測试自己的数据集
    BootStrap有用代码片段(持续总结)
    H5学习_番外篇_PHP数据库操作
    WPF-MVVM-Demo
    android Toast大全(五种情形)建立属于你自己的Toast
    Java
    记一次死锁问题的排查和解决
    一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3415249.html
Copyright © 2011-2022 走看看