Требуется помощь с OpenGL

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by m1nt@ll, 19 Feb 2012.

  1. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    [C++]Требуется помощь с OpenGL

    Добрый день.

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

    Вот проблемные места, как я полагаю. :)

    Code:
    glPushMatrix( );
    
    glRotatef( -localPlayer.angles[1] + 90, 0, 0, 1 );
    
    DrawPlayer( x, y, 2, curPlayer.angles, curPlayer.team );
    
    glPopMatrix( );
    
    Code:
    void DrawPlayer( float x, float y, int width, GLfloat* angles, int team )
    {
    	glBegin( GL_TRIANGLE_FAN );
    
    	if( team == CS_TEAM_T )
    	{
    		glColor3f( 1, 0, 0 );
    	}
    	else if( team == CS_TEAM_CT )
    	{
    		glColor3f( 0, 0, 1 );
    	}
    	else
    	{
    		glColor3f( 0, 1, 0 );
    	}
    
    	glVertex2f( x, y );
    
    	for( GLfloat i = 0; i <= PI*2; i += PI*2/18 )
    	{
    		glVertex2f( x + cos( i ) * width , y + sin( i ) * width );
    	}
    
    	glEnd( );
    	
    	glBegin( GL_LINES );
    
    	if( team == CS_TEAM_T )
    	{
    		glColor3f( 1, 0, 0 );
    	}
    	else if( team == CS_TEAM_CT )
    	{
    		glColor3f( 0, 0, 1 );
    	}
    	else
    	{
    		glColor3f( 0, 1, 0 );
    	}
    
    	glVertex2f( x, y );
    	
    	glVertex2f( x + cos( DegToRad( angles[1] ) ) * width * 2, y + sin( DegToRad( angles[1] ) ) * width * 2 );
    
    	glEnd( );
    }
    
    [​IMG]
     
    #1 m1nt@ll, 19 Feb 2012
    Last edited: 19 Feb 2012
  2. warkk

    warkk Member

    Joined:
    20 Feb 2009
    Messages:
    139
    Likes Received:
    23
    Reputations:
    0
    Что-то мне кажется что дело в
    glRotatef( -localPlayer.angles[1] + 90, 0, 0, 1 );
    Не совсем понял зачем этот поворот. И glRotatef поворачивает текущую матрицу, и если ты повернул, то в след. раз уже будешь поворачивать в новых координатах. Попробуй использовать углы Эйлера, погугли как их преобразовать в поворот OpenGL
     
    #2 warkk, 19 Feb 2012
    Last edited: 19 Feb 2012
  3. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Спасибо за предложение, но проблема решена. Вместо углов, я считывал координаты :)

    Но появилась новая проблема: мне нужно, чтобы линия, отображающая хп, была чуть ниже кружочка и на нее не влияла смена координат, тобишь glRotate. Скрин как должно быть прилагается.

    [​IMG]

    Линия у синего кружочка (игрока) должна отображаться как у зеленого, то бишь горизонтально.

    Вот код, который рисует эту линию. Он расположен в функции DrawPlayer, которую я постил выше.

    Code:
    	glLineWidth( 3 );
    
    	glBegin( GL_LINES );
    
    	glColor3f( 1 - (float)health / 100, (float)health / 100, 0 );
    
    	GLfloat fCoef = 1.2;
    	GLfloat fHealthCoef = (float)health / 100 * ( width * (fCoef * 2) );
    	
    	glVertex2f( x - fHealthCoef / 2, y - width * 2 );
    	glVertex2f( x + fHealthCoef / 2, y - width * 2 );
    
    	glEnd( );
    
    	glLineWidth( 1 );
    
     
    #3 m1nt@ll, 19 Feb 2012
    Last edited: 19 Feb 2012
  4. warkk

    warkk Member

    Joined:
    20 Feb 2009
    Messages:
    139
    Likes Received:
    23
    Reputations:
    0
    В общем рисуй линию в матрице в которой ты поворот не делал, типа выгрузить текущую матрицу (в котороый ты поворот делал), glPopMatrix(), и рисовать линию, ну а потом (если нужно), то вернуться обратно. Или сделай поворот glRotatef обратный первому повороту, и рисуй линию.
     
    #4 warkk, 19 Feb 2012
    Last edited: 19 Feb 2012
  5. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Я уже рассматривал такой вариант. Линия просто будет находиться относительно дургой системы кординат. В общем, не под кружочком.. :\
     
  6. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Хммм... никто не разбирается в OpenGL?
     
  7. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Up. Если кому надо, вот видео с линком на исходники
    http://www.youtube.com/watch?v=0rDYlHaVwFA
     
    1 person likes this.