Viewport3Dでの半透明球について

解決


yTake  2017-02-13 00:17:23  No: 48546

yTakeです。
先に問い合わせて頂きましたFMXでの3D描画で半透明球の取り扱いで確認させて下さい。

現在、FXXのHDでFormにViewPort3Dを配置して、そこに
Model3D−Cylinder1−Corn1
       −Cylinder2−Corn2
       −Cylinder3−Corn3
       −Sphere1
       −Sphere1
の様に配置しています。CylinderよSphereは同じ階層(Model3Dの直下)です。
Shere1のOpacity=0.5として半透明化しました。その他は全てOpacity=1です。
ここで、”Cylinder+Corn”の1〜3は全て、Sphere1との重なり具合に応じて、Sphere1の球面の外側部分は自身の色がそのまま描画され、球面の内側部分は球面の半透明色味が掛かった色で描画されています。見た目に三次元位置関係が良く分かります。
しかしながら、Sphere2は何故かSphere1の球面の内側が見えなくなってしまっています。

Sphere1のOpacity=0.5の効果がSphere2には及んでいない感じですが、プロパティ設定は他のCylinder、Cornと同じ様にしているつもりです。

Sphere同士ではOptcityの効果が及ばないなどの仕様なのでしょうか?

確認すべき設定や項目があれば、ご教授下さい。
よろしくお願いします。

当方、
32ビットWindows10、DELPHI XE6


Konnoya  2017-02-13 01:45:26  No: 48547

>現在、FXXのHDでFormにViewPort3Dを配置して、そこに 
>Model3D−Cylinder1−Corn1 
>       −Cylinder2−Corn2 
>       −Cylinder3−Corn3 
>       −Sphere1 
>       −Sphere1 
>の様に配置しています。
>
>しかしながら、Sphere2は何故かSphere1の球面の内側が見えなくなってしまっています。 

これとまったく同じ構成の3Dオブジェクトを配置して試してみましたが、
Sphere1、Sphere2共に半透明になりますね。

>Shere1のOpacity=0.5として半透明化しました。その他は全てOpacity=1です。 

この文章が気になったのですが、Shere2のOpacity も 0.5 と設定されていますか?

…書いてる途中で言わんとしている事が判りました^^;

Sphere1、Sphere2が重なった時に、その半透明の相乗効果がSphere1に適用されない?
ということですね。

ZWriteプロパティ を FALSE にしたら両方とも描画される様になりましたが、
そのSphereコンポーネントに何かテクスチャが貼ってあって、
回転すると何か不都合がありますか?


Konnoya  2017-02-13 02:21:21  No: 48548

ちょっと検索してみて判った事を書きます。

・半透明のオブジェクトは、後で描画するようにしなくてはならない。
・複数の半透明オブジェクトは、遠くの物から描画するようにしなくてはならない。

という制約がある様です。


yTake  2017-02-13 02:57:24  No: 48549

Konnoyaさん、ありがとうございます。

ZWrite(Zバッファ)は良く分かっていません。取り敢えず、いずれも"False"です。

両Sphere共にテクスチャは貼っていませんが、"ColorMaterialSource"を張り付けています。ただ、これはCylinder等も同じです。

で、描画順とは気が付きませんでした。確かに、意図している描画になっているオブジェクトは構造ビューで"Shere1"より先に位置しています。

描画順の変更・指定の仕方が分からなかったので、取り敢えず、Sphere1を不透明球として、Sphere2を半透明球としてみたら、期待通りにSphere1がSphere2の内部に入っている部分の色味が変わって、Sphere2の内側になっている様に見えます。

ただ、これではオブジェクト名アルファベット順に依存して、任意に描画順を指定できません。
描画順に関して、少し、調べてみます。


Konnoya  2017-02-13 03:02:59  No: 48550

描画順序は、以下の通りです。

・設計時に変更する場合
「3Dオブジェクト」を右クリックして、[コントロール」を選択、
「前面に移動」か「背面に移動」を選択する。

・プログラムコードから行う場合。
Sphere.BringToFrontメソッドで「前面に移動」
Sphere.SendtoBackメソッドで「背面に移動」


yTake  2017-02-13 06:19:30  No: 48551

Konnoyaさん
ありがとうございました。

描画順を指定するプロパティなどはないのですね。
設計時のオブジェクトのコントロールで、全面/背面へ移動で設定するか、
プログラム上で、各オブジェクトのメソッド"BringToFront"、"SendToBack"で設定するのですね。

お陰様で、希望通りになりました。

ありがとうございました。


Konnoya  2017-02-13 07:54:21  No: 48552

ここで言う「前面に移動」と「背面に移動」とは描画する順序という事らしいです。
Z軸で描画ピクセルが被る場合、先に描画されるオブジェクトのみが描画され、
後のオブジェクトは描画されない。
よって半透明のオブジェクトが被る場合、上記の描画順序が実行され、
半透明同士を加味した描画が行われないという事になります。

ここに理解の為に参考になりそうな記事を見つけましたので貼り付けておきます。
http://blog.goo.ne.jp/himaudo_1987/e/103d7cfab992fb3a7ee58a9989e1feb9

ひょっとしたらyTake様の言っている事とは異なるかも知れませんが^^;


yTake  2017-02-14 03:14:10  No: 48553

Konnoyaさん、ありがとうございます。

Zバッファ/Zソートの話、参考になります。

閉めた後ですが、実は一度は希望通りにいったのですが、TabControl内へViewport3D毎移動したのですが、その後から、透過の様子がおかしくなりました。
”前面へ”、”背面へ”と言うのは相対的な位置関係で、全体での階層順が良く分かりません。
そこで更に調べてみたら、DEKOさんのページでプログラムのフォームファイルの作成ルーチンのところで、作成の順をオブジェクト毎入れ替える手順が紹介されていました。
これは全体の階層順が把握でき、よく分かるのですが、なぜかうまくゆきません。
以前、うまくいった時は、Model3D配下に並列で順にCylinder1、Cylinder2、Cylinder3、Sphere1、Sphere2を配置し、Sphere2のOpacity=0.5としていました。
現在も、作成ルーチンのところでオブジェクトの順をCylinder1、Cylinder2、Cylinder3、Sphere1、Sphere2としていますが、以前と同じ描画になりません。
実際には他にGrid3DやDummyも載っているのですが、これらの順も色々試してみましたが、現在までのところ、直っていません。

Zバッファ/Zソートの話では、透過オブジェクトが重なった場合などでZソートが有効な様な話ですが、本事例で透過オブジェクトはSphere2の1個のみです。

もう少し、試行錯誤してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加