计算一条3d空间直线和一个3d空间平面的交点
原理请见前一篇文章:
http://www.cnblogs.com/vilyLei/articles/2191514.html
这里给出的所有算法都不依赖于语言,而是基于几何原理的。
基于as3的实现代码如下 :
//
/**
计算一条3d空间直线和一个3d空间平面的交点
@param pnv 空间平面的法线的单位矢量
@param pd 空间平面的参数距离,平面的方程为: pnv.dot( pv ) = pd
@param ltv 空间直线的方向(切向)单位矢量
@param lv 空间直线上的一点
@param outV 计算后得到的位于平面上的交点坐标
*/
public function planeAndSLIntersectionV(pnv:Vector3D,pd:Number,ltv:Vector3D,lv:Vector3D,outV:Vector3D):void{
var dis:Number = pnv.dotProduct( lv ) - pd;
//
outV.x = ltv.x * 1000 + lv.x;
outV.y = ltv.y * 1000 + lv.y;
outV.z = ltv.z * 1000 + lv.z;
var td:Number = pnv.dotProduct( outV ) - pd;
var k:Number = dis / (dis - td);
outV.x -= lv.x;
outV.y -= lv.y;
outV.z -= lv.z;
outV.x *= k;
outV.y *= k;
outV.z *= k;
outV.x += lv.x;
outV.y += lv.y;
outV.z += lv.z;
}
/**
计算一条3d空间直线和一个3d空间平面的交点
@param pnv 空间平面的法线的单位矢量
@param pd 空间平面的参数距离,平面的方程为: pnv.dot( pv ) = pd
@param ltv 空间直线的方向(切向)单位矢量
@param lv 空间直线上的一点
@param outV 计算后得到的位于平面上的交点坐标
*/
public function planeAndSLIntersectionV(pnv:Vector3D,pd:Number,ltv:Vector3D,lv:Vector3D,outV:Vector3D):void{
var dis:Number = pnv.dotProduct( lv ) - pd;
//
outV.x = ltv.x * 1000 + lv.x;
outV.y = ltv.y * 1000 + lv.y;
outV.z = ltv.z * 1000 + lv.z;
var td:Number = pnv.dotProduct( outV ) - pd;
var k:Number = dis / (dis - td);
outV.x -= lv.x;
outV.y -= lv.y;
outV.z -= lv.z;
outV.x *= k;
outV.y *= k;
outV.z *= k;
outV.x += lv.x;
outV.y += lv.y;
outV.z += lv.z;
}
////