函数以过度振荡的轨道视角代替

Function to orbit point of view with glut oscilates instead

本文关键字:轨道 函数      更新时间:2023-10-16

多年后,我又回到了C ++编程,无论如何,我的经验在大学里只有几个模块。所以请耐心等待..

我尝试使用以下功能围绕中心运行视点:

void Orbit(Mundo* m)
{
    float d = sqrt((m->camposx * m->camposx) + (m->camposz * m->camposz));
    float theta = ((atan2(m->camposx, m->camposz)) * 180) / PI;
    theta += 1;
    float thetarad = theta * 3.14159 / 180;
    m->camposx = d*cos(thetarad);
    m->camposz = d*sin(thetarad);
}

但取而代之的是,它在原始点和第一个增量之间振荡。那个操作系统,按它应该移动,但随后又回来了。

我很确定我在函数上做错了,但我在这里粘贴了代码的相关位以防万一。

之前我已经声明过:

struct Mundo
{
    float camposx;
    float camposy;
    float camposz;
};

并实例化:

Mundo mundo = {50, 50, 50};

并回忆说:

void OnDraw(void){
.....
gluLookAt ( mundo.camposx, mundo.camposy, mundo.camposz,  // posicion del ojo   
        0.0, 0, 0.0,      // hacia que punto mira  (0,0,0)    
        0.0, 1.0, 0.0);
.....
}
void OnTimer(int value) 
{ 
.....
Orbit(&mundo);
.....
}

我知道我还没有使用课程,我正在学习教程,这是第一课之一。下一章将介绍克拉塞斯。此外,还有一些分类可以更直接地完成,但我现在只是把事情说清楚。

任何帮助非常感谢。谢谢!

PS:我尝试调试,但是当涉及到以下行时,它会停止并询问.dll文件的某些位置,但不确定该怎么办。

void OnTimer(int value) 
{ 
....
    glutTimerFunc(1000,OnTimer,0);  
    glutPostRedisplay(); 
....
}

当我切换 atan2 的参数时,它不会振荡。所以你的数学有点错误。

在XY平面上,如果P=(x=10,y=1),则角度应该是几度。您的 atan2(x,y) 给出 arctan(10)= 84 度。 atan2(y,x) = arctan(1/10) = 5 度。