私は、透視平面の距離が1,000,000,000
であると定義すると、その範囲内のすべてのオブジェクトが切り取られます。 100,000,000
の範囲で正常に動作します。 誰でもこれを説明できますか?つまり、それでも浮動小数点の最大値は近似しません。または私はこれに間違っていますか?遠近法を計算するために私はGLMライブラリを使用します。固定されたパイプライン剛性はありません。OpenGL Far Planeが非常に大きな値のクリップをすべて与えた
UPDATE:(JAVA) パースペクティブ行列計算:
public static Mat4 perspective(float fovy, float aspect, float zNear, float zFar) {
float range = (float) (Math.tan(Math.toRadians(fovy/2.0f)) * zNear);
float left = -range * aspect;
float right = range * aspect;
float bottom = -range;
float top = range;
Mat4 res = new Mat4(0.0f);
res.matrix[0] = (2.0f * zNear)/(right - left);
res.matrix[5] = (2.0f * zNear)/(top - bottom);
res.matrix[10] = -(zFar + zNear)/(zFar - zNear);
res.matrix[11] = -1.0f;
res.matrix[14] = -(2.0f * zFar * zNear)/(zFar - zNear);
return res;
}
私は質問を理解してますが、単精度浮動小数点が7桁の上に少しを表現できるわけではありません。あなたの番号は10桁ですので、最後の3桁の座標だけが「同じ」です。したがって、999,999,950がクリップされる可能性があります。それはあなたが不思議なことですか? – Damon
丸めの問題などのような音がします。もちろん、浮動小数点の範囲を超えません(32ビットのint範囲を超えない)。しかし、このような大きな数で割るとすべてが0になる可能性があります。同様に、行列の計算中に「near + far」や「near-far」のようにこの数に非常に小さな数を加えると、変更しないでください。これがマトリックスの計算にどのように影響するかを分析する必要があります。 –
答えをありがとう。しかし、あなたの上の男は、反対を言った。 –