我正在尝试在正弦曲线上绘制移动点,并在曲线上绘制该点的切线和法线。我也想对这些行进行标准化,但这不是我的主要关注。

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

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

#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();


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



您能看到这是什么问题吗?

最佳答案

切线的计算基本上看起来可以。不过,我不太了解您的绘制方式。如果(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);

10-08 04:49