直线移动汽车
Posted
技术标签:
【中文标题】直线移动汽车【英文标题】:Move car in a straight line 【发布时间】:2014-01-12 00:09:56 【问题描述】:我正在尝试。 我所拥有的是线的起点和终点。
这是我迄今为止尝试过的
glTranslated(x, y, z);
glRotated(angle * 180 / PI, 0, 1, 0);
glColor3d(0.1, 0.1, 0.4);
glutSolidCube(40); // imagine that this is a car
x += speed * sin(angle + PI/2);
z += speed * cos(angle + PI/2);
角度被接收
double dist = sqrt((double)(x2-x1)*(x2-x1) + (double)(y2-y1)*(y2-y1));
int deltaX = abs(x2-x1);
angle = PI - acos(deltaX/dist)
如果点 1 在点 2 的左侧并且只有一辆车在移动,则此解决方案偶尔会起作用。 如果我尝试同时移动几辆车,则只有其中一辆车按预期移动。然而其他人似乎有自己的意愿......
所以...
-
我需要做什么才能让所有汽车一起行驶?
我应该如何正确计算角度? (不管起点在哪里)
重要提示:汽车在平面 xz 平面 (y=0) 上行驶
编辑:
这是我的汽车课(目前)
#include "glut.h"
#include <math.h>
#include "Car.h"
Car::Car(double x, double y, double z, double speed, double angle)
this->x = x;
this->y = y;
this->z = z;
this->speed = speed;
this->angle = angle;
void Car::draw3D()
glTranslated(x, y, z);
glRotated(angle * 180 / 3.14, 0, 1, 0);
glColor3d(0.1, 0.1, 0.4);
glutSolidCube(40);
x += speed * sin(angle + 1.57);
z += speed * cos(angle + 1.57);
这就是我建造汽车的方式
for(vector<Road*>::iterator it = roads.begin(); it != roads.end(); ++it)
int x1 = (*it)->x1;
int y1 = (*it)->y1;
int x2 = (*it)->x2;
int y2 = (*it)->y2;
double mangle = -atan2((double)y2-y1, (double)x2-x1);
cars.push_back(new Car(x1-GRID_SIZE/2, 0, y1-GRID_SIZE/2, 5, mangle));
这就是我绘制所有汽车的方式
for(vector<Car*>::iterator it = cars.begin(); it != cars.end(); ++it)
(*it)->draw3D();
【问题讨论】:
在draw3d()的开头放glPushMatrix();
,在结尾glPopMatrix();
。然后再试一次。
是的。也只是这么想。现在它正在工作。感谢您的帮助。
好。最后一件事:GLUT 已被弃用并且非常陈旧,您可以考虑改用GLEW。
【参考方案1】:
对于角度来说可能更容易使用
angle = atan2(y2-y1, x2-x1);
atan2 不仅会计算向量的反正切,还会在您的角度不确定时处理令人讨厌的大小写。
(请记住,余弦/正弦是周期性的,周期为 pi,因此仅使用 delta 值将导致两个可能的角度,即 (1,1) 和 (-1,-1) 都将导致角度 45 °)。
也许这确实解决了您的汽车不能一起行驶的问题。如果没有,请检查每辆车是否都有分配给它的角度。
【讨论】:
有了这个,我可以一次向所有可能的方向移动一辆车,所以谢谢你,但我仍然不能同时移动几辆车。是的,每辆车都有自己的角度。 我也不得不使用angle = -atan2(y2-y1, x2-x1);
为什么不能移动几辆车?当你尝试时会发生什么?你打算怎么做?
1.其中一辆车朝着正确的方向行驶,而其他车则以不同的方式行驶。 2. 我有一个汽车对象向量,每个对象都用我问题中的第一个代码 sn-p 绘制自己。
能否添加汽车类的全部代码和绘图函数的示例函数调用?我现在只能大胆猜测。以上是关于直线移动汽车的主要内容,如果未能解决你的问题,请参考以下文章