假設有一個由兩個由三個頂點構成的瓷磚組成的遊戲的網格地形。我們如何找到四個頂點之間的Y(上)位置?如何找到四個頂點之間的Y點? HLSL
我已經試過這樣:
float diffZ1 = lerp(heights[0], heights[2], zOffset);
float diffZ2 = lerp(heights[1], heights[3], zOffset);
float yPosition = lerp(diffZ1, diffZ2, xOffset);
其中Z/Y偏移是z/y的百分比/ 100瓦的第一個頂點這適用於平坦的表面,但不能抵消在顛簸的地形上如此之好。
我想這與三角形的地形有關,上面的三角形可能在平面上工作。我不確定,但有人知道發生了什麼問題嗎?
這可以更好地解釋什麼是怎麼回事:
在上面的代碼「高度[]」是Y的陣列的周圍頂點座標v0-3。 三角1由頂點0,2和1。 三角2由頂點1,2和3
我希望能夠找到座標P1 Y的時,其x,y座標v0-3之間鋪設的。
所以我試圖確定的一點是通過這個函數三角:
bool PointInTriangle(float3 pt, float3 pa, float3 pb, float3 pc)
{
// Compute vectors
float2 v0 = pc.xz - pa.xz;
float2 v1 = pb.xz - pa.xz;
float2 v2 = pt.xz - pa.xz;
// Compute dot products
float dot00 = dot(v0, v0);
float dot01 = dot(v0, v1);
float dot02 = dot(v0, v2);
float dot11 = dot(v1, v1);
float dot12 = dot(v1, v2);
// Compute barycentric coordinates
float invDenom = 1.0f/(dot00 * dot11 - dot01 * dot01);
float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
// Check if point is in triangle
return (u >= 0.0f) && (v >= 0.0f) && (u + v <= 1.0f);
}
這不是給我,結果我的預期
話,我想找到的y座標每個三角形內點p1:
// Position of point p1
float3 pos = input[0].PosI;
// Calculate point and normal for triangles
float3 p1 = tile[0];
float3 n1 = (tile[2] - p1) * (tile[1] - p1); // <-- Error, cross needed
// = cross(tile[2] - p1, tile[1] - p1);
float3 p2 = tile[3];
float3 n2 = (tile[2] - p2) * (tile[1] - p2); // <-- Error
// = cross(tile[2] - p2, tile[1] - p2);
float newY = 0.0f;
// Determine triangle & get y coordinate inside correct triangle
if(PointInTriangle(pos, tile[0], tile[1], tile[2]))
{
newY = p1.y - ((pos.x - p1.x) * n1.x + (pos.z - p1.z) * n1.z)/n1.y;
}
else if(PointInTriangle(input[0].PosI, tile[3], tile[2], tile[1]))
{
newY = p2.y - ((pos.x - p2.x) * n2.x + (pos.z - p2.z) * n2.z)/n2.y;
}
使用下面找到第e正確的三角形:
if((1.0f - xOffset) <= zOffset)
inTri1 = true;
而糾正上面的代碼使用正確的交叉函數似乎已經解決了這個問題。
因此,如果您的座標位於第一個或第二個三角形的內部,這很重要嗎? – usr2564301 2014-08-31 22:28:27
如果你使用'xOffset'等變量定義了四個頂點,這將更加清晰,特別是,如何從四個頂點創建兩個三角形?兩個三角形之間是否共享兩個頂點? – aecolley 2014-08-31 22:31:40
是,兩個頂點是共享的,我有點理解爲什麼它不起作用,因爲有兩個三角形而不是一個扁平的正方形。我應該按照三角形檢查它嗎? – 2014-08-31 22:41:28