gpt4 book ai didi

math - 如何将光线平面交点转换为重心坐标?

转载 作者:行者123 更新时间:2023-12-04 07:01:27 24 4
gpt4 key购买 nike

我的问题:

如何获取两个 3D 点并将它们锁定到一个轴上?例如,使它们的两个 z 轴都为 0。

我想做什么:

我在场景中有一组 3D 坐标,代表一个上面有金字塔的盒子。我还有一个相机,由另一个 3D 坐标表示。我从场景坐标中减去相机坐标并对其进行归一化,返回一个指向相机的向量。然后我与相机点后面的平面进行光线平面相交。

O + tD

其中 O(原点)是相机位置,D 是从场景点到相机的方向,t 是光线从相机点与平面相交所需的时间。

如果这没有意义,这是一张粗略的图:

Crude drawing

我已经搜索了很远很远,据我所知,这被称为使用“针孔相机”。

问题不在于我的相机旋转,我已经消除了它。问题在于将交点转换为重心 (uv) 坐标。

x 轴上的平移如下所示:
uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d;

虽然 z 轴上的平移如下所示:
uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d;

我的问题是:如何将射线平面交点转换为 x 轴和 z 轴上的重心坐标?

最佳答案

直线上点 (p) 的常用公式,从 (p0) 开始,矢量方向 (v) 是:

p = p0 + t*v

包含 (p1) 和法线 (n) 的平面上的点 (p) 的判据是:
(p - p1).n = 0

因此,即插即用:
(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0

-> t = (p1-p0).n / v.n
-> p = p0 + ((p1-p0).n / v.n)*v

去检查:
(p - p1).n = (p0-p1).n + ((p1-p0).n / v.n)*(v.n)
= (p0-p1).n + (p1-p0).n
= 0

如果要将 Z 坐标固定为特定值,则需要选择沿 Z 轴的法线(这将定义一个平行于 XY 平面的平面)。

然后,你有:
n = (0,0,1)

-> p = p0 + ((p1.z-p0.z)/v.z) * v
-> x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y)

最后,如果你想为 3D 计算机图形构建一个虚拟的“相机”,做这种事情的标准方法是 homogeneous coordinates .最终,使用齐次坐标比我上面写的那种特别的 3D 矢量代数更简单(通常更快)。

关于math - 如何将光线平面交点转换为重心坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773676/

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