将车直线移动

时间:2014-01-12 00:09:56

标签: opengl graphics glut

我正试图将车直线移动。 我所拥有的是该线的起点和终点。

这是我到目前为止所尝试的

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的左侧并且只有一辆车在移动,则此解决方案偶尔会起作用。 如果我试图同时移动几辆车,只有一辆车按预期移动。然而其他人似乎有自己的意志......

因此...

  1. 我需要做些什么来让所有汽车一起开车?
  2. 我该如何正确计算角度? (无论起点在哪里)
  3. 重要提示:汽车正在平面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();
    }
    

1 个答案:

答案 0 :(得分:0)

对于角度来说,它可能更容易使用

angle = atan2(y2-y1, x2-x1);

atan2不仅可以计算你的矢量的反正切值,而且只要你的角度不确定就会处理令人讨厌的案件处理。

(请记住,余弦/正弦是周期性的pi,所以只使用delta值会产生两个可能的角度,即(1,1)和(-1,-1)都会产生角度45度)。

也许这确实解决了你不能一起开车的问题。如果不是,请检查每辆车是否都有自己的角度。