Discuss Scratch

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

24fi wrote:

専門用語(ロールなど)の意味が難しいので、あまり専門用語を使わずに意味を教えてください。
「専門用語(ロールなど)の意味」
については、以前ちょっと書いたことがあるので、
https://scratch.mit.edu/discuss/topic/372004/?page=7#post-6665631
もしかしたら参考になるかもしれません。

特にリンク先で紹介している
https://scratch.mit.edu/projects/639384394
の「3種類の、軸回転、の動き」は、イメージとして頭に入れておくとよいと思います(手前味噌ですが)。

リンク先でもなにがしか書いていますが、
「ロール、ピッチ、ヨー」という呼び名
=「どの動き」が「どの呼び名」に結びつくか、といった話は、
文脈(記事を書いた人の文化圏や、見る人の位置や方向など何を基準にするか)によって違ってくる

と思うので、最初は
x軸回転
y軸回転
z軸回転
といった、「Scratchの画面」=「Scratchの画面のx座標, y座標」を基準にした呼び名を使う方が、
安全(=誤解が生まれにくい)かなと思っています。
lpv_vql
Scratcher
41 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

質問です。
https://scratch.mit.edu/projects/1063605716/
このプロジェクトで、X,Y軸の角度をいろいろと変えていると(具体的に、X軸が300,Y軸が0など)木の幹が、本当は手前(最後)に描画されるはずが、奥(最初)に描画され、一部見えなくなってしまいます。これを改善する方法はありますか?
もし知っていたら教えてください。

Last edited by lpv_vql (Oct. 3, 2024 07:12:10)

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

lpv_vql wrote:

https://scratch.mit.edu/projects/1063605716/
このプロジェクトで、X,Y軸の角度をいろいろと変えていると(具体的に、X軸が300,Y軸が0など)木の幹が、本当は手前(最後)に描画されるはずが、奥(最初)に描画され、一部見えなくなってしまいます。これを改善する方法はありますか?
リストに入っているデータが多分
1)「茶色の部分」
2)「緑色の部分」
の順に入っていて、描画も「そのままの順」でやっているのが原因、ということかと思います。
今は大雑把に

ループ
処理A)「座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理B)x,y,zに回転操作をする
処理C)描画する
ループ終わり。

という処理になっていると思いますが、それを

ループ
処理A)「座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理B)x,y,zに回転操作をする
処理1)「回転後の座標のリスト」にデータを一つ書き込む。
ループ終わり。
処理2)ここで「回転後の座標のリスト」に書かれている各座標の順番を調整をする。
ループ
処理3)順番を調整した「回転後の座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理C)描画する
ループ終わり。

みたいな感じに書き換えるのが、ストレートなやり方かなと思います。

「処理2」のところでは「順番をどうにかする=奥行きでソートする」わけですが、
やり方や考え方は結構幅があっていくつかあるかなと思います。
(「ソートのやり方」は、この頂点数であればどうやっても現実的な処理時間で充分いけると思いますが、細かいことは、いまは触れません。)

そのうえで、ストレートじゃないやり方として、
1)このモデルであれば、「頂点単位の順番」ではなくて、「みどり」と「ちゃいろ」の「2パーツのかたまりの順番」の調整だけで済んだりする(それぞれのかたまりの中心のz座標(もしくはカメラからの距離)を比較するだけで、どっちを手前に描くか決めても問題ない)、という考え方も有効かもしれません。
2)そこまで割り切らなくても、点が「立方体が格子状に並んでいるモデル(いわゆる「ボクセル」)」という条件であれば、描画順序の決め方は、単純化の余地がありそうです。

さらには、

3)そもそも茶色の部分が手前に来ないように視点を制限する
4)点を小さくしたり(重なる頻度を下げる))、半透明にしたり(描画順序を判別しにくくする)して、雰囲気でごまかす

なんていうのも、目的によっては現実的な解答と思います。

Last edited by KimiruHamiru (Oct. 3, 2024 17:10:16)

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

補足。

「ストレートなやり方」のサンプルを探してみたのですが、

