从平面计算网格顶点

时间:2013-11-04 14:16:24

标签: c++ opengl math

我想用OpenGL绘制我的Plane以调试我的程序,但我不知道我怎么能这样做(我的数学不是很好)。

我有一架飞机有两个属性:

  • 常数
  • 正常

这是我得到的:

////////////////////////////////////////////////////////////
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();
}

我想画一下,看看是否一切正常。我怎么能这样做? (我需要计算顶点和索引来绘制它)

2 个答案:

答案 0 :(得分:2)

当你想要绘制时,你需要找到两个垂直于法线的矢量和一个平面上的点。那不是那么难。首先,让我们得到一个不是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的perpendecular向量。计算vect2 = cross(normal, vect1)会为您提供另一个属于normal的向量。

在平面上有两个永久向量vect1vect2以及一个点,绘制平面变得微不足道。例如,具有以下四个点的sqaure(记得规范化向量):

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

其中point是飞机上的一个点。如果您的constant与原点相距,则pointconstant * normal

答案 1 :(得分:1)

绘制平面的难点在于它是一个无限的表面;即根据定义,它没有边缘或顶点。如果要以典型的多边形方式显示平面,则必须将其裁剪到特定区域,例如正方形。

这是一个相当简单的方法:

  1. 选择与法线垂直的任意单位矢量。将其存储为v1。
  2. 使用v1和平面法线的叉积得到v2。
  3. 取消v1以获取v3。
  4. 取消v2获取v4。
  5. 点v1-4现在表示正方形的四个角,其方向与您的平面相同。您需要做的就是将它们增加到您想要的任何尺寸,并相对于您飞机上的任何点绘制它。