2016-10-27 13 views
0

OpenGLでコーンを描画する方法を示すオンラインが見つかった。これはhereである。これはC++で書かれているので、C#に変換した。OpenGLコーン関数が正しく描画されない

 public void RenderCone(Vector3 d, Vector3 a, float h, float rd, int n) 
     { 
      Vector3 c = new Vector3(a + (-d * h)); 
      Vector3 e0 = Perp(d); 
      Vector3 e1 = Vector3.Cross(e0, d); 
      float angInc = (float)(360.0/n * GrimoireMath.Pi/180); 

      // calculate points around directrix 
      List<Vector3> pts = new List<Vector3>(); 
      for (int i = 0; i < n; ++i) 
      { 
       float rad = angInc * i; 
       Vector3 p = c + (((e0 * (float)Math.Cos((rad)) + (e1 * (float)Math.Sin(rad))) * rd)); 
       pts.Add(p); 
      } 

      // draw cone top 
      GL.Begin(PrimitiveType.TriangleFan); 
      GL.Vertex3(a); 
      for (int i = 0; i < n; ++i) 
      { 
       GL.Vertex3(pts[i]); 
      } 
      GL.End(); 

      // draw cone bottom 
      GL.Begin(PrimitiveType.TriangleFan); 
      GL.Vertex3(c); 
      for (int i = n - 1; i >= 0; --i) 
      { 
       GL.Vertex3(pts[i]); 
      } 
      GL.End(); 
     } 

     public Vector3 Perp(Vector3 v) 
     { 
      float min = Math.Abs(v.X); 
      Vector3 cardinalAxis = new Vector3(1, 0, 0); 
      if (Math.Abs(v.Y) < min) 
      { 
       min = Math.Abs(v.Y); 
       cardinalAxis = new Vector3(0, 1, 0); 
      } 
      if (Math.Abs(v.Z) < min) 
      { 
       cardinalAxis = new Vector3(0, 0, 1); 
      } 
      return Vector3.Cross(v, cardinalAxis); 
     } 

私は私が正しくパラメータを使用していますを考える(実際の関数の使用の点では正確にコヒーレントページイマイチ):ここでは、新しいコードです。ここでは、元の作成者が供給伝説です:

enter image description here

は、しかし、私は、パラメータとして以下に入力したとき:

RenderCone(new Vector3(0.0f, 1.0f, 0.0f), new Vector3(1.0f, 1.0f, 1.0f), 20.0f, 10.0f, 8); 

私は(ワイヤーフレームが有効になって)これを受け取る:

enter image description here

ご覧のとおり、私はスライスを最初からやってのけています。誰もがこのメソッドの何が間違っているか知っていますか?それとも不完全な円錐の原因になると私が間違っていることができますか?

答えて

2
 // draw cone bottom 
     GL.Begin(PrimitiveType.TriangleFan); 
     GL.Vertex3(c); 
     for (int i = n - 1; i >= 0; --i) 
     { 
      GL.Vertex3(pts[i]); 
     } 
     GL.End(); 

これは、すべての頂点を互いに接続して中央に配置しますが、欠落している接続が1つあります。最初の頂点から最後の頂点への接続を指定するものはありません。 GL.Vertex3(pts [n-1])を追加する。ループ後に不足している接続が追加されます。

+0

私は文字通りそのことに気付きました。 = P – Krythic

+0

線の代わりに三角形を描きたい場合は、topにも同じ接続が必要です。 –

+0

私はワイヤフレームでレンダリングしていましたが、私はまだそれを理解しようとしています。 – Krythic

0

このソリューションは実際には非常に簡単なので、スライス数を1増やす必要がありました。

 public void RenderCone(Vector3 baseToApexLength, Vector3 apexLocation, float height, float radius, int slices) 
     { 
      Vector3 c = new Vector3(apexLocation + (-baseToApexLength * height)); 
      Vector3 e0 = Perpendicular(baseToApexLength); 
      Vector3 e1 = Vector3.Cross(e0, baseToApexLength); 
      float angInc = (float)(360.0/slices * GrimoireMath.Pi/180); 
      slices++; // this was the fix for my problem. 
      /** 
      * Compute the Vertices around the Directrix 
      */ 
      Vector3[] vertices = new Vector3[slices]; 
      for (int i = 0; i < vertices.Length; ++i) 
      { 
       float rad = angInc * i; 
       Vector3 p = c + (((e0 * (float)Math.Cos((rad)) + (e1 * (float)Math.Sin(rad))) * radius)); 
       vertices[i] = p; 
      } 

      /** 
      * Draw the Top of the Cone. 
      */ 
      GL.Begin(PrimitiveType.TriangleFan); 
      GL.Vertex3(apexLocation); 
      for (int i = 0; i < slices; ++i) 
      { 
       GL.Vertex3(vertices[i]); 
      } 
      GL.End(); 

      /** 
      * Draw the Base of the Cone. 
      */ 
      GL.Begin(PrimitiveType.TriangleFan); 
      GL.Vertex3(c); 
      for (int i = slices - 1; i >= 0; --i) 
      { 
       GL.Vertex3(vertices[i]); 
      } 
      GL.End(); 
     } 
関連する問題