我是一名学习DirectX 11的学生。要计算曲面的法向量,我知道我需要得到两个切线向量来计算叉积。但如果有曲面方程,我可以做到。
如果我不知道曲面的方程/公式,我必须用有限差分法得到法向量的近似值。下面的代码来自我正在读的书。
for(UINT i = 1; i < mNumRows-1; ++i)
{
for(UINT j = 1; j < mNumCols-1; ++j)
{
float l = mCurrSolution[i*mNumCols+j-1].y;
float r = mCurrSolution[i*mNumCols+j+1].y;
float t = mCurrSolution[(i-1)*mNumCols+j].y;
float b = mCurrSolution[(i+1)*mNumCols+j].y;
mNormals[i*mNumCols+j].x = -r+l;
mNormals[i*mNumCols+j].y = 2.0f*mSpatialStep;
mNormals[i*mNumCols+j].z = b-t;
XMVECTOR n = XMVector3Normalize(XMLoadFloat3(&mNormals[i*mNumCols+j]));
XMStoreFloat3(&mNormals[i*mNumCols+j], n);
}
}
我不明白为什么值-r+l
和b-t
(y值的差(分别变成法向量的x值和z值。我想知道为什么2.0f * mSpatialStep
也是y值。
导数通过Ft ~ (F(t+step) - F(t-step))/ (2 step)
进行数值估计。观察给定的法向量如何与y = - F(x, z)
(即(Fx, 1, Fz)
(的梯度估计成比例。