「大量の点を奥行きでソートする」のを
「線や三角やスプライトじゃなく、点(スタンプ含む)でやっている実例」

が見つけられなかった(自分も実は書いたことがなかった)ので、実際に書いてみました。
https://scratch.mit.edu/projects/1076400718/
lpv_vql
Scratcher
41 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

#304,#305
詳しく教えてくれて本当にありがとうございます。
実例までわざわざ作ってくれたなんて感謝しかないです。
とても参考にします。ありがとうございます!
あと、あのプロジェクトはほかのプロジェクトから3Dのプログラムだけを抜き取ったものなのですごくコードがわかりづらかったですよね、、、
すみません。

Last edited by lpv_vql (Oct. 3, 2024 20:48:09)

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

HARINEZUMINOKETU wrote:

KimiruHamiru wrote:

今は大雑把に

ループ
処理A)「座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理B)x,y,zに回転操作をする
処理C)描画する
ループ終わり。

という処理になっていると思いますが、
できればコードブロックをつかってほしいです
処理A)略
処理B)略
処理C)略
の3行

を具体的なコードで書くと、元のプロジェクトのコード場合で

処理A:17ブロック
処理B:24ブロックの定義2つで、それを呼ぶ側が8ブロック
処理C:17ブロックの定義1つで、それを呼ぶ側が27ブロック

になります。改造後のコードとなるとさらに多くなります。そのため、

「プログラム全体の構造の話」がしたい状況では、
コードブロックを使って具体的なコードを書く
よりも
コードブロックなしで概念的な書き方をする
方が、まだ分かりやすい

かなと判断しました。

今回の場合は結局追記で「改造後の、実際に動くコード」もプロジェクトとして提供したので、敢えて「フォーラム用にコードブロックとして書き直す」のは、メリットが少なく(コード量が多いので労力がとても大きい)、デメリットが大きい(書き間違うリスクも大きい)かなと思います。
具体的なコードにすると、改造前と改造後で書き方が変わっている部分もある、ので、どのコードをフォーラムの説明として採用するか(=誰にとってわかりやすいことを優先するか)の判断も難しいです。特に改造後のコードに現れる「ソート」の具体的なアルゴリズム、書き方は、幅がありすぎて、どれを採用するか、判断が難しいです。ガチでやると年単位の調査研究が必要かなと、誇張なしに思います。

示したかったのはそこじゃなく、プログラムの全体の構造をどうするか、という話です。
ソートの仕組みを入れるためには、「頂点単位」でやるのは難しい、「全頂点データのかたまり」を単位にして、必要ならコピーを作って各処理に流れていく形にする方が簡単、なので全体の構造(端的にはループの回し方)を変えるべき、という話です。

動くコードは、改造前のものも改造後のものも、それぞれのプロジェクト中に、既にある
ので、
「フォーラムでコードブロックとして見えること」が、「ほかの人」にとって必要、労力に見合うメリットがある、
と考えるのであれば、そう考える人(メリットを感じる人)自身が、コードブロックとして書き直してみる、というのはよいかなと思います。

Last edited by KimiruHamiru (Oct. 5, 2024 00:48:54)

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

やたらに赤くなるのがあんまりかっこよくない気はしますが、
(頂点数)回繰り返す
処理A)「座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理B)x,y,zに回転操作をする
処理C)描画する
end



(頂点数)回繰り返す
処理A)「座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理B)x,y,zに回転操作をする
処理1)「回転後の座標のリスト」にデータを一つ書き込む。
end
処理2)ここで「回転後の座標のリスト」に書かれている各座標の順番を調整をする。
(頂点数)回繰り返す
処理3)順番を調整した「回転後の座標のリスト」から変数x,y,zにデータを1つ読み出す。
処理C)描画する
end
こうする!

という書き方であれば、労力と見やすさのバランスとしてありだったかもと思えてきました。
参考にします。
HARINEZUMINOKETU
Scratcher
77 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

ありがとうございます
finalbacon
Scratcher
100+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

