2016-11-24 91 views
0

我的問題如下: 我已經定義了一個三點的三點。獲取任意一點在三角形中的位置

座標系的定義是這樣的:

  • X軸頭向右
  • Y軸頭向上了我的屏幕
  • Z軸頭

這是OpenGL中使用的最常見的座標系(我認爲)。 現在我得到了我的三角形。每個點的X和Z值是不同的。 我需要通過給出X和Z座標來找到我的三角形上的Y座標。 有人寫了這個方法,稱之爲barryCentric(A點,B點,C點點POS)(我敢肯定,他的意思是「重心」,但罰款。

public static float barryCentric(Vector3f p1, Vector3f p2, Vector3f p3, Vector3f pos) { 
     float det = (p2.z - p3.z) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.z - p3.z); 
     float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.y - p3.z))/det; 
     float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.y - p3.z))/det; 
     float l3 = 1.0f - l1 - l2; 
     return l1 * p1.y + l2 * p2.y + l3 * p3.y; 
    } 

我不知道,如果該方法使任何意義,他也使用pos.y值,所以我想這不是我想要的。沒有人知道的算法,可以幫助我與我的問題?

問候,芬蘭人

回答

1

這種方法是有道理的,這是barycentric interpolation的實現 - 程序在這裏找出(x,z)點在三角形中的重心座標 - l1,l2,l3, u,w,v在鏈接頁面中。

但實現包含錯誤 - 你是一個權利,不應該使用未知pos.y.而且,這是無意義的 - 從y減去z。所以改變pos.y pos.z:

float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.z - p3.z))/det; 
    float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.z - p3.z))/det; 
+0

ty偉大的:),這可以幫助我很多! –