在Opengl中围绕一个圆圈移动物体

时间:2009-10-18 01:46:51

标签: c# opengl transform

我试图以螺旋模式转换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;

}

3 个答案:

答案 0 :(得分:2)

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

在程序

查看NeHe Lesson 36中的ProcessHelix功能。有点难以阅读,但你应该能够看到用于获得螺旋线上的点的基本循环和计算。

2次翻译和轮换

如果以正确的顺序执行这些变换,则可以获得螺旋运动。这是你想象中的顺序:

  1. 将物体从原点(例如+ x)转换为螺旋半径
  2. 围绕原点(y轴)旋转对象,创建圆周运动
  3. 沿y轴平移物体,创建螺旋运动。
  4. 所以在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是不正确的,它可能需要基于重复数*某个值,但你可能想先解决你的第一个问题。