簡體   English   中英

在Opengl中繞圓移動對象

[英]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函數。 有點難以閱讀,但是您應該能夠看到用於沿螺旋線獲取點的基本循環和計算。

2個翻譯和一個旋轉

如果以正確的順序執行這些轉換,則可以得到螺旋運動。 這是您想象中的操作順序:

  1. 將對象平移成遠離螺旋線半徑的原點(例如+ x)
  2. 繞原點(y軸)旋轉對象,以產生圓周運動
  3. 沿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;
  }

我認為您缺少一些代碼。

在移動中,角度始終從零開始,因此x,y,z值將始終相同,因為下次您進入“移動”時,它將再次為零。

您可能應該將角度傳遞到“移動”中,以便此值將繼續更改。

您可能需要將其作為指針傳遞,以便可以在函數中對其進行更新並實際對其進行更新,或者使Move返回一個double值和一個return angle;

我希望您將角度更改為0.5是不正確的,它可能需要基於重復次數*一些值,但是您可能要首先解決第一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM