平面公式,射线公式学习总结

平面公式:n · (p - p0) = 0

pp0必须均位于同一平面,且n为此平面的法向量。

平面公式:n · p + d = 0

平面公式转换式:d = -n · p


由平面公式可知:

如果d = 0,则点p位于当前平面上。

如果d > 0,则点p位于当前平面前方,并处于平面的正半区域。

如果d < 0,则点p位于当前平面后方,并处于平面的负半区域。

如果平面法向量n的模为1,则 n · p + d 就等于该平面到点p的最短有符号距离。


射线公式:p(t) = p0 + tu

p0为射线起始点向量,t为标量,u为射线方向。


给定射线 p(t) = p0 + tu 和平面 n · p + d = 0,求该射线是否与平面相交以及交点的位置。此时可以将射线代入平面方程,并求解满足平面方程的参数t,这样就求出能够产生交点的参数的范围。

n · p(t) + d = 0 
n · (p0 + tu) + d = 0 
n · p0 + n ·tu + d = 0 
n · tu = -d - (n ·p0)
t = (-d - (n ·p0)) / (n ·u)


t不在区间[0, ∞]内,则射线与平面不相交。

t位于区间[0,]内,可t带入射线方程,则可求得交点:

p((-d -(n · p0)) / (n · u)) = p0 + ((-d -(n · p0)) / (n · u)) · u

### Cesium 中计算平面射线交点 在三维图形学中,求解射线平面之间的交点是一个常见的几何运算。对于Cesium而言,可以通过创建相应的数学模型来完成这一任务。 为了实现这一点,在Cesium中有两种主要方法: #### 使用 `Intersect` 函数 可以直接利用Cesium库提供的静态函数来进行射线平面的相交测试。具体来说就是调用 `Cesium.IntersectionTests.rayPlaneIntersectionPoint()` 来获取交点位置[^1]。 ```javascript // 定义一个平面法向量以及平面上的一点作为参考点 var planeNormal = new Cesium.Cartesian3(0, 0, 1); var pointOnPlane = new Cesium.Cartesian3(0, 0, 0); // 创建一个表示给定方向上的无限延伸直线(即射线) var origin = new Cesium.Cartesian3(-5, -5, 5); var direction = new Cesium.Cartesian3.normalize( Cesium.Cartesian3.subtract(new Cesium.Cartesian3(5, 5, -5), origin, new Cesium.Cartesian3()), new Cesium.Cartesian3() ); var ray = new Cesium.Ray(origin, direction); // 执行射线平面相交检测,并获得交点坐标 var intersectionPoint = Cesium.IntersectionTests.rayPlaneIntersectionPoint(ray, planeNormal, pointOnPlane); console.log('Intersection Point:', intersectionPoint); ``` 此代码片段展示了如何定义一条射线及其目标平面,之后通过调用 `rayPlaneIntersectionPoint` 方法找到它们之间可能存在的唯一交点。 #### 自定义算法实现 如果需要更灵活的操作,则可以根据基本原理自行编写逻辑。这通常涉及到解析几何的知识,比如先判断是否有交集,如果有则进一步计算具体的交点位置[^2]。 ```javascript function getRayPlaneIntersection(rayOrigin, rayDirection, planePoint, planeNormal) { let denom = Cesium.Cartesian3.dot(planeNormal, rayDirection); if (!denom) { // 如果分母接近于零说明平行无交点 return undefined; } const t = Cesium.Cartesian3.dot(Cesium.Cartesian3.subtract(planePoint, rayOrigin, new Cesium.Cartesian3()), planeNormal) / denom; if (t >= 0) { return Cesium.Cartesian3.add(rayOrigin, Cesium.Cartesian3.multiplyByScalar(rayDirection, t, new Cesium.Cartesian3()), new Cesium.Cartesian3()); } else { return undefined; // 负数意味着反向延长线上才有交点 } } const customIntersectionResult = getRayPlaneIntersection( new Cesium.Cartesian3(-5, -5, 5), new Cesium.Cartesian3(1/Math.sqrt(3), 1/Math.sqrt(3), -1/Math.sqrt(3)), new Cesium.Cartesian3(0, 0, 0), new Cesium.Cartesian3(0, 0, 1) ); console.log('Custom Intersection Result:', customIntersectionResult); ``` 这段自定义函数实现了相同的功能——寻找指定射线同特定平面间的交叉点。它首先检查是否存在有效解决方案,接着基于矢量代数公式得出确切的位置信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值