Алгоритм пули, имеющий проблемы с вращением на X - PullRequest
0 голосов
/ 09 сентября 2010

Вот что я пытаюсь сделать. Я пытаюсь сделать пулю из центра экрана. У меня есть угол поворота х и у. Проблема в том, что Y (который изменяется поворотом на x) действительно не работает, как предполагалось. Вот что у меня есть.

 float yrotrad, xrotrad;

    yrotrad = (Camera.roty / 180.0f * 3.141592654f);
    xrotrad = (Camera.rotx / 180.0f * 3.141592654f);
    Vertex3f Pos;

// get camera position
    pls.x = Camera.x;
    pls.y = Camera.y;
    pls.z = Camera.z;


    for(float i = 0; i < 60; i++)
    {


    //add the rotation vector

        pls.x += float(sin(yrotrad)) ;
        pls.z -= float(cos(yrotrad)) ;
        pls.y += float(sin(twopi - xrotrad));

    //translate camera coords to cube coords
        Pos.x = ceil(pls.x / 3);
        Pos.y = ceil((pls.y) / 3);
        Pos.z = ceil(pls.z / 3);

        if(!CubeIsEmpty(Pos.x,Pos.y,Pos.z)) //remove first cube that made contact
        {
            delete GetCube(Pos.x,Pos.y,Pos.z);
            SetCube(0,Pos.x,Pos.y,Pos.z);
            return;
        }
    }

Это почти идентично тому, как я двигаю игрока, я добавляю вектор направления в камеру и затем нахожу, на каком кубе находится игрок. Если я уберу pls.y += float(sin(twopi - xrotrad)); тогда я ясно вижу, что на X и Z все указывает как надо. Когда я добавляю pls.y += float(sin(twopi - xrotrad));, то это почти работает, но не совсем то, что я наблюдал при рендеринге сфер траектории, это то, что, как я смотрю, вверх или вниз, чем больше смещение, тем больше он остается не выровненным относительно центра камеры. Что я делаю не так?

Спасибо

То, что в основном происходит, объяснить очень сложно, я ожидаю, что пуля в момент времени 0 всегда будет в центре экрана, но ведет себя странно. Если я смотрю прямо на горизонт до + - 20 градусов вверх, это нормально, но тогда он больше не следует.

Я настроил свою матрицу так:

void CCubeGame::SetCameraMatrix()
{

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glRotatef(Camera.rotx,1,0,0);
    glRotatef(Camera.roty,0,1,0);
    glRotatef(Camera.rotz,0,0,1);

    glTranslatef(-Camera.x , -Camera.y,-Camera.z );
}

и измените угол следующим образом:

void CCubeGame::MouseMove(int x, int y)
{
    if(!isTrapped)
        return;

    int diffx = x-lastMouse.x; 
    int diffy = y-lastMouse.y; 

    lastMouse.x = x; 
    lastMouse.y = y;
    Camera.rotx += (float) diffy * 0.2; 
    Camera.roty += (float) diffx * 0.2; 
    if(Camera.rotx > 90)
    {
        Camera.rotx = 90;
    }

    if(Camera.rotx < -90)
    {
        Camera.rotx = -90;
    }

    if(isTrapped)
    if (fabs(ScreenDimensions.x/2 - x) > 1 || fabs(ScreenDimensions.y/2 - y) > 1) {
        resetPointer();
    }

}

1 Ответ

1 голос
/ 09 сентября 2010

Вам нужно масштабировать X и Z на cos(xradrot). (Другими словами, умножьте на cos(xradrot)).

Представьте, что вы указываете прямо вниз по оси Z, но смотрите прямо вверх. Вы вообще не хотите, чтобы пуля сбивала ось Z, поэтому вам нужно масштабировать ее. (Это в основном то же самое, что вы делаете между X и Z, но теперь делаете это с вектором XZ ​​и Y.)

pls.x += float(sin(yrotrad)*cos(xrotrad)) ;
pls.z -= float(cos(yrotrad)*cos(xrotrad)) ;
pls.y += float(sin(twopi - xrotrad));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...