Click here to Skip to main content
Click here to Skip to main content

Target Following Control with OpenGL

By , 4 May 2013
 

Introduction

The Follow Target Control implemented in the attached C++ project represents a simple method to follow a known target especially if the target is out of sight.

Background 

Many 3D games implement this control, but still articles describing this method of following targets are scarce.

Using the Code

A simple camera model was implemented to prove the concept. We use a simple cube to follow as target.

Ionut_Iorgovan/example1.jpg

Image description: Shows a screen capture of the application.The white cube represent the target and the black dot represent the target following control.

For the actual method, we obtain the matrix that transforms the word coordinate system to the camera coordinate system. The matrix can be calculated using OpenGL command:

glGetFloatv(GL_MODELVIEW_MATRIX, Matrix)  

After that, we multiply this matrix with the coordinate of our target and we obtain the target coordinate in the camera space, which is 2D. 

TargetPosition[0] = Position[0]*Matrix[0]+Position[1] * 
			Matrix[4] + Position[2] * Matrix[8] + 1.0f * Matrix[12];
TargetPosition[1] = Position[0]*Matrix[1]+Position[1] * 
			Matrix[5] + Position[2] * Matrix[9] + 1.0f * Matrix[13];
TargetPosition[2] = Position[0]*Matrix[2]+Position[1]* 
			Matrix[6] + Position[2] * Matrix[10] + 1.0f * Matrix[14]; 

To display a target point close to the screen edge, we do some simple geometry calculation to determine the intersection point between the screen rectangle frame and the target.

To actually display the following target, we switch from 3D mode to 2D mode and we use OpenGL GL_POINTS to indicate the direction of our target:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 500, 500, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(250, 250, 0.0);
glPointSize(10.0f);
glBegin(GL_POINTS);
glVertex2f((IPoint[1] -250)/1.1, (-IPoint[0] +250)/1.1);
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();  

Points of Interest

The implementation of this method is quite easy, it requires combining 2D and 3D mode with OpenGL.

To control the camera movement, the following keys are used:

  • w, s: zoom in and out
  • q, z: up and down movement
  • a, d: left and right movement

History

In the first implementation, I used a simple circle targeting. This implementation is inside the source code, but is currently commented.

Ionut_Iorgovan/example2.jpg

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

ionutcelgroaznic
Software Developer
Romania Romania
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 3memberBartlomiej Filipek17 Apr '13 - 3:10 
SuggestionMy Vote: 0memberRoger6516 Apr '13 - 1:45 
GeneralRe: My Vote: 0memberionutcelgroaznic3 May '13 - 20:57 
GeneralA better version [modified]memberionutcelgroaznic11 Apr '10 - 21:21 
General[My vote of 1] my vote of 1memberMember 306826 Mar '10 - 13:31 
GeneralRe: [My vote of 1] my vote of 1memberSaurabh.Garg27 Mar '10 - 0:35 
GeneralRe: [My vote of 1] my vote of 1memberDruuler30 Mar '10 - 22:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130513.1 | Last Updated 4 May 2013
Article Copyright 2010 by ionutcelgroaznic
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid