地平線を作成するにはどうすればよいですか?


8

レイトレーサーに空を追加しました。これは、レイがオブジェクトを完全に見落としたときにサンプリングされます。

ウサギ

ここで私がしていることは、レイがシーン内のすべてを完全に見逃した場合、(ray.direction.x、ray.direction.y、ray.direction.z)でパーリンノイズ関数を返します。つまり、「サンプリング原点の周りの球」

しかし、それは「間違っているように見えます」(空があなたに面しているように見えるため)。

空を改善して、地球の地平線のように見せるにはどうすればよいですか?

または、これは多かれ少なかれそれがどのように見えるべきか、そして私は単に床により多くのジオメトリを追加する必要がありますか?


私はそれが明らかに不自然に見えることに同意します。ところであなたのカメラはどのように機能しますか?完全なスカイボックスまたは背景のみが必要で、ノイズを使用して空を生成したいですか、それともテクスチャからサンプリングしていますか?その単なる背景(2.5Dゲームとしても)の場合、このimages.bibliocad.com/library/image/00010000/9000/…のようなものからサンプリングできます。
ClassicThunder

2
Y座標(または、「上向き」の座標の場合はZ)へのなんらかの変換によって、何らかの処理が行われる場合があります。たとえば、y '= 1 −(1 − y)^ 2です。アイデアは、= 1、Y近傍Y = 0の周り座標と同じに保つか、またはそれを展開Yを圧縮すること
ジョンCalsbeek

@Calsbeekこれは素晴らしい答えです!:)
Maik Semder

回答:


7

または、パーリンノイズを使用する代わりに、空のテクスチャを含む立方体マップを使用することもできます。また、環境マッピングの詳細とバリエーションが増えるため、シーンの見栄えがよくなると思います。それが、レイトレーサーを実装したときに私がしたこととまったく同じです。

私がこれをお勧めするもう1つの理由は、環境がクラウドだけである必要はないということです。山があったり、屋内シーンであったり、火星のシーンであったりします。キューブマップを使用する必要があるのは、テクスチャを交換するだけです。

したがって、最初のステップは、ニーズに合ったキューブマップを見つけることです。6つの個別のテクスチャとして、または以下のような単一のテクスチャとして保存できます。独自の作成方法の詳細については、このリンク確認してください。

ここに画像の説明を入力してください

次に、コードでCubeMap、サンプリング計算をカプセル化するクラスを作成することをお勧めします。このクラスは、キューブマップテクスチャをロードする方法を知っている、と与えられなければならないレイ、で知ることができるはずどの顔とでどのような位置にサンプルを。私の実装では、6つの面のそれぞれを別々のテクスチャオブジェクトに格納し、光線の方向に基づいて分岐する方が簡単であることがわかりました。

class CubeMap
{
    public void Load(string path);
    public Color GetSample(Ray ray);
    private Texture[6] faces;
}

Textureクラスがまだない場合は、自分で作成してください。色の2次元配列と同じくらい簡単です。参考までに、この実装の効率や健全性を保証するものではありませんが、プロジェクトで使用したコードはCubeMapCubeFaceです。


この答えは問題を回避します-私が生成したテクスチャを地球のスカイドームとして表示する方法を知りたいです。
bobobobo

2

(ray.dir.x / ray.dir.z、ray.dir.y / ray.dir.z)で2D Perlinを使用してみてください。プロジェクトは、方向ベクトルをZ = 1平面に投影します。無限の(平らな)空の効果が得られます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.