2012-12-30 53 views
0

我正在嘗試關注計算機圖形學的這門課,但我被困在作業1.我不明白矢量eyeup的作用。作業描述可以找到in this link,也有第一個作業的骨架。計算機圖形學中的變換

到目前爲止,我有以下代碼:

// Transform.cpp: implementation of the Transform class. 


#include "Transform.h" 

//Please implement the following functions: 

// Helper rotation function. 
mat3 Transform::rotate(const float degrees, const vec3& axis) { 
    // Please implement this. 
    float radians = degrees * M_PI/180.0f; 
    mat3 r1(cos(radians)); 
    mat3 r2(0, -axis.z, axis.y, axis.z, 0, -axis.x, -axis.y, axis.x, 0); 
    mat3 r3(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z, 
      axis.x*axis.y, axis.y*axis.y, axis.y*axis.z, 
      axis.x*axis.z, axis.z*axis.y, axis.z*axis.z); 
    for(int i = 0; i < 3; i++){ 
     for(int j = 0; j < 3; j++){ 
      r2[i][j] = r2[i][j]*sin(radians); 
      r3[i][j] = r3[i][j]*(1-cos(radians)); 
     } 
    } 
    return r1 + r2 + r3; 
} 

// Transforms the camera left around the "crystal ball" interface 
void Transform::left(float degrees, vec3& eye, vec3& up) { 
    eye = eye * rotate(degrees, up); 
} 

// Transforms the camera up around the "crystal ball" interface 
void Transform::up(float degrees, vec3& eye, vec3& up) { 
    vec3 newAxis = glm::cross(eye, up); 
} 

// Your implementation of the glm::lookAt matrix 
mat4 Transform::lookAt(vec3 eye, vec3 up) { 
    return lookAtMatrix; 
} 

Transform::Transform() 
{ 

} 

Transform::~Transform() 
{ 

} 

它似乎是在做正確的事情,這就是,左右旋轉y軸的對象left方法(其實我不知道如果物體正在移動,或者我正在移動的是相機,有人可以澄清?)。

up方法我不能讓它的工作將圍繞X軸旋轉對象(或相機?)(至少這是我認爲)。

最後,我不明白lookAt方法應該做什麼。

有人可以幫助我理解要執行的操作嗎? 有人能解釋什麼是載體eyeup的作用?

+0

大概'eye'是一個向量,它定義了查找的方向,'up'通常是一個幫助「相機」的向量,或者任何正在轉換的向量。否則,物體可以自由地圍繞眼軸旋轉,這對於許多應用來說是不自然的。 – Skurmedel

+0

因此,物體一旦位於特定的位置,我只需要移動「眼睛」和「向上」矢量? – BRabbit27

回答

2

查看轉換通常使用「查看」功能實現。這個想法是,你指定了攝像機的位置,它正在尋找什麼方向,以及你的特定空間中「向上」的方向,並且你得到一個代表該變換的矩陣。

它看起來像你試圖實施某種「旋轉球」導航控制。這很簡單 - 水平運動應該圍繞「Y」軸旋轉,垂直運動應該繞「右」(或X)軸旋轉。一般來說,這些旋轉是圍繞當前的視圖軸而非全局進行的,因此移動很直觀。我不確定你在那裏尋找什麼。

查看功能的工作原理如下。

表示旋轉的3x3矩陣可以看作是由您正在轉換的空間的3個垂直單位軸組成。所以如果你可以提供這些矢量,你可以建立矩陣。

第一軸很容易。攝像機通常被定位爲沿着「Z」方向觀看,所以如果從攝像機位置獲取代表被觀察物體方向的矢量,然後對其進行標準化,這就是Z軸。

然後,您需要定義一個不同的'向上'向量 - (0,1,0)是典型的,但在Z軸指向相同方向的情況下,您需要選擇不同的向量。

這個'向上'向量和'Z'軸的叉積給出了'X'軸 - 這是因爲叉積給出了一個垂直向量,而構成水平面的部分將垂直於'向前'方向和'向上'。

然後,'X'和'Z'軸的叉積給出'Y'軸(它不一定與'Y'軸相同 - 考慮朝向天花板或朝向地板看)。

這三個軸歸一化後,直接形成一個旋轉矩陣(x,y,z)。

矩陣的平移部分通常是攝像機的位置,通過旋轉的逆變換(使得當通過查看矩陣本身變換攝像機位置時,它應該最終返回原點)。

+0

你是什麼意思「當前視圖軸」和「全局」。在全球範圍內,XYZ軸的原點位於0,0,0? – BRabbit27

+0

我的意思是說,您可能正在尋找圍繞其自己的Y軸而不是世界Y軸旋轉相機。如果攝像機在側面,那麼圍繞世界Y軸旋轉將是不直觀的。 – JasonD

+0

仍然我錯過了一些東西。 「旋轉」方法只是將公式應用於3D旋轉,不是嗎?然後,對於'left'方法,當我寫'eye = eye * rotate(degrees,up)'時,意味着我要繞着上軸旋轉矢量'eye'?這是否正確,我的意思是我應該那樣做?或者我應該先創建新的xyz軸?或者是眼睛,實際上我的xy軸? – BRabbit27

0

1)您的課程使用OpenGL庫,您的家庭作業是填寫骨架模塊「Transform.cpp」。

2)你問的方法是 「MAT4變換::的lookAt(VEC 3眼,VEC 3上)」:

lookAt:最後,你需要在變換矩陣編碼,給出 眼睛和向量。您可能需要參考 注意事項來完成此操作。這可能有助於定義一個高位座標系 (作爲3個矢量),並建立一個輔助的4×4矩陣M,該矩陣M是由此函數返回的 。請參考課堂筆記和 這部分的講座。

3)提示這兩個參數「眼睛」和「上」的意思應該在你的課堂筆記和講座中。 4)另一個提示是「定義一個uvw座標系(作爲三個向量),並建立一個輔助的4x4矩陣......結果返回......」。

5)最後提示:

問:什麼是OpenGL的MAT3和MAT4的區別?

答: What extractly mat3(a mat4 matrix) statement in glsl do?

mat3(MVI) * normal

返回從4×4矩陣的上3×3矩陣和乘以 正常通過。這個矩陣被稱爲'正常矩陣'。您使用 這將您的法線從世界空間帶到眼睛空間。

之所以原來矩陣是4x4和3x3的不就是因爲4×4矩陣 讓你做仿射變換,幷包含透視渲染有用 信息。但要從世界 空間到正常空間,您只需要3x3模型視圖矩陣。