图形:创建3D圆柱体

时间:2014-12-04 07:01:44

标签: graphics 3d shapes

我在创建3D圆柱体时遇到问题(没有OpenGL)。据我所知,网格用于创建圆柱面,三角形扇形用于创建顶盖和底盖。我已经实现了网格而不是平面三角形风扇,所以目前我的3D对象看起来像没有底部和顶部盖子的圆柱体。

我认为这是我需要做的才能创建底部和顶部。首先,找到圆柱网格的中心点。其次,找到网格的顶点。第三,使用中心点和2个顶点,创建三角形。第四步,重复这些步骤,直到创建一个平面圆。

上述步骤是否足以创建大写字母,还是有更好的方法?如何找到网格的顶点,以便创建三角形扇形?

1 个答案:

答案 0 :(得分:0)

首先注意一些事项:

  1. 您没有指定您的平台
    • gfx interface
    • 语言
  2. 关于你的气缸的信息也不够
    • 是轴对齐的吗?
    • 什么坐标系(笛卡尔/正交/正交)?
    • 需要额外的尺寸,如颜色或纹理坐标?
  3. 所以我只能提供通用信息

    轴对齐圆柱

    1. 选择粒度N

      • 沿着您的帽子圈的点数
      • 通常20-36是可以的但是如果你需要更高的精度,那么有时你甚至需要1000点或更多
      • 一切都取决于目的,缩放,角度和视距......
      • 和效果问题
      • 现在让N=32
    2. 你需要BR(边界表示)

      • 您没有指定gfx界面,但您的文字意味着BR模型(表面多边形)
      • 也没有枢轴点位置所以我会选择圆柱的中点为(0,0,0)
      • z轴将是圆柱高度
      • 并且帽子将与xy plane共面
      • 所以对于气缸是足够的2环(帽)
      • 所以这些点可以用C ++定义:

        const int N=32; // mesh complexity
        double p0[N][3],p1[N][3]; // rings`
        double a,da,c,s,r,h2; // some temp variables
        int i;
        r =50.0; // cylinder radius
        h2=100.0*0.5; // half height of cyliner
        da=M_PI/double(N-1);
        for (a=0.0,i=0;i<N;i++,a+=da)
         {
         c=r*cos(a);
         s=r*sin(a);
         p0[i][0]=c;
         p0[i][1]=s;
         p0[i][2]=+h2;
         p1[i][0]=c;
         p1[i][1]=s;
         p1[i][2]=-h2;
         }
        
      • 环点为闭环(p0[0]==p0[N-1])

      • 所以你不需要额外的线来处理它......
    3. 现在如何绘制

      • 无法编写未知api的代码,但
      • &#39;网眼&#39;就像QUAD_STRIP我假设
      • 所以只需按顺序添加点数:
      • QUAD_STRIP = { p0[0],p1[0],p0[1],p1[1],...p0[N-1],p1[N-1] };
      • 如果您有反向正常问题,请交换p0 / p1
      • 现在为粉丝
      • 您不需要中间点(除非您有插值别名问题)
      • 如此相似:
      • TRIANGLE_FAN0 = { p0[0],p0[1],...p0[N-1] };
      • TRIANGLE_FAN1 = { p1[0],p1[1],...p1[N-1] };
      • 如果你还想要中间点:
      • TRIANGLE_FAN0 = { (0.0,0.0,+h2),p0[0],p0[1],...p0[N-1] };
      • TRIANGLE_FAN1 = { (0.0,0.0,-h2),p1[0],p1[1],...p1[N-1] };
      • 如果你有反正常问题,那么反转点顺序(中间点保持原样)
    4. 非轴对齐的圆柱?

      • 只需在p0[],p1[]点列表中使用转换矩阵即可转换/旋转到所需位置
      • 其余的保持不变