我正在尝试在正弦曲线上绘制移动点,并在曲线上绘制该点的切线和法线。我也想对这些行进行标准化,但这不是我的主要关注。
到目前为止,我认为我的切线很好,但是我找不到如何绘制法线的方法。
这是我到目前为止所拥有的:
两个定义避免在代码中间键入
#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);