gpt4 book ai didi

c++ - 你如何找到四个顶点之间的点的 Y 位置? HLSL

转载 作者:行者123 更新时间:2023-11-27 23:03:21 25 4
gpt4 key购买 nike

假设一个游戏有一个网格地形,由两个三角形组成的图 block 组成 - 由四个顶点组成。我们如何找到四个顶点之间的点的 Y(向上)位置?

Terrain

我试过这个:

float diffZ1    = lerp(heights[0], heights[2], zOffset);
float diffZ2 = lerp(heights[1], heights[3], zOffset);
float yPosition = lerp(diffZ1, diffZ2, xOffset);

其中 z/yOffset 是相对于图 block 第一个顶点的 z/y 偏移量,以百分比/100 表示。这适用于平坦表面,但在崎岖不平的地形上效果不佳。

我认为这与由三角形构成的地形有关,上面的内容可能适用于平面。我不确定,但有人知道出了什么问题吗?

这可能更好地解释这里发生了什么:

enter image description here

在上面的代码中,“heights[]”是一个包含周围顶点 v0-3 的 Y 坐标的数组。三角形 1 由顶点 0、2 和 1 组成。三角形 2 由顶点 1、2 和 3 组成。

当它的 x,y 坐标位于 v0-3 之间时,我希望找到 p1 的坐标 Y。

所以我尝试通过这个函数确定点在哪个三角形之间:

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);
}

这没有给我预期的结果

然后我试图找到每个三角形内点 p1 的 y 坐标:

// 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;
}

使用以下方法找到正确的三角形:

if((1.0f - xOffset) <= zOffset)
inTri1 = true;

并且更正上面的代码以使用正确的交叉函数似乎已经解决了问题。

enter image description here

最佳答案

因为你的4个顶点可能不在一个平面上,你应该分别考虑每个三角形。首先找到该点所在的三角形,然后使用以下 StackOverflow 讨论来求解 Z 值(注意坐标轴的不同命名)。我个人更喜欢 DanielKO 的回答,但公认的答案也应该有效:

Linear interpolation of three 3D points in 3D space


编辑:对于问题的第二部分(找到该点所在的三角形):因为您的图 block 在 xz 平面上的投影(如您定义的坐标)是完美的正方形,所以找到该点所在的三角形是一个非常简单的操作。在这里,我将使用术语左-右来指代 x 轴(从较低的 x 值到较高的 x 值)和 bottom-top 来指代 z 轴(从较低的 z 值到较高的 z 值)。

每个图 block 只能以两种方式之一进行分割。 (A) 通过从左下角到右上角的对角线,或 (B) 通过从右下角到左上角的对角线。

  • 对于任何拆分为 A 的图 block :检查 x' > z',其中 x' 是图 block 边缘到点的距离,z' 是图 block 边缘的距离瓷砖到点。如果 x' > z' 那么你的点在右下角的三角形中;否则它在左上角的三角形中。

  • 对于任何被拆分为 B 的图 block :检查是否 x"> z',其中 x"是图 block 边缘到该点的距离,z' 是从图 block 的底部边缘到该点的距离。如果 x"> z' 那么你的点在左下角的三角形中;否则它在右上角的三角形中。

(小注:以上我假设您的图 block 未在 xz 平面中旋转;即它们与轴对齐。如果这不正确,只需旋转它们以使其与轴对齐,然后再进行上述检查。 )

关于c++ - 你如何找到四个顶点之间的点的 Y 位置? HLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25596861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com