2015-04-04 45 views
0

我开始一个3D场景,我正在研究“照相机”的运动,或者移动的实体,但我似乎无法获得它朝着它所面对的方向移动。如何在照相机的方向移动,OpenGL,C++

Example

有谁有关于如何我开始在摄像头的方向移动任何指导?不过,我只希望实体沿着x轴和z轴移动,就好像它在地板上一样,现在y轴将被忽略。如果有人能告诉我什么是数学,那真的很感激。

Camera::Camera(Vector3 * eye, Vector3 * center, Vector3 * up) { 
    this->eye = eye; 
    this->center = center; 
    this->up = up; 
} 

Camera::Vector3 * getEye() { return eye; } 
Camera::Vector3 * getCenter() { return center; } 
Camera::Vector3 * getUp() { return up; } 



camera = new Camera(new Vector3(5.0f, 3.0f, 5.0f), 
    new Vector3(0.0f, 0.0f, 0.0f), 
    new Vector3(0.0f, 1.0f, 0.0f)); 


gluLookAt(camera->eye->getX(), camera->eye->getY(), camera->eye->getZ(), 
      camera->center->getX(), camera->center->getY(), camera->center->getZ(), 
      camera->up->getX(), camera->up->getY(), camera->up->getZ());//camera 
+0

我不明白你的眼睛是什么,中心矢量代表。你可以发布你在哪里使用gluLookat()函数? – 2015-04-04 22:31:05

+0

你说得对,我不明白什么是什么。我们被给了一个片段,并被告知要适应。调用lookat函数的行也在上面。此刻,我正在操纵这些值来移动相机,并翻译对象的位置 – user 2015-04-04 22:47:06

+0

好吧,以便您的相机位置是eyeVector和您的lookatPosition是centerVector – 2015-04-04 22:52:39

回答

2

背后的数学很简单。首先需要2个vec3(一个用于摄像头位置,另一个用于lookat位置)

我假设你的向量是(0,1,0)。因此,计算应该是这样的:

vec3 lookatPosition; 
vec3 cameraPosition; 
vec3 upVector(0,1,0); 
float movementSpeed; 


vec3 forwardVector = lookatPosition - cameraPosition; 

//You can generate like that if you don't have operator overload 
//forwardVector.x = lookatPosition.x - cameraPosition.x; 
//forwardVector.y = lookatPosition.y - cameraPosition.y; 
//forwardVector.z = lookatPosition.z - cameraPosition.z; 

forwardVector.normalise() // normalise your vector 



//moving forward : 
cameraPosition += forwardVector * movementSpeed; 
lookatPosition += forwardVector * movementSpeed; 

//Again you can do the operation like that if you don't have operator overloading 
//cameraPosition.x += forwardVector.x * movementSpeed; 
//cameraPosition.y += forwardVector.y * movementSpeed; 
//cameraPosition.z += forwardVector.z * movementSpeed; 

//moving backward : 
cameraPosition -= forwardVector * movementSpeed; 
lookatPosition -= forwardVector * movementSpeed; 

//moving left : 
vec3 leftVector = Crossproduct(upVector,forwardVector); 
cameraPosition += leftVector * movementSpeed; 
lookatPosition += leftVector * movementSpeed; 


//moving right : 
vec3 rightVector = Crossproduct(forwardVector,upVector); 
cameraPosition += rightVector * movementSpeed; 
lookatPosition += rightVector * movementSpeed; 

注:数据类型和函数名不建,你可以实现自己的数据类型或使用GLM的载体。

+0

嗨,谢谢!我会给这个镜头。前三个Vector3s是否与我原始文章中的3个矢量相对应?如果你可以重新检查我原来的帖子,这将是非常有用 – user 2015-04-04 22:26:25

+0

有什么特别的,我应该需要额外的这条线? camera-> forwardVector = camera-> position - camera-> lookat; 因为这是给我一个错误。如果你要求gluLookAt()函数,你的参数没问题,我不认为我可以从另一个vector3减去vector3 – user 2015-04-04 23:13:13

+0

。 – 2015-04-04 23:20:45

3

你也可以直接从你的视图矩阵中提取你的视图矢量 - 你在渲染场景本身之前应用的视图矢量。

OpenGL的模型/视图矩阵如下所示:

|lx,ux,vx,px|  -- lx,ly,lz is your left-vector 
|ly,uy,vy,py|  -- ux,uy,uz is your up-vector 
|lz,uz,vz,pz|  -- vx,vy,vz is your view-vector 
|0 ,0 ,0 ,1 |  -- px,py,pz is your translation 

通过获得简单提取您的观点载体:

vx = matrix[2]; 
vy = matrix[6]; 
vz = matrix[10]; 

我通常做这个,我转动我的相机,以便后运用运动。在继续与他们进行数学计算之前,对这些矢量进行归一化是一种很好的做法。

+0

你刚刚救了我:D – behzad 2017-06-18 18:15:37

相关问题