- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设一个游戏有一个网格地形,由两个三角形组成的图 block 组成 - 由四个顶点组成。我们如何找到四个顶点之间的点的 Y(向上)位置?
我试过这个:
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 表示。这适用于平坦表面,但在崎岖不平的地形上效果不佳。
我认为这与由三角形构成的地形有关,上面的内容可能适用于平面。我不确定,但有人知道出了什么问题吗?
这可能更好地解释这里发生了什么:
在上面的代码中,“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;
并且更正上面的代码以使用正确的交叉函数似乎已经解决了问题。
最佳答案
因为你的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/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!