コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
りょうたんぽ ◆GoCg6EMf7SSc
2020/8/18 15:07
情報交換
[SB4] 手前に表示するスプライトを選別する 3D
複雑でいいタイトルが思い浮かばないので本文で説明します

現在 Minecraft っぽいものを作ってます。
Finitiという3Dライブラリを利用していますが、レンダリング方法としてはP3Dのような三角形テクスチャのスプライトを表示するものです。昨日まではこの方法を使っていました。

別に思いついたのが、レイヤーを立方体状に配置し、ブロックの6面をそれぞれのレイヤー上に位置を計算して表示する方法です。こちらの方が粗いテクスチャを使わないでいいし、速いだろうということで試してみた結果が上記のスクリーショットです。レンガブロックのそれぞれの面が1つのスプライトとなっています。

位置計算には成功しましたが、それぞれのレイヤーのZ座標は独立しているため、面ごとに固定の順番で表示されてしまい、隠面消去ができていません。つまり、手前にあるのに、奥にあるオブジェクトに隠れてしまう現象が起こります。

そこで、かならず手前に表示させるスプライトをより上層のレイヤーに表示するようにしたいです。

レイヤーは8つしか使えないため、同じプログラムをサブプログラムとしても実行し、上のように手前にあるのに意図せず隠れるスプライトのみをサブプログラム側で表示させたいと思います。つまり「メイン側で表示するか、サブ側で表示するかを選択したい」というのが目的です。

ここで、サブ側で表示しないと隠れてしまうスプライトを判定する方法がなかなか出てこず、アイデアや方法がもしあれば教えていただきたいです。

ゲームの開始時にサブプログラムも自動起動する処理と、メイン・サブ間でのカメラ位置、ワールドの同期はすでにできています。

コメント

アバター
こういち 2020/8/18 18:53 ◆.Id/aHiU36hu
スクショがカオス過ぎて内容が入ってこない…
確認すると、
・各レイヤ内での表示順序はちゃんと保たれていて、異なるレイヤと重ねて表示したときに本来奥のスプライトが手前に来てしまうことがある
ってことかな…
アバター
りょうたんぽ 2020/8/18 20:19 ◆GoCg6EMf7SSc
おっしゃる通りです。同じレイヤー内ではカメラからの距離に応じてZ座標を設定しています。
スクショでは確か向かって右を向いている面が最もレイヤー番号が若いためどの面よりかならず手前に表示されてしまいます。
サブプログラムを使えば、もう1段階だけ上にオーバーレイできるので、たとえば隠れてしまっている上向きのスプライトを判定してサブプログラムで表示するようにできないかなぁと……

またサブで表示するようにして、隠していたスプライトもサブ表示になっては意味がないので、そこも悩みどころです。
アバター
SatoshiMcCloud 2020/8/19 17:29 ◆Z1qfV11i63Jr
一見ではどんな仕組みなのか分からない…

もしよければなんですが、レンガの代わりに、スプライトが所属しているレイヤーの番号が書かれた正方形を表示した画面って、出来ますか?
アバター
りょうたんぽ 2020/8/19 21:34 ◆GoCg6EMf7SSc
返信遅れてすみません。明日スクショを載せます。
アバター
りょうたんぽ 2020/8/20 13:17 ◆GoCg6EMf7SSc
こういうことですか?
文字が重なるとみづらいので、レンガの上にそのレンガのスプライトが所属するレイヤー番号を重ねました。( その番号を表示しているスプライトそのものも そのレイヤーに所属している)
赤・緑・青はそれぞれ XYZ をあらわしています。
アバター
SatoshiMcCloud 2020/8/20 17:36 ◆Z1qfV11i63Jr
そうそう、それです!それが欲しかったです。
これを見ると1が優先的に全面に表示されていて、それをなんとかしたい、という課題って解釈ですかね?
アバター
しんいち 2020/8/20 18:04 ◆lHy.hAWXbthn
立方体を一方向から見たら3面しか見えないのでレイヤー3枚で考えてみるとか。
アバター
りょうたんぽ 2020/8/20 18:19 ◆GoCg6EMf7SSc
SatoshiMcCloud さん

その通りです!
アバター
りょうたんぽ 2020/8/20 18:23 ◆GoCg6EMf7SSc
しんいちさん

この画像はたまたまそういうアングルでスクショ撮りましたが、向かい合う面が両方見えることもあります。理想的にはminecraftのようなことをしたいので……
最大で何面だろう……?
アバター
こういち 2020/8/20 18:32 ◆.Id/aHiU36hu
>向かい合う面が両方見えることもあります。<
その状況って、ブロックが透明でないと起こり得ないと思うので、あまり見た目には影響しないかと。
拘りたいのなら、例えば透明な物体は一つの面を裏表2つのレイヤーに描画するとかで対処できそう。
アバター
りょうたんぽ 2020/8/20 18:48 ◆GoCg6EMf7SSc
たとえば真正面を向いた時、左も右も見える、ということです。それぞれ別のレイヤーで描画しないとできないと思います。
でも同時に6面は見えないので、空いたレイヤーで足りるのかな……?
アバター
Na 2020/8/20 18:55 ◆QoELVrBXBQCI
>たとえば真正面を向いた時、左も右も見える
3点透視図法ならそれは起こりえない気が...

仮に立方体の面が6面見えたとしても、それぞれの面はxy平面、yz平面、zx平面のいずれかなので、レイヤーは3つで足りないでしょうか?
アバター
りょうたんぽ 2020/8/20 19:33 ◆GoCg6EMf7SSc
たとえばこの画図の中央の2つの側面は別のレイヤーが必要な気が……
6つのレイヤーをカメラの位置を中心とした立方体状に配置しています。
アバター
しんいち 2020/8/20 19:42 ◆lHy.hAWXbthn
穴を覗き込んだら、上下左右と奥で5面見えますね。つまりは凹みが厄介なのか。四角い輪が連続した歯抜けのトンネルのような構造を、真正面からちょっとだけズレて覗いたら、レイヤーが何枚あっても足りなくなっちゃうのかな。
アバター
りょうたんぽ 2020/8/20 21:48 ◆GoCg6EMf7SSc
追加情報。
レイヤーのブレンドモードを 4 (スクリーン) にしてから、レンガのスプライト等の上に黒い色のスプライトなりを表示すると、透明になって消せる?みたいです。それを使って、他のレイヤーを隠してしまう部分を黒い色でGTRIとかすれば隠面消去できそうです。
ただ重そうなので、まだサブプログラムの戦略のほうがよさそう?
アバター
SatoshiMcCloud 2020/8/20 21:55 ◆Z1qfV11i63Jr
研究のために仕事帰りにドンキホーテでサイコロを購入。
この画像のパターンだと、1と3の面が手前&奥と奥&手前のケースが同時に発生してます。単純なレイヤー順序だけでは難しそうです。
アバター
SatoshiMcCloud 2020/8/20 22:04 ◆Z1qfV11i63Jr
このケースもかなり難かも
アバター
しんいち 2020/8/21 13:22 ◆lHy.hAWXbthn
レイヤー足りなくなるかもというのは置いといて、とりあえずやってみようと考えた時、隠れてしまうスプライトを検出するには、通常ならSPHITSPとかでできるけど、LMATRIXしてると見た目の座標が一致しない(例えば上の面と右の面が見た目重なっててもSPOFSのX,Yでは重なってないとか)ので難しい、ということかな。だとすれば結局はLMATRIXに頼らずに3次元表示する場合の計算をして座標の重なりを判定しなければならないか。う〜ん、LCOORDが欲しいところですね。
アバター
キルル2 2020/8/22 8:55 ◆rGE712Ruejv7
社長に話してZバッファ機能を作ってもらえばいいのでは
アバター
SatoshiMcCloud 2020/8/22 9:35 ◆Z1qfV11i63Jr
https://twitter.com/SatoshiMcCloud/status/755728027779117056?s=19

一度進言してはいますが、3D関連については断固拒否のようです。
プチコンは基本的に、中の人がプチコンで作りたいプログラムがあって、そのために必要な機能があれば追加する姿勢です。中の人が3Dゲームを作りたいと感じ始めたら一縷の望みはありますが、まあ絶望的でしょうなあ。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -