正射投影カメラを使用して上と下からレンダリングされた画像が一致しない


8

正射投影カメラを使用して、モデルのスライスをレンダリングしています(ボクセル化するため)。各スライスの内部を確認するために、各スライスを上と下の両方からレンダリングします。

私がレンダリングするモデルは、2つの立方体から構成される単純な「T」字型です。立方体は同じ次元を持ち、同じY(高さ)座標を持っています。Blenderでのレンダリングは次のとおりです。

Tモデル

このモデルを一度上から直接レンダリングし、一度下から直接レンダリングします。私の期待は、まったく同じ画像を取得することでした(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軸に沿ってミラーリング)をレンダリングするにはどうすればよいですか?


これまでの解決策は、写真を撮るカメラを正確に1ピクセル下から左(-x)に移動することです。ただし、理由を説明することはできず、したがって、私が投げたすべてのものに対して機能することを保証できません。何か案は?
ロイT.

すべてを適切な場所に保つことを考えましたが、モデル(キューブ)のYを-1でスケーリングしましたか?次に、オブジェクトが反転することを除いて、すべて同じです。PSもちろん、法線とポリゴンの面も-1にする必要があります。
クロムスター2014年

それは実際にはかなりクールなアイデアです
Roy T.

ご了承いただき、回答として掲載させていただきました。それがあなたのために働くかどうか教えてください!
クロムスター2014年

回答:


2

これは、表示された問題に対する別の見方であり、ラスタ化の違いの問題を完全に回避するのに役立つ場合があります

すべてをそのままにして、モデル(キューブ)のYをセクション平面に沿って「-1」だけスケーリングすることを検討しましたか?そうすれば、オブジェクトが上下逆に反転することを除いて、すべてがまったく同じになります。つまり、目標に向けてオブジェクトの裏側が取得されます。もちろん、法線とポリゴンの方向も「-1」にする必要があります。


あなたの答えは私の方法がうまくいかなかった理由を説明していませんが (そしてそれが賞金の目的でした)私は今のところ賞金を授与しません。しかし、それは良い提案なので、50%の自動バウンティは1日で授与されるべきです。
ロイT.

@RoyT .:公平に聞こえます。ただし、提案された解決策で問題が解決した場合は、私たちに伝えてください。同じ問題に直面している他の人がそれを処理する方法を知ることができるようにするためです。
Kromster 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.