Jump to content

  • Log In with Google      Sign In   
  • Create Account


3d Open GL Game - How to fix a object to the camera =)


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 NatalieBerry88   Members   -  Reputation: 100

Like
0Likes
Like

Posted 25 November 2011 - 08:26 PM

Hi guys!Posted Image I have successfully created a Player class which shows a player ( lovely cow! Posted Image ). However, I wanted to make the player be static in the screen, since I wanted to create a racing-supermario like game. Basically what I have now is a camera that goes around but I want to stick it to the player mesh.

Here is some code:

Camera look() function code
void CCamera::Look(){
    // Give openGL our camera position, then camera view, then camera up vector
    gluLookAt(m_vPosition.x, m_vPosition.y, m_vPosition.z,    
     	     m_vView.x, 	m_vView.y, 	m_vView.z,    
     	     m_vUpVector.x, m_vUpVector.y, m_vUpVector.z);

}



Player.h
#ifndef _PLAYER_H#define _PLAYER_H


#include "Model_3DS.h"


// This class was made to handle models created for player use.


class Player
{


    Model_3DS playerModel;




public:




    
    void LoadPlayer();  //Method to load player mesh
    void DrawPlayer();  //Method to draw player mesh
   


        Player();                                    // Constructor
    virtual ~Player();
    
};



 #endif


Player.cpp
#include "Player.h"

Player::Player()
{
 	playerModel.scale = 3.0f;//Scale the model up
 	playerModel.pos.x = 250.0f;//Set the x position
 	playerModel.pos.y = 15;//Set the y position
 	playerModel.pos.z = 400.0f;//Set the z position
}


Player::~Player()
{


}






void Player::LoadPlayer(){
    playerModel.Load("Data/3DS/SecondaryObjects/cow2.3ds"); // Load a 3ds model
}


void Player::DrawPlayer(){


    playerModel.Draw();//Draw tree model
    



};


I was thinking that I should call the position of the camera in the player position, but I am not so sure how
Posted Image

If somebody could give me a hand would be great!
Also, if you want to add me on skype so its quicker would be good too ^^:
natalieberrystraw is my skype.

Thanks in advance! <3


Natalie xxx

Sponsor:

#2 Melanikus   Members   -  Reputation: 100

Like
0Likes
Like

Posted 25 November 2011 - 09:51 PM

Yeah, hmmm, I think you want a follow camera that tracks the object from behind (maybe like Tomb Raider Style?)

I would use the object's matrix get the object's front vector, multiply by a positive distance ,get object's up vector and multiply by a positive distance and then use gluLookAt with the object's position

So basically, all you have to do is put your object somewhere (use glTranslate and glRotate) and then steal back the modelview matrix OpenGL created with glGetFloatv(GL_MODELVIEW_MATRIX, yourMatrixPointer)

So your yourMatrixPointer looks like this:

Posted Image



Of course "m#" need to accessed like yourMatrixPointer[#] and your "yourMatrixPointer" would be declared like float * yourMatrixPointer[16] (4x4 matrix)

Anyway, your gluLookAt would look something like

void gluLookAt
(m8 * howFarBehindYouWannaBe
, m9 * howFarBehindYouWannaBe
, m10 * howFarBehindYouWannaBe
, m12
, m13
, m14
, m4 * howFarAboveYouWannaBe
, m5 * howFarAboveYouWannaBe
, m6 * howFarAboveYouWannaBe
);

Remember that you look at -Z when looking at the screen, and Y grows up, so you need to put a positive value on the howFarBehindYouWannaBe and howFarAboveYouWannaBe so you can be behind and above the object

Didn't test the code, but pretty sure it COULD work O_o

#3 NatalieBerry88   Members   -  Reputation: 100

Like
0Likes
Like

Posted 25 November 2011 - 10:18 PM


Hey thanks for the reply! :)

I found some other code that helped:

Added this on the camera.cpp:

