2015-04-04 70 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

相關問題