1

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

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.

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

4

1 回答 1

0

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

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

    }
于 2013-01-24T17:41:34.333 回答