今三角形のポリゴンの描画を作っているのですが、zがマイナスのときの処理の仕方がわかりません。
処理の順番は、三点の座標に回転行列を適用する→zで割る→描画といった順番です。
わかる方いれば、どういう処理をすればいいのか教えていただきたいです。
また、そういうことについて参考になるものがあればそれも教えてほしいです。

Last edited by finalbacon (March 24, 2025 12:35:40)

oligami
Scratcher
100+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

#310

ちょっと考えてみましたが、

点A, B, C(∈ℤ³)で構成された△ABCがあるとして、
B_z < 0
A_z, C_z > 0 であると定義しておきます。

直線AC, CBにおけるz=1となる点を考えればいいと思います。zで割っているのは、スクリーンに投影したときの位置を求めているからなので。
スクリーンが無制限の大きさをしている場合、三角形がスクリーンと交差していない場合は三角形ですが、交差している場合は、四角形になります。
二点のzが0より小さい場合は三角形ですかね

分かりづらいと思うので図を載せときます。
KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

finalbacon wrote:

今三角形のポリゴンの描画を作っているのですが、zがマイナスのときの処理の仕方がわかりません。
処理の順番は、三点の座標に回転行列を適用する→zで割る→描画といった順番です。
わかる方いれば、どういう処理をすればいいのか教えていただきたいです。
また、そういうことについて参考になるものがあればそれも教えてほしいです。
以前似た話題について書いたことがあるので、参考になるかもしれません。
https://scratch.mit.edu/discuss/topic/714036/?page=235#post-8117043

上の投稿でも触れていますが、「そういうことについて参考になるもの」については、
クリッピング」というキーワード(検索語としては「3D クリッピング」とか)
が、世間にある情報を探す時の手掛かりになるかもと思います。
z=0をどこに置くかにもよりますが「zがマイナス(要は、視点に近い、視点より後ろ、投影面より後ろ、とかに当たる概念)」は
near clip」とか表現されます。

「クリッピング」はOS(グラフィクスAPI、GPUやそのドライバ)が持ってる仕組みと思われるので、
一介のプログラマが
「クリッピング処理のコードそのもの」
を書く機会はあまりない
=本職のプログラマほど、書かない=専門職の人(GPUハードメーカーとかの人)が書いた「三角形をいい具合に描くコード」を呼び出して使っている
=書店や図書館やWebで探すにしても、「クリッピング処理のコード自体の書き方」に関連する情報を目にする機会が少ない
=アマチュアの興味とか、基本的な考え方の勉強とかの目的で実装する機会しかない
=上の投稿で紹介している動画は、そういう経緯で(日本語で)解説しているわりと貴重な動画
と思います。
qwwws
Scratcher
2 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

ペンと言っても難しいどうやればいいのか教えてください
finalbacon
Scratcher
100+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

#313
ペンに慣れていない状況で3D作品をペンで作るのは難しいと思います。100%ペンのトピックがあるのでそちらがおすすめです。
ペンとは動いたところに線が引かれるもので、基本的にそこは変わりません。じゃあどうやってすごい人達はペンでものを動かしたりできるのかと言うと、毎瞬間ペンでものを書き直しているのです。こうすると自由に引き伸ばしたり、色を変えたり、だいたいなんでもできちゃいます。
とりあえず、そのような作品を作るには書き直しが出来ないといけません。ペンを扱いたいのなら、適当にペンで遊んでみて、ペンに慣れるところから始めてみるといいと思います。

Last edited by finalbacon (March 25, 2025 01:26:25)

KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

qwwws wrote:

ペンと言っても難しいどうやればいいのか教えてください
ペン関係のブロックは「種類がすごい少ない」です。

1)全部消す
2)座標を指定する(これはペンじゃなく「動き」カテゴリの青いブロック)
3)ペンを下ろす
4)ペンを上げる
というブロックを使うのが基本

かなと思うので、たとえばこんなプログラム

@greenFlag が押されたとき
ずっと
全部消す
[マウスのポインター v]へ行く
ペンの太さを(50)にする
ペンを下ろす
ペンを上げる
end
を動かしてみて、あとは、いろいろ遊び倒してみる(改造してみる)のがよいです。

たとえば
・ペンの太さを変えてみる。キーとかボタン操作に反応して変わるようにしてもいい。
・ペンの「」を工夫する。別の色にしたり、x座標とか距離とかタイマーとか「数字として使えるものを何でも」色として使ってみる。
・「座標」を「マウスのポインターへ行く」じゃないブロックを使って指定してみる。
・・たとえば座標に、数字や計算を指定してみる。数字や計算は、正解とかないので、いろいろ試す。
・・たとえば座標に、乱数や変数を使う。変数の使い方は、果てしないので、ほどほどにいろいろ試す。
・「ずっと」の繰り返しにこだわらず、工夫する。
・ブロックの並べ方や数を変える
・結果としてどうなったのか観察する。何でそうなるのか(あるいは期待通りにならないのか)考える。似たものを見たことがないか思い返す。

これだけでも、何日も遊べると思います(私は何年も遊んでいます)。

ペンは「点を描くだけ」の機能で、使うこと自体は簡単。
ペンを「どう使うか」=「ペンでいつどこに点を描くか」=「どういう座標データを用意してどういう計算をするか」の話題は無限に広い

と思っているので、

具体的に「アレみたいなのがやりたい」といった話があれば、
そういうプログラムを読んだり、改めて自力で考えたり、質問したりするとよいと思います。
kokkun1
Scratcher
22 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

finalbacon wrote:

今三角形のポリゴンの描画を作っているのですが、zがマイナスのときの処理の仕方がわかりません。
処理の順番は、三点の座標に回転行列を適用する→zで割る→描画といった順番です。
わかる方いれば、どういう処理をすればいいのか教えていただきたいです。
また、そういうことについて参考になるものがあればそれも教えてほしいです。
ある方の詳しく解説されたチュートリアルがあります。
https://scratch.mit.edu/projects/470897319/
このチュートリアルは線分の場合についてのみ書いていますが、三角形の場合も(四角形になる場合も考慮しなければならないことを除いて)だいたい同じです。
塗りつぶされた三角形の場合についてのプログラムを書いたことがあるので貼っておきます。
https://scratch.mit.edu/projects/765064224/
(三角形を塗りつぶす部分のプログラムが微妙だったりします)
mugi_kun
Scratcher
2 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

複数の基本的な質問、失礼します。

現在、新たな3D描画エンジンを作っていて、3Dモデルの形を描画することができるところまではできました。
ですがまだ、前に物があって、本来隠れていて見えてはいけない部分が前面に出てきてしまい、見えている状態になってしまっています。
皆さんはこのような対策はどのようにしていますか?
また、画面端にて描画しようとすると形が崩れてしまう現象の対策や、影をつける仕組みはどのようにしているのでしょうか。

本当に基本的な質問ですみません。
教えていただけると嬉しいです。
kokkun1
Scratcher
22 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

mugi_kun wrote:

複数の基本的な質問、失礼します。

現在、新たな3D描画エンジンを作っていて、3Dモデルの形を描画することができるところまではできました。
ですがまだ、前に物があって、本来隠れていて見えてはいけない部分が前面に出てきてしまい、見えている状態になってしまっています。
皆さんはこのような対策はどのようにしていますか?
また、画面端にて描画しようとすると形が崩れてしまう現象の対策や、影をつける仕組みはどのようにしているのでしょうか。

本当に基本的な質問ですみません。
教えていただけると嬉しいです。
物をどの順番で描くかを決定するためにカメラからの距離でソートするなどの方法があります。
物が格子状に並んでいる時など、一部の場合ははより簡単に処理できます。
物が三すくみになってしまう可能性があるばあい、単純な解決策は無いです。

画面からはみ出て書きたい場合、コスチュームを大きくすればより外側に出られるようになります。大きさを無限大にすることで制限を完全に解除することもできます。また、三角形を組み合わせて4、5角形にして画面内の部分のみを描くようにする方法もあります。
qwwws
Scratcher
2 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

