C# 在Opengl中围绕圆移动对象
我正在尝试以螺旋模式转换OpenGl对象。我想不出来。问题是我知道我需要增加x、y和z坐标的角度,但我使用的平移函数只会移动对象特定于对象的平移量。我使用的轴是Y向上,Z朝向屏幕,X朝向右侧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
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;
}