我试图在正弦曲线上绘制一个移动点,并绘制曲线上此点的正切和法线。我也想对这些线路进行规范化,但这不是我主要考虑的问题。
到目前为止,我认为我的切线很好,但我找不到如何绘制法线。
这是我到目前为止所拥有的: 两个定义是为了避免在代码中间键入
#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();
正如我所说,切线看起来不错,但正常情况绝对不行。
你能看出这是什么问题吗?
答案 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);