OpenGL - 绘制正切曲线和法线曲线

时间:2014-04-15 03:44:40

标签: c opengl normals sine

我试图在正弦曲线上绘制一个移动点,并绘制曲线上此点的正切和法线。我也想对这些线路进行规范化,但这不是我主要考虑的问题。

到目前为止,我认为我的切线很好,但我找不到如何绘制法线。

这是我到目前为止所拥有的: 两个定义是为了避免在代码中间键入

#define SIN(A, y, x) A * sin(((2 * M_PI) / y) * x)
#define COSDY(A, y, x) A * ((2 * M_PI) / y) * cos(((2 * M_PI) / y) * x)

这些是我为曲线做的图,切线然后是法线:

glBegin(GL_LINE_STRIP);

for (x = -1.f; x <= 1.f; x += 0.01) {
  glVertex3f(x, SIN(1, 2, x), 1.f);
}

glEnd();

glPointSize(10.0);
glBegin(GL_POINTS);

glVertex3f(position, SIN(1, 2, position), 1.f);

glEnd();
glPointSize(1.0);

float dx = 1;
float dy = COSDY(1, 2, position);

float mag = sqrtf(dx * dx + dy * dy);
dx /= mag;
dy /= mag;

glBegin(GL_LINES);

glVertex3f(position, SIN(1, 2, position), 1.f);
glVertex3f(position + dx, position + dy, 1.f);

glEnd();

glBegin(GL_LINES);

glVertex3f(position, SIN(1, 2, position), 1.f);
glVertex3f(position + dy, position - 1 / dx, 1.f);

glEnd();

正如我所说,切线看起来不错,但正常情况绝对不行。

Bad normals

你能看出这是什么问题吗?

1 个答案:

答案 0 :(得分:1)

切线的计算基本上看起来不错。不过,我不太了解你绘制它的方式。如果(dx,dy)是您的切线向量,那么您的绘图代码是否应该如下所示?

glVertex3f(position, SIN(1, 2, position), 1.f);
glVertex3f(position + dx, SIN(1, 2, position) + dy, 1.f);

在任何情况下,使用(dx,dy)作为切向量,法线向量的两个选项是(dy,-dx)和(-dy,dx)。请记住,两个向量的标量乘积需要为零才能使两个向量正交。您的正常绘图变为:

glVertex3f(position, SIN(1, 2, position), 1.f);
glVertex3f(position + dy, SIN(1, 2, position) - dx, 1.f);