2013-11-24 55 views
0

我一直在試圖讓我生成的幾何圖形與方向矢量對齊。爲了說明我目前的問題是什麼:將幾何圖形對齊到方向矢量

  • A =正確對準幾何形狀(只是用於測試三角形)
  • B =正確對齊幾何

Example of the problem

我當前的代碼解決方案對於這個三角形的例子(這個代碼運行你在屏幕上看到的所有節點,從分割開始,我使用GLM數學庫):

glm::vec3 v1, v2, v3; 

v1.x = -0.25f; 
v1.z = -0.25f; 

v2.x = 0.25f; 
v2.z = -0.25f; 

v3.x = 0.0f; 
v3.z = 0.25f; 

v1.y = 0.0f; 
v2.y = 0.0f; 
v3.y = 0.0f; 

glm::mat4x4 translate = glm::translate(glm::mat4x4(1.0f), sp.position); 
glm::mat4x4 rotate = glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), sp.direction, glm::vec3(0.0f, 1.0f, 0.0f)); 

v1 = glm::vec4(translate * rotate * glm::vec4(v1, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 
v2 = glm::vec4(translate * rotate * glm::vec4(v2, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 
v3 = glm::vec4(translate * rotate * glm::vec4(v3, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 

爲A點的方向矢量值:

  • X 0.000000000浮子
  • ý0.788205445浮子
  • ž0.615412235浮子點B

方向矢量值:

  • x 0.0543831661 float
  • ý0.788205445浮子
  • Ž-0.613004684浮子

編輯1(24/11/2013 @ 20點36分): A和B不具有任何關係,兩者分別生成。當生成A或B時,只知道位置和方向。

我一直在尋找的解決方案張貼在這裏:

但我一直沒能成功地轉動我的幾何形狀與對齊我的方向矢量。我覺得我正在做一些相當基本的錯誤。

任何幫助將不勝感激!

回答

2

如果AB是單位矢量,並且希望的是轉換B以便它與A對準的旋轉矩陣R,然後通過計算C = B x A(的BA叉積)啓動。 C是旋轉軸,arcsin(|C|)是必要的旋轉角度。

從這些你可以建立所需的旋轉矩陣。它看起來像glm支持這個,所以我不會進一步解釋。

NB如果你是做多,性能關鍵代碼的許多信息,您可以通過注意|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)並與sin(theta)cos(theta)這些已知值計算自己的矩陣獲得一點速度。例如,請參閱this discussion。例如glm例程將採用您的角度arcsin(|C|)並立即開始計算其sincos,這是一種小型浪費,因爲您已經知道這些浪費,且操作相對昂貴。

如果旋轉是圍繞某一點p以外的產地,然後讓T是翻譯這需要p到原點,並找到X = T^-1 R T。這X將是你想要的轉換。

+0

這裏的問題是A和B沒有關係,不能以這種方式使用。在A或B點生成三角形時,只知道位置和方向。我將在最上面澄清我的問題,以包括這一點。 – Yonathan

+0

@Yonathan我的朋友,這絕對沒有意義。你必須解釋哪些點和矢量必須翻譯和/或旋轉到其他點和矢量(或等價的變換描述)。 – Gene

+0

在A點或B點生成三角形時,我只有一個平移(位置)和它應該面對的方向。翻譯效果很好,因爲您可以看到三角形都位於深灰點上。較淺的灰線表示臉部應指向的方向。我試圖完成的是在每個灰點上都有這些三角形,面對下一個灰點。這在某些點上會沿着這些正確對齊的點生成幾何圖形。因此,我想生成一個矩陣來正確旋轉這個幾何體的頂點。希望這更有意義。 – Yonathan