2013-05-26 2 views
0

Имея камеру, расположенную в 3D кубе в display:Перемещения камеры относительно перспективного направления в gluLookAt

public void display(GLAutoDrawable drawable) { 
    ... 
    glu.gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); 
    ... 
} 

Камера взгляд на точке - (centerX, centerY, centerZ).

Я хочу переместить его относительно его направления (вперед, назад, вправо, влево).

Какова операция, которую я должен выполнить на телефонах eye и center, чтобы переместить камеру в соответствии с center (для каждой из указанных сторон)?

Edit:

мне не нужна реализация, только концепция.

ответ

0

Если я правильно понял ваш вопрос, сначала необходимо определить точку Vector3D

struct tVector3 // Extended 3D Vector Struct 
{ 
tVector3() {} // Struct Constructor 
tVector3 (float new_x, float new_y, float new_z) // Init Constructor 
{ x = new_x; y = new_y; z = new_z; } 

tVector3 operator+(tVector3 vVector) {return tVector3(vVector.x+x, vVector.y+y, vVector.z+z);} 
tVector3 operator-(tVector3 vVector) {return tVector3(x-vVector.x, y-vVector.y, z-vVector.z);} 
tVector3 operator*(float number) {return tVector3(x*number, y*number, z*number);} 
tVector3 operator/(float number) {return tVector3(x/number, y/number, z/number);} 

float x, y, z; // 3D vector coordinates 
}; 

затем определить, что камера должна делать

void CCamera::Move_Camera(float speed)  //UP AND DOWN 
{ 
tVector3 vVector = mView - mPos; 

mPos.x = mPos.x + vVector.x * speed; 
mPos.z = mPos.z + vVector.z * speed; 
mView.x = mView.x + vVector.x * speed; 
mView.z = mView.z + vVector.z * speed; 
mPos.y = mPos.y + vVector.y * speed; 
mView.y = mView.y + vVector.y * speed; 

} 


void CCamera::Rotate_View(float speed) 
{ 
tVector3 vVector = mView - mPos; // Get the view vector 

mView.z = (float)(mPos.z + sin(speed)*vVector.x + cos(speed)*vVector.z); 
mView.x = (float)(mPos.x + cos(speed)*vVector.x - sin(speed)*vVector.z); 
} 


void CCamera::Strafe_Camera(float speed,bool YAxis) // MOVE LEFT AND RIGHT 
{ 
tVector3 vVector = mView - mPos; // Get the view vector 

tVector3 vOrthoVector; // Orthogonal vector for the view vector 

vOrthoVector.x = -vVector.z; 
vOrthoVector.z = vVector.x; 

mPos.x = mPos.x + vOrthoVector.x * speed; 
mPos.z = mPos.z + vOrthoVector.z * speed; 
mView.x = mView.x + vOrthoVector.x * speed; 
mView.z = mView.z + vOrthoVector.z * speed; 

} 

И в Display()

gluLookAt(objCamera->mPos.x, objCamera->mPos.y, objCamera->mPos.z, 
      objCamera->mView.x, objCamera->mView.y, objCamera->mView.z, 
      objCamera->mUp.x, objCamera->mUp.y, objCamera->mUp.z); 

где MPOS является положение камеры (описано в координатах xyz), mView - это точка, на которую вы смотрите. ObjCamera создается i n initlializeGL();

Надеюсь, это поможет.

+0

Спасибо, можете ли вы описать, что такое операция на 'center' и' eye'? – URL87

+0

Посмотрите на метод Move_Camera (скорость поплавка) (вы должны знать, что vVector - это расстояние между позицией камеры и тем, где она смотрит). Если вам нужно учиться на основах, я бы предложил вам этот http: // www. morrowland.com/apron/tut_gl.php и этот http://nehe.gamedev.net/tutorial/loading_and_moving_through_a_3d_world/22003/ (его C++, но его легко перевести) – Nicola

 Смежные вопросы

  • Нет связанных вопросов^_^