我试图以螺旋模式转换OpenGl对象。我无法弄清楚这一点。问题是我知道我需要增加x,y和z坐标的角度,但我使用的translate函数仅将对象移动一个特定于对象的平移量。我使用的轴是Y向上,Z是屏幕,X是右边。
public override void Move(Figure fig)
{
double angle = 0;
double x = RADIUS * Math.Cos(angle);
double y = (angle / RADIUS);
double z = RADIUS * Math.Sin(angle);
fig.Translate(x, y, z);
angle += .5;
}
public void Translate(double fx, double fy, double fz)
{
translateAmt[0] += fx;
translateAmt[1] += fy;
translateAmt[2] += fz;
}
答案 0 :(得分:2)
以下两种方法可以解决这个问题:
查看NeHe Lesson 36中的ProcessHelix
功能。有点难以阅读,但你应该能够看到用于获得螺旋线上的点的基本循环和计算。
如果以正确的顺序执行这些变换,则可以获得螺旋运动。这是你想象中的顺序:
所以在OpenGL中,你会向后做,因为指定的最后一个矩阵是第一个应用的...转换为+ y(取决于时间),绕y转动(取决于时间),并转换为x。< / p>
答案 1 :(得分:1)
搞定了!
private const double RADIUS = 1;
private const double INTERVAL = 0.1;
private double theta = 5;
private double alpha = 0;
private const double ANGLE = 10;
public override void Move(Figure fig)
{
double x = RADIUS * Math.Cos(theta);
double y = 0;
double z = RADIUS * Math.Sin(theta);
double deltaX = z * Math.Cos(alpha) - x * Math.Sin(alpha);
double deltaZ = x * Math.Cos(alpha) + z * Math.Sin(alpha);
fig.Translate(deltaX, y, deltaZ);
fig.Rotate(ANGLE, 0, 0, 1);
alpha += INTERVAL;
}
答案 2 :(得分:0)
我认为你错过了一些代码。
在移动中,角度始终从零开始,因此x,y,z值将始终相同,因为下次进入移动时它将再次为零。
你应该将角度传递给Move,这样这个值就会继续变化。
您可能需要将其作为指针传递,以便您可以在函数中更新它并实际更新它,或者让Move返回一个双倍return angle;
。
我希望你将角度改变0.5是不正确的,它可能需要基于重复数*某个值,但你可能想先解决你的第一个问题。