首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

OpenGL 圓柱體側面構建:為何每個頂點需要兩個頂點?

     編輯:程式設計綜合問答

問題重述

「圍著頂部圓的每個點都需要兩個頂點」——在使用三角形帶構建圓柱側面時,為何每個圓周頂點需重複兩次?

幾何原理

圓柱側面展開為矩形,用三角形帶繪製時:

  • 頂部圓與底部圓各有 N 個頂點。
  • 三角形帶頂點順序:頂部0, 底部0, 頂部1, 底部1, 頂部2, 底部2 ...
  • 每個三角形由連續三個頂點構成,形成側面條帶。

為何「每個點需要兩個頂點」?

  1. 屬性差異:頂部與底部頂點雖 XY 位置相同(投影),但 Z 座標不同(高度),且法向量不同(側面法線水平,頂底面法線垂直)。
  2. UV 貼圖需求:側面貼圖需沿高度方向拉伸,頂部與底部的 V 坐標分別為 0 和 1。
  3. 三角形帶拓撲:為了形成連續的四邊形(兩三角形),每個圓周角度位置必須同時提供頂部和底部頂點,即「兩個頂點」。

代碼示例

// 生成圓柱側面頂點 (三角形帶)
int sectors = 32;
float radius = 1.0f, height = 2.0f;
std::vector<Vertex> vertices;
for (int i = 0; i <= sectors; ++i) {
    float angle = 2 * M_PI * i / sectors;
    float x = radius * cos(angle);
    float y = radius * sin(angle);
    // 頂部頂點
    vertices.push_back({x, y, height/2, 0, 0, 1, (float)i/sectors, 0}); // 法線向外
    // 底部頂點
    vertices.push_back({x, y, -height/2, 0, 0, -1, (float)i/sectors, 1}); // 法線向外
}
// 繪製
glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size());

「前兩個頂點重複兩次」說明

為了閉合圓柱,最後一個扇區需與第一個扇區連接。通常做法:

  • 循環至 i <= sectors(即多生成一個頂點對,與第 0 個相同)。
  • 或繪製後單獨補上首尾連接三角形。

總結

「每個點兩個頂點」實為「每個圓周角度位置生成一對頂部/底部頂點」,滿足幾何拓撲、光照法線、貼圖座標需求。原文描述略顯模糊,建議參考 OpenGL 幾何體生成教程(如 Songho OpenGL Cylinder)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved