物体取向从正常

时间:2013-01-24 15:20:24

标签: math matrix xna algebra

在我的项目中,我通过将法线应用于模型矩阵来给对象赋予方向。我的模型矩阵是缩放,旋转和平移矩阵的乘积。

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.

整个问题是为什么应用法向旋转矩阵不会给出相同的结果

1 个答案:

答案 0 :(得分:0)

Stave H评论让我知道我做错了什么。 在我的情况下,旋转矩阵包含没有倾斜的2D旋转! 添加其他矩阵后,一切正常。

    public void Update()
    {
        ModelMatrix = scaleMatrix * (orientationMatrix * rotateMatrix) * translateMatrix;

    }