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

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

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

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

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

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

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

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

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

コメント

アバター
りょうたんぽ 2020/8/22 10:30 ◆GoCg6EMf7SSc
なるほどー……

ちなみにソース公開した方がいいですか?
ただし上位互換の独自言語で書いてますが (元ソースに出力ソースとコンパイラ付属させます)

レイヤー操作とか描画に関する部分には多用してないのでそこまでわかりづらいものではないと思います。
アバター
りょうたんぽ 2020/8/22 15:58 ◆GoCg6EMf7SSc
あとレイヤー上の位置計算はARYOP使っているので、追加のARYOPでできればなおいい感じになりそう……
アバター
こういち 2020/8/22 16:08 ◆.Id/aHiU36hu
重なりを判定する方法として四分木というものがある。
…けど、ビット演算のないARYOPでは厳しいかも。
アバター
SatoshiMcCloud 2020/8/22 17:30 ◆Z1qfV11i63Jr
ソースコード見れたら見たいです。
アバター
りょうたんぽ 2020/8/23 10:34 ◆GoCg6EMf7SSc
純粋なSBで Finiti以外の他のライブラリに依存しないよう最低限のコードを書き直しました。
LX3D というプロジェクトになってるはずです。Finitiは同梱しています。

キー: 4NKSNXDEF

デバッグ用にブロックに数字が出てきますが画面左上にその数字の意味を表す文字列が出ていてLボタンで変更可能です (3種類) 押すと数字も意味に応じて変わります。

LAYER : レイヤーID
CREATEFACE : スプライトの面番号
LAYERFACE : 所属するレイヤーの面番号

面番号は -X -Y -Z +X +Y +Z の順に 1 から割り当てられてます。また例えば右を向いている面は左側のレイヤーに表示されるため CREATEFACE と LAYERFACE は向かいあう番号になります。
アバター
SatoshiMcCloud 2020/8/23 20:46 ◆Z1qfV11i63Jr
とりあえずダウンロードして、少々動かしてみました。
これはかなりの難題ですね…。
アバター
SatoshiMcCloud 2020/8/25 8:11 ◆Z1qfV11i63Jr
今考えている作戦
・レイヤー7を通常モード、それ以外を加算合成モードにする
・1つの面にスプライト9つを割り当てる。所属レイヤーは自身の面とそれ以外の面に割り当てる。
例)X面のスプライト
・X面のレイヤーに1つ(描画スプライトと呼ぶ)(プラスかマイナスどちらか1つのX面レイヤーに所属)
・±Y面、±Z面のレイヤーにそれぞれ2つずつ(影スプライトと呼ぶ)
・影レイヤーの仕様は以下の通り
・表示は黒一色とし、GIVERS-P3D方式を利用して任意の四角形を描画できるようにする
・座標変換を駆使して、最終的な描画座標と形状が描画スプライトと一致するようにする
・スプライトのZ座標は、面の表示順序と一致させる
アバター
りょうたんぽ 2020/8/25 19:04 ◆GoCg6EMf7SSc
すこしずつ理解しながらやってみます
レイヤー上に正方形スプライトというやり方は同じですか?
アバター
SatoshiMcCloud 2020/8/25 19:34 ◆Z1qfV11i63Jr
>>レイヤー上に正方形スプライトというやり方は同じですか?
同じつもりです。ここまで作った仕組み(正方形スプライトでテクスチャ表現)に、さらに三角形単色スプライトを追加するイメージです。
アバター
りょうたんぽ 2020/8/25 20:22 ◆GoCg6EMf7SSc
なるほど ありがとうございます。
P3D方式の描画は自力ではちょっと難しいですがFinitiのテクスチャマッピングがそのやり方なので割とできそう……!
アバター
りょうたんぽ 2020/8/26 8:41 ◆GoCg6EMf7SSc
理解できたので昨夜、P3D形式の三角形表示をとりあえず正方形でやってみましたが、ほぼちゃんと隠したい所が隠れている感はあって感動しました!ありがとうございます!
これ三角形表示できれば何か達成できそう……!原理を理解しながらきょう夕方続きやります。
アバター
りょうたんぽ 2020/8/26 14:35 ◆GoCg6EMf7SSc
P3D 形式で三角形表示……
あるレイヤーの正方形を別のレイヤーにその形を維持して表示させたときは平行四辺形になるからスプライト2枚から1枚に節約できそう……?
アバター
SatoshiMcCloud 2020/8/26 15:57 ◆Z1qfV11i63Jr
それはよかった!
昨日書いた後で本当に出来るのか気になって、夢にまで出て来ました…。

>>別のレイヤーにその形を維持して表示させたときは平行四辺形
たぶんパースがついて、少々歪んだひし形みたいになる気がします。計算してみないと断言できないかも。
アバター
りょうたんぽ 2020/8/26 21:41 ◆GoCg6EMf7SSc
( 自分もいま作ってるこのブロック表示プログラムが夢に出てきたことあります。結構技術的な想像をしていたというか、具体的な方法が浮かび上がってた記憶があります。たま〜にありますよね(?) )
アバター
niku 2020/8/28 19:43 ◆/oblPUivHG55
公開キー間違っていませんか?
アバター
りょうたんぽ 2020/8/28 21:32 ◆GoCg6EMf7SSc
上にあるキーはDLできるはずですが……
実機・SBapiでも確認してます
アバター
シロ 2020/8/28 22:27 ◆g0oUAxBiWqcj
3号ではダウンロード出来ないのでは?
アバター
りょうたんぽ 2020/8/29 14:00 ◆GoCg6EMf7SSc
そうですね、一応トピックのタイトルにSB4とか書いてありますが、プチコン4専用です……
アバター
SatoshiMcCloud 2022/5/5 16:40 ◆Z1qfV11i63Jr
出来ました!
アバター
りょうTanpo 2022/5/12 19:16 ◆AI5iRr9FjmkJ
おお〜〜っっすごすぎる......!!
約2年越しに希望の光が!

パスワードを失念してしまいアカウント変わってますが、改めましてりょうたんぽです。
もしもソースコードを拝見できるのであれば、お見せいただければ幸いです。
勉強と今後の作品作りに役立てたいです。

コメントを書く

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

- WEB PATIO -