2017-05-17 7 views
2

私は部屋、いくつかの光源とプレーヤーとのシンプルなシーンを持っています。プレーヤメッシュは常にルームメッシュの上にレンダリングする必要があります。 this質問から受け入れられた答えに続いて、部屋とプレイヤーの2つの異なるシーンを作成する必要があります。実際、この場合、1つのことを除いてすべてが正常に動作します。プレイヤーのメッシュは、ルームシーンの光源の影響を受けなくなります。もちろん、私はプレーヤーのシーンに光源を複製することができますが、それは私には貧弱な決定(私が想定している陰影に問題があるでしょう)のようです。あるシーンのメッシュを別のシーンのライトの影響を受けます。

この問題を解決する簡単な方法はありますか?

+1

問題の解決策があなたの質問に対する答えではないかもしれません。 1つのシーンでこれを試してください: 'player.renderOrder = 999; player.onBeforeRender = function(レンダラー){rendererclearDepth(); }; ' – WestLangley

+0

@WestLangleyこれは、各メッシュマテリアルで' depthTest'を 'false'に設定したときと同じ効果をもたらしました。私はこのアイデアが好きですが、以下のコメントの1つで言及したように、私のプレーヤーメッシュは異なる素材を持つ 'SkinnedMesh'であり、このメッシュの異なる部分に' renderOrder'を設定する方法はわかりません。 – briarheart

+0

これは同じではありません。メッシュ上で 'depthTest'を' false'に設定すると、メッシュがそれ自身に対して深さテストをしないため、あらゆる種類のアーティファクトが発生します。 – WestLangley

答えて

1

Object3dのレイヤプロパティを使用して、Layers objectと組み合わせて使用​​するとどうなりますか? 私はあまりにも多くの作業を試みたことはありませんが、ドキュメンテーションからレイヤプロパティは、オブジェクトを複数のレイヤのメンバにすることができると言います。

ライトはレイヤー 1のメンバーで、ほとんどのオブジェクトはレイヤー0のみで、プレイヤーのみレイヤー1を持つことができます。この方法では、基本的に2つのシーンと同じテクニックを実行できるはずです1つのシーンと2つのレイヤーがあり、ライトは0と1の両方のメンバーで、残りは1つのカテゴリにのみ属します。

レイヤー0を選択してシーンをレンダリングし、1に切り替えて再度レンダリングします。私はこのプロパティを多用していませんでしたが、私はそれがあなたのニーズに対応できると思います。この方法ですべてを一度定義し、レイヤーを切り替えるだけです。プレーヤからのレベルのシャドウについては、レンダリングせずに影を投げてレベルと同じレイヤに配置するプレーヤの不可視バージョンを作成できます。

+0

ありがとうございました!レイヤーは面白いものですが、主要な問題は解決しません。プレイヤーメッシュは常に他のメッシュの上に置かなければなりません(この質問のタイトルはちょっと混乱します)。だからこそ、私は2つの異なるシーンを使用するようになりました。レンダリングパスの間で、私は 'clearDepth'を呼び出します。そのため、第2のシーンからのすべてのメッシュは、最初のシーンからのすべてのメッシュの上にレンダリングされます。レイヤーはそのような効果を生み出すことはできません。 – briarheart

+0

私は層のアイデアをあまりに早く拒否したようです。私のコードに間違いがありました。今はすべてが期待通りに機能します。しかし、影の問題は依然として重要です(2番目のパスでレンダリングされるライトは、部屋の壁を考慮せずにプレーヤのメッシュを照らします)。 – briarheart

+0

同じジオメトリを参照するシャドウをキャストする必要があるものの、シャドウのみをキャストするが表示されないマテリアルを持つものを重複して追加してみてください。また、これがコアの問題(照明の問題)を解決する場合は、答えとしてマークし、最適化の質問のための新しいスレッドを開始します。 – OtterFamily

1

照明を複製する必要はありません。影が実際にアーティファクトを与えるかもしれません(しかし、3Dオブジェクトが魔法のようにシーンの前に浮かぶと、シャドウの予想される振る舞いをどのように定義するのか疑問に思うかもしれません:-)。

あなたが上に一つのオブジェクトを強制するが、それでも同じシーンの一部になりたい場合は、おそらくそのオブジェクトのZ-テストを無効renderOrderの変更を検討すべきです。たとえば、using renderOrder in three.jsを参照してください。

+0

ありがとうございました!実際、私のプレーヤメッシュは、異なる素材を持つ 'SkinnedMesh'です。 1つまたはすべてのプレーヤー素材で 'depthTest'を' false'に設定すると、アーティファクトが発生します。メッシュの骨ごとに異なる値の 'renderOrder'を設定しようとしましたが、何も変わりませんでした。まったく可能ですか? – briarheart