void CCamera::RotateAroundPoint(CVector3 vCenter, float angle, float x, float y, float z)
{
	CVector3 vNewPosition;			

	// To rotate our position around a point, what we need to do is find
	// a vector from our position to the center point we will be rotating around.
	// Once we get this vector, then we rotate it along the specified axis with
	// the specified degree.  Finally the new vector is added center point that we
	// rotated around (vCenter) to become our new position.  That's all it takes.

	// Get the vVector from our position to the center we are rotating around
	CVector3 vPos = m_vPosition - vCenter;

	// Calculate the sine and cosine of the angle once
	float cosTheta = (float)cos(angle);
	float sinTheta = (float)sin(angle);

	// Find the new x position for the new rotated point
	vNewPosition.x  = (cosTheta + (1 - cosTheta) * x * x)		* vPos.x;
	vNewPosition.x += ((1 - cosTheta) * x * y - z * sinTheta)	* vPos.y;
	vNewPosition.x += ((1 - cosTheta) * x * z + y * sinTheta)	* vPos.z;

	// Find the new y position for the new rotated point
	vNewPosition.y  = ((1 - cosTheta) * x * y + z * sinTheta)	* vPos.x;
	vNewPosition.y += (cosTheta + (1 - cosTheta) * y * y)		* vPos.y;
	vNewPosition.y += ((1 - cosTheta) * y * z - x * sinTheta)	* vPos.z;

	// Find the new z position for the new rotated point
	vNewPosition.z  = ((1 - cosTheta) * x * z - y * sinTheta)	* vPos.x;
	vNewPosition.z += ((1 - cosTheta) * y * z + x * sinTheta)	* vPos.y;
	vNewPosition.z += (cosTheta + (1 - cosTheta) * z * z)		* vPos.z;

	// Now we just add the newly rotated vector to our position to set
	// our new rotated position of our camera.
	m_vPosition = vCenter + vNewPosition;
}

Then in the main.cpp I added the key states:

// We made 2 changes from the Camera2 tutorial.  Instead of gCamera.RotateView()
	// we use our new RotateAroundPoint() function.  We pass in the camera's view
	// point.  This will be the point that we rotate our camera position around.
	
	if(GetKeyState(VK_LEFT) & 0x80) {			// If we hit the LEFT arrow key

		// We want to rotate around the Y axis so we pass in a positive Y speed
		g_Camera.RotateAroundPoint(g_Camera.m_vView, kSpeed, 0, 1, 0);	
	}

	if(GetKeyState(VK_RIGHT) & 0x80) {			// If we hit the RIGHT arrow key

		// Use a negative Y speed to rotate around the Y axis
		g_Camera.RotateAroundPoint(g_Camera.m_vView, -kSpeed, 0, 1, 0);	
	}

The only problem is that I added in the RenderScene() function
 gPlayer.DrawPlayer();  	
   glTranslatef(g_Camera.m_vView.x, 0, g_Camera.m_vView.z);

However as you see above I have a player class, so I'm not so sure how to point glTranslatef to only the player..:( at the moment it compiles but the whole world turns around weirdly :(

Netalie xxx



#4 Melanikus   Members   -  Reputation: 100

Like
0Likes
Like

Posted 26 November 2011 - 02:22 AM

Well, OpenGL has a built in matrix stack it's quite simple to use for your particular case actually :

Let's say you want to translate a cube to +X and a sphere to -X you would do


glPushMatrix(); // Stores the current matrix
glTranslatef(+X,0.0f,0.0f);
drawMyCube(); // glTranslate Only applies to this draw code
glPopMatrix() // Restores the previous matrix

glPushMatrix(); // Stores the current matrix
glTranslatef(-X,0.0f,0.0f);
drawMySphere(); // glTranslate Only applies to this draw code
glPopMatrix() // Restores the previous matrix


So, when you push your matrix, you save your previous matrix (if any) then you can have a new matrix, do whatever transformations you want with it and then pop the previous matrix (if any), between push/pop you can transform/draw anything without interfering with transformations outside it, pretty simple right?

So, you should:

PositionYourCamera();
DrawYourWorld();

glPushMatrix();
glTranslatefv(playerPositionVector);
drawPlayer();
glPopMatrix();

Your camera is kinda strange, camera classes usually output a matrix, but allright, good luck.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS