java - 获取三角形中任意点的位置

标签 java opengl geometry

我定义了一个包含 3 个点的三角形。

坐标系定义如下:

  • X 轴向右移动
  • Y 轴朝上
  • Z 轴超出了我的屏幕

这是 OpenGL 中最常用的坐标系(我认为)。 现在我得到了我的三角形。每个点的X和Z值都不同。 我需要通过给出 X 和 Z 坐标来找到三角形上的 Y 坐标。 有人编写了这个方法并将其称为 barryCentric(Point a, Point b, Point c, Point pos) (我很确定他的意思是“baryCentric”,但是很好。

 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 值,所以我想这不是我想要的。

最佳答案

这个方法很有道理,它是 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;

关于java - 获取三角形中任意点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40789305/

相关文章:

css - 带尖边和阴影的按钮

java - 使用流在 Java 8 中按 Map 值分组

java - 如何在JAVA中快速读取文件中的double

c++ - OpenGL - 如何将仿射变换函数与程序中的事件连接起来

c++ - 最新的 OpenGL 应用程序是否必须使用 GLEW?

c++ - 旋转球形点系统

java - 如何扩展由另一个类实例化的 java 类?

Java 流 : group a List into a Map of Maps

c++ - OpenGL 漫反射照明计算错误

algorithm - 多边形的压缩表示