set [ z座標] to [0]
when green flag clicked
forever
if <> then
<key [→] pressed?>
change size by (1)
end
end
簡単なz座標の作り方を調べてみました
→ch.mit.edu
KimiruHamiru
New Scratcher
500+ posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

mugi_kun wrote:

現在、新たな3D描画エンジンを作っていて、3Dモデルの形を描画することができるところまではできました。
ですがまだ、前に物があって、本来隠れていて見えてはいけない部分が前面に出てきてしまい、見えている状態になってしまっています。
皆さんはこのような対策はどのようにしていますか?
「前に物があって~どのようにしていますか?」ついて、
私についていえば、「なにも対策しない」です。しいて言えば
「半透明にする」、「単色で描く」、「全部点で描く」( https://scratch.mit.edu/projects/903953577/ )という「対策」を選ぶ(問題は起きるが、目立たなくする)ことが多い、です。
「全パーツについて手前か奥か全部調べて、奥のものから順番に描く」 https://scratch.mit.edu/projects/1076400718 という選択肢もありますが、重い処理なので(好みの問題で)私は選ばないことが多いです(この例はパーツとなる丸が「格子状に並んでる」やつなので、最適化の余地はあります)。

奥行きの処理にしても影の処理にしても、「3Dモデル」とか「描画エンジン」が、どういうものかによって、話の前提が違ってくるかなとは思います。「Scratch、3D、入門」というと「手書きの立方体かBlenderのSuzanneを.objから取り込むポリゴンモデル」や「レイキャスター(迷路として知られるやつ。モデルは多くの場合2D地図)」が典型になってる気はしますが、上のようなポイントクラウド的なものもあるし、 https://scratch.mit.edu/projects/412737809/ のような、「3Dモデル」は「手書きで、規模が小さくて、頂点データとしては単純」、「描画エンジン」部分の計算量がすごく多い(レイトレーサー)、みたいなものもあります。
mugi_kun
Scratcher
2 posts

3Dについて話し合うトピック ※最初に#1を必ず読もう※

KimiruHamiru wrote:

mugi_kun wrote:

現在、新たな3D描画エンジンを作っていて、3Dモデルの形を描画することができるところまではできました。
ですがまだ、前に物があって、本来隠れていて見えてはいけない部分が前面に出てきてしまい、見えている状態になってしまっています。
皆さんはこのような対策はどのようにしていますか?
「前に物があって~どのようにしていますか?」ついて、
私についていえば、「なにも対策しない」です。しいて言えば
「半透明にする」、「単色で描く」、「全部点で描く」( https://scratch.mit.edu/projects/903953577/ )という「対策」を選ぶ(問題は起きるが、目立たなくする)ことが多い、です。
「全パーツについて手前か奥か全部調べて、奥のものから順番に描く」 https://scratch.mit.edu/projects/1076400718 という選択肢もありますが、重い処理なので(好みの問題で)私は選ばないことが多いです(この例はパーツとなる丸が「格子状に並んでる」やつなので、最適化の余地はあります)。

奥行きの処理にしても影の処理にしても、「3Dモデル」とか「描画エンジン」が、どういうものかによって、話の前提が違ってくるかなとは思います。「Scratch、3D、入門」というと「手書きの立方体かBlenderのSuzanneを.objから取り込むポリゴンモデル」や「レイキャスター(迷路として知られるやつ。モデルは多くの場合2D地図)」が典型になってる気はしますが、上のようなポイントクラウド的なものもあるし、 https://scratch.mit.edu/projects/412737809/ のような、「3Dモデル」は「手書きで、規模が小さくて、頂点データとしては単純」、「描画エンジン」部分の計算量がすごく多い(レイトレーサー)、みたいなものもあります。
ご回答本当にありがとうございます。
参考にさせていただきます。

ちなみにですが、先ほどおっしゃっていた「手書きの立方体かBlenderのSuzanneを.objから取り込むポリゴンモデル」
とは、Blenderにて作った3Dモデルをscratch内で描画するみたいなことですか?
もしそうであれば、興味があるのでその技術を使っている作品などを教えて欲しいです。

何度も質問すみません。

Powered by DjangoBB