[英]moving objects around a circle in Opengl
我正在嘗試以螺旋模式轉換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;
}
您可以通過以下兩種方法來解決此問題:
在NeHe第36課中查看ProcessHelix
函數。 有點難以閱讀,但是您應該能夠看到用於沿螺旋線獲取點的基本循環和計算。
如果以正確的順序執行這些轉換,則可以得到螺旋運動。 這是您想象中的操作順序:
因此,在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;
}
我認為您缺少一些代碼。
在移動中,角度始終從零開始,因此x,y,z值將始終相同,因為下次您進入“移動”時,它將再次為零。
您可能應該將角度傳遞到“移動”中,以便此值將繼續更改。
您可能需要將其作為指針傳遞,以便可以在函數中對其進行更新並實際對其進行更新,或者使Move返回一個double值和一個return angle;
。
我希望您將角度更改為0.5是不正確的,它可能需要基於重復次數*一些值,但是您可能要首先解決第一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.