我想用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();
}
我想画一下,看看是否一切正常。我怎么能这样做? (我需要计算顶点和索引来绘制它)
答案 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
的向量。
在平面上有两个永久向量vect1
和vect2
以及一个点,绘制平面变得微不足道。例如,具有以下四个点的sqaure(记得规范化向量):
point + vect1 * SIZE
point + vect2 * SIZE
point - vect1 * SIZE
point - vect2 * SIZE
其中point
是飞机上的一个点。如果您的constant
与原点相距,则point
为constant * normal
。
答案 1 :(得分:1)
绘制平面的难点在于它是一个无限的表面;即根据定义,它没有边缘或顶点。如果要以典型的多边形方式显示平面,则必须将其裁剪到特定区域,例如正方形。
这是一个相当简单的方法:
点v1-4现在表示正方形的四个角,其方向与您的平面相同。您需要做的就是将它们增加到您想要的任何尺寸,并相对于您飞机上的任何点绘制它。