簡體   English   中英

從平面計算網格頂點

[英]Compute mesh vertices from a Plane

我想用OpenGL繪制我的Plane來調試程序,但是我不知道該怎么做(我的數學不是很好)。

我有一個帶有2個屬性的飛機:

  • 一個常數
  • 正常

這是我所擁有的:

////////////////////////////////////////////////////////////
Plane::Plane( const glm::vec3& a, const glm::vec3& b, const glm::vec3& c )
{
    glm::vec3 edge1 = b - a;
    glm::vec3 edge2 = c - a;

    this->normal    = glm::cross(edge1, edge2);
    this->constant  = -glm::dot( this->normal, a );
    this->normalize();
}

////////////////////////////////////////////////////////////
Plane::Plane( const glm::vec4& values )
{
    this->normal    = glm::vec3( values.x, values.y, values.z );
    this->constant  = values.w;
}

////////////////////////////////////////////////////////////
Plane::Plane( const glm::vec3& normal, const float constant ) :
constant    (constant),
normal      (normal)
{

}

////////////////////////////////////////////////////////////
Plane::Plane( const glm::vec3& normal, const glm::vec3& point )
{
    this->normal    = normal;
    this->constant  = -glm::dot(normal, point);
    this->normalize();
}

我想畫一下,看一切是否正常。 我該怎么做? (我需要計算頂點和索引才能繪制出來)

要繪制時,需要找到兩個垂直於法線的向量和一個平面上的點。 沒那么難。 首先,讓我們得到一個不normal的向量。 稱之為some_vect 例如:

if normal == [0, 0, 1]
    some_vect = [0, 1, 0]
else
    some_vect = [0, 0, 1]

然后,計算vect1 = cross(normal, some_vect)將為您提供一個垂直於normal的向量。 計算vect2 = cross(normal, vect1)將給您另一個垂直於normal向量。

在平面上有兩個垂直矢量vect1vect2並有一個點,繪制平面變得微不足道。 例如,具有以下四個點的平方(記住對向量進行歸一化):

point + vect1 * SIZE
point + vect2 * SIZE
point - vect1 * SIZE
point - vect2 * SIZE

point是平面上的點。 如果您的constant是距原點的距離,則一個pointconstant * normal

繪制平面的困難在於它是一個無限大的表面。 即根據定義,它沒有邊或頂點。 如果要以典型的多邊形方式顯示平面,則必須將其裁剪到特定區域,例如正方形。

一個相當簡單的方法是:

  1. 選擇一個垂直於法線的任意單位向量。 將其存儲為v1。
  2. 使用v1與平面法線的叉積獲得v2。
  3. 取反v1以獲得v3。
  4. 取反v2以獲得v4。

現在,點v1-4表示一個正方形的四個角,該四個角的方向與您的平面相同。 您需要做的就是將它們乘以所需的大小,然后相對於飛機上的任何點進行繪制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM