正射投影カメラを使用して、モデルのスライスをレンダリングしています(ボクセル化するため)。各スライスの内部を確認するために、各スライスを上と下の両方からレンダリングします。
私がレンダリングするモデルは、2つの立方体から構成される単純な「T」字型です。立方体は同じ次元を持ち、同じY(高さ)座標を持っています。Blenderでのレンダリングは次のとおりです。
このモデルを一度上から直接レンダリングし、一度下から直接レンダリングします。私の期待は、まったく同じ画像を取得することでした(y軸でのミラーリングを除く)。ただし、非常に低い解像度のレンダリングターゲット(25x25)を使用してレンダリングする場合、「T」の位置(ピクセル単位)は、下からレンダリングするのではなく、上からレンダリングしたときと異なります。図2と3を参照してください。ピンクのブロックは元のレンダリングの一部ではありませんが、簡単に数えたり、違いを確認したりできるように追加しました。
上からレンダリング
下からレンダリング
これはおそらく私が読んだことによるものです 、カメラから見て左上にバイアスされている可能性のあるピクセル座標とテクセル座標についてです。私は両方のカメラに同じ「上」ベクトルを使用しているため、バイアスはx軸にのみ表示されます。私はカメラの位置を変えようとしました、そして、それは私が思っていたように、半ピクセルであるはずだと見ています。1台のカメラと両方のカメラの両方をシフトしてみましたが、一部の効果が表示されているのに、両方のカメラからピクセル単位の完全なコピーを取得できません。
ここで私はカメラを初期化し、私が信じているもの、ハーフピクセルを計算します。boundsDimXとboundsDimZは、モデルの周囲をわずかに拡大した境界ボックスで、正射投影カメラのビューボリュームの幅と高さとしても使用します。
Matrix projection = Matrix.CreateOrthographic(boundsDimX, boundsDimZ, 0.5f, sliceHeight + 0.5f);
Vector3 halfPixel = new Vector3(boundsDimX / (float)renderTarget.Width, 0,
boundsDimY / (float)renderTarget.Height) * 0.5f;
これは、カメラの位置とカメラの視点を設定するコードです
// Position camera
if (downwards)
{
float cameraHeight = bounds.Max.Y + 0.501f - (sliceHeight * i);
Vector3 cameraPosition = new Vector3
(
boundsCentre.X, // possibly adjust by half a pixel?
cameraHeight,
boundsCentre.Z
);
camera.Position = cameraPosition;
camera.LookAt = new Vector3(cameraPosition.X, cameraHeight - 1.0f, cameraPosition.Z);
}
else
{
float cameraHeight = bounds.Max.Y - 0.501f - (sliceHeight * i);
Vector3 cameraPosition = new Vector3
(
boundsCentre.X,
cameraHeight,
boundsCentre.Z
);
camera.Position = cameraPosition;
camera.LookAt = new Vector3(cameraPosition.X, cameraHeight + 1.0f, cameraPosition.Z);
}
主な質問 これで、すべての問題とそれを推測できるコードを確認できました。私の主な質問はです。両方のカメラを位置合わせして、それぞれがまったく同じ画像(Y軸に沿ってミラーリング)をレンダリングするにはどうすればよいですか?