私のプロジェクトでは、モデル マトリックスに法線を適用することにより、オブジェクトに方向を与えます。私のモデル マトリックスは、スケーリング、回転、および平行移動マトリックスの積です。
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);
オブジェクトが更新されるたびに、モデル マトリックスが計算されます。しかし、回転行列には方向に関する情報が含まれていないため、オブジェクトの方向が失われています。また、モデル マトリックスに法線を適用すると、オブジェクトのスケールが失われます。
Orientation の Up ベクトルが地形の法線になるため、1 つの軸がカバーされます。他の 2 つは、外積を使用して計算できます。オブジェクトが向いている方向 (前方) と地形の法線 (法線)。外積は両方のベクトルに垂直なベクトルを生成するため、Right ベクトルを計算できます。
上記のソリューションを回転行列に適用しようとしましたが、間違った結果が得られました。回転マトリックスに法線を適用するにはどうすればよいですか?
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.
全体の問題は、回転行列に法線を適用しても同じ結果が得られない理由です