在 Unity (hlsl) 的着色器中,我正在寻找一种将矢量(float3 或 float4)投影到给定平面法线方向的平面上的方法。我需要的是与 Unity 的 Vector3.ProjectOnPlane 函数等效的东西: https ://docs.unity3d.com/ScriptReference/Vector3.ProjectOnPlane.html
问问题
1284 次
1 回答
1
如果您的平面法线向量已归一化:
inline float3 projectOnPlane( float3 vec, float3 normal )
{
return vec - normal * dot( vec, normal );
}
如果不是:
inline float3 projectOnPlane( float3 vec, float3 normal )
{
return vec - normal * ( dot( vec, normal ) / dot( normal, normal ) );
}
相同的公式,取决于 GPU 型号和驱动程序版本,可能更快或更慢:
inline float3 projectOnPlane( float3 v, float3 n )
{
float3 r;
r.x = n.y * n.y * v.x + n.z * n.z * v.x - n.x * n.y * v.y - n.x * n.z * v.z;
r.y = n.x * n.x * v.y - n.x * n.y * v.x - n.y * n.z * v.z + n.z * n.z * v.y;
r.z = n.x * n.x * v.z - n.x * n.z * v.x + n.y * n.y * v.z - n.y * n.z * v.y;
return r / dot(n, n);
}
于 2018-09-23T23:44:44.940 回答