1

我正在尝试以螺旋模式平移 OpenGl 对象。我无法弄清楚这一点。问题是我知道我需要增加 x、y 和 z 坐标的角度,但是我使用的平移函数仅将对象移动了特定于对象的平移量。我使用的轴是 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;

}
4

3 回答 3

2

这里有两种方法可以解决这个问题:

程序上

查看NeHe 第 36 课ProcessHelix中的函数。有点难以阅读,但您应该能够看到用于沿螺旋线获取点的基本循环和计算。

2 翻译和轮换

如果您以正确的顺序执行这些转换,您可以获得螺旋运动。这是您在脑海中想象的顺序:

  1. 将物体从原点平移(例如+x)螺旋的半径
  2. 围绕原点(y 轴)旋转对象,创建圆周运动
  3. 沿 y 轴平移对象,创建螺旋运动。

因此,在 OpenGL 中,您会向后执行这些操作,因为指定的最后一个矩阵是第一个应用的矩阵……平移 +y(时间相关),围绕 y 旋转(时间相关),然后平移 x。

于 2009-10-18T03:31:08.580 回答
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;
  }
于 2009-10-20T02:03:38.460 回答
0

我认为您缺少一些代码。

在 move 中,角度始终从零开始,因此 x、y、z 值将始终相同,因为下次您进入 Move 时,它​​将再次为零。

您应该将角度传递给 Move,以便该值将继续更改。

您可能需要将其作为指针传递,以便您可以在函数内更新它并实际更新它,或者让 Move 返回一个 double 和return angle;

我希望您将角度更改 0.5 是不正确的,它可能需要基于重复数 * 某个值,但您可能想先解决您的第一个问题。

于 2009-10-18T03:10:12.127 回答