繁体   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