在我的项目中,我通过将法线应用于模型矩阵来为对象指定方向。我的模型矩阵是缩放、旋转和平移矩阵的乘积。
p22.Normal.Normalize();
obj.UpVector = p22.Normal;
obj.RightVector = Vector3.Cross(obj.ForwardVector, obj.UpVector);
obj.RightVector = Vector3.Normalize(obj.RightVector);
obj.ForwardVector = Vector3.Cross(obj.UpVector, obj.RightVector);
obj.ForwardVector = Vector3.Normalize(obj.ForwardVector);
每次更新对象时,都会计算模型矩阵。但正因为如此,我失去了对象的方向,因为旋转矩阵不包含有关方向的信息。此外,当我将法线应用于模型矩阵时,对象会失去其比例。
方向的向上向量作为地形的法线,这样就覆盖了一个轴。其他两个可以使用叉积来计算。面向对象的方向(Forward)和地形的法线(Normal)。由于叉积产生一个垂直于两个向量的向量,我可以计算右向量。
我试图将上述解决方案应用于旋转矩阵,但它给出了错误的结果。如何将法线应用于旋转矩阵?
Sample:
Object.Scale(10,new Vector3(1,0,0));
Object.Translate(0,10,10);
Object.Update() is equal to modelMatrix=scaleMatrix*rotationMatrix*translationMatrix;
...
*calculeting normal from highmap*
...
p22.Normal.Normalize();
modelMatrix.UpVector = p22.Normal;
modelMatrix.RightVector = Vector3.Cross(obj.ForwardVector, obj.UpVector);
modelMatrix.RightVector = Vector3.Normalize(obj.RightVector);
modelMatri.ForwardVector = Vector3.Cross(obj.UpVector, obj.RightVector);
modelMatri.ForwardVector = Vector3.Normalize(obj.ForwardVector);
//the scale is lost.
object.Translate(10,10,10)
object.Update(); //orientation applied to model matrix is lost.
整个问题是为什么将法线应用于旋转矩阵不会给出相同的结果