在我的项目中,我通过将法线应用于模型矩阵来给对象赋予方向。我的模型矩阵是缩放,旋转和平移矩阵的乘积。
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);
每次更新对象时,都会计算模型矩阵。但正因为如此,我正在失去对象的方向,因为旋转矩阵不包含有关方向的信息。此外,当我将法线应用于模型矩阵时,对象会失去其比例。
方向的向上矢量是地形的法线,因此覆盖一个轴。另外两个可以使用交叉乘积计算。对象面向方向(前进)和地形正常(正常)。由于叉积产生一个垂直于两个向量的向量,我可以计算出右向量。
我尝试将上述解决方案应用于旋转矩阵,但它给出了错误的结果。 如何将法线应用于旋转矩阵?
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.
整个问题是为什么应用法向旋转矩阵不会给出相同的结果
答案 0 :(得分:0)
Stave H评论让我知道我做错了什么。 在我的情况下,旋转矩阵包含没有倾斜的2D旋转! 添加其他矩阵后,一切正常。
public void Update()
{
ModelMatrix = scaleMatrix * (orientationMatrix * rotateMatrix) * translateMatrix;
}