Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Opengl中围绕圆移动对象_C#_Opengl_Transform - Fatal编程技术网

C# 在Opengl中围绕圆移动对象

C# 在Opengl中围绕圆移动对象,c#,opengl,transform,C#,Opengl,Transform,我正在尝试以螺旋模式转换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

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

}

我认为您缺少一些代码

在移动中,角度始终以零开始,因此x、y、z值将始终相同,因为下次进入移动时,它将再次为零

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

您可能需要将其作为指针传入,以便可以在函数中更新它并实际更新它,或者,让Move返回一个双精度和
返回角度


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

以下是两种方法:

程序上 查看中的
ProcessHelix
功能。读起来有点难,但是你应该能够看到基本的循环和计算,用来得到螺旋线上的点

2个平移和1个旋转 如果按正确的顺序执行这些变换,就可以得到螺旋运动。这是你在脑海中想象的顺序:

  • 将对象从原点(例如+x)移开螺旋半径
  • 围绕原点(y轴)旋转对象,创建圆周运动
  • 沿y轴平移对象,创建螺旋运动
  • 因此,在OpenGL中,您可以向后执行这些操作,因为指定的最后一个矩阵是应用的第一个矩阵。。。在+y(时间相关)中平移,在y(时间相关)周围旋转,然后在x中平移。

    开始工作了

      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;
      }