Discuss Scratch

KimiruHamiru
New Scratcher
500+ posts

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

mugi_kun wrote:

「手書きの立方体かBlenderのSuzanneを.objから取り込むポリゴンモデル」
とは、Blenderにて作った3Dモデルをscratch内で描画するみたいなことですか?
もしそうであれば、興味があるのでその技術を使っている作品などを教えて欲しいです。
編集してるうちに変な日本語表現になっちゃってましたね。
手書きの立方体」で言いたかったのは
https://scratch.mit.edu/projects/895289120/

x 0110001100111100
y 0011000110001111
z 0000011111100110
みたいな「手書きで書いた数値データ」で表現されたやつのことです。
(手書きの線画から立方体の頂点データを作る!みたいなのも最近のAIでできなくはないみたいですが、Scratchでは見たことないです)
上のプロジェクトだと、例えば「一つ目の頂点の座標」は、それぞれの最初の文字
0 0 0
を切り出して、x,y,zの値としていて、実際には回転の中心をちょっとずらしたりして使っています。
文字列を一文字ずつ解釈するとこでちょっとしたトリックを使ってますが、0,0,0に相当するデータが得られればいいので、
「リストに書いておく」のでも「定義ブロックとかの引数に書いておく」のでも本質は同じです。

BlenderのSuzanneを.objから取り込むポリゴンモデル
の話は、「ScratchでSuzanneとかいうキーワードを含むプロジェクトを検索する」と見つかると思いますが、私が書いたのでは例えば
https://scratch.mit.edu/projects/277365941/
辺りが割と単純な例です。
objファイルをテキストとしてリストに書き込んで(ステージ上にリストを表示して、右クリックから「読み込み」)おいて、
このプロジェクトの場合「おさるデータ」スプライトの中の「obj」リストにデータを置いておいて、それを解釈するして別のリストに書き込んでいます。これ系の「仕組み」を使ったプロジェクトは「obj loader」とか検索するといくつか見つかるようです。
大雑把に、Blenderが出力する.objファイルは
v 0 0 0
みたいなデータが
「文字列」としてたくさん書かれてるもの
なので、これの0 0 0の部分を「〇番目の文字」みたいなブロックを使って、うまいこと
「数値データ」として「リスト」とか「変数x,y,z」とかに書き込んで
います。それなりに複雑な処理ですが、描画時に使うのは処理後に得られるリスト「vArrayBuffer」だけなので、このリストをほかの手段で用意(ほかに得意な言語があればそれでもいいし、Excelとかで半分手作業でやってもいい)してもいいです。Suzanneを描くプロジェクトの中には、ほかの言語環境でデータを用意したようなプロジェクトもあるようです。
まったくの余談で、おすすめはしませんが、元データがテキスト形式であれば理論上は同様のことが可能なのでobj以外にgltfとかでも読めます( https://scratch.mit.edu/projects/756990792 )。ただScratchでやるのはすごい大変です。
KimiruHamiru
New Scratcher
500+ posts

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

補足。
「obj形式のデータ」を扱うプログラムを読んだり書いたりする際には、
Webで「Wavefront .objファイル」で検索すると出てくるWikpediaの「Wavefront .objファイル」項あたりが参考になると思います。
すごい大雑把には、
・頂点座標は「v 0 0 0」みたいなデータ(一般には小数で書かれる。ガチで処理する場合は指数表記も可能なはずなので結構めんどくさい)
・頂点3つ集めて三角形(仕様上は三角形以外もある)にする際に使うのは「f 1 2 3」みたいなデータ
・影(ドロップシャドウじゃなくシェーディング)を扱う場合は「vn 1 0 0」みたいなデータ(シェーディングの意味はともかく、計算は簡単)
を扱うことになります。色やテクスチャも扱えなくはないですが私はやったことないです。

obj読み込みがしたいんじゃない!Suzanneを書きたいだけなんだ!という場合は、せっかくリミックス自由なScratchなので、「誰かがすでに単純な数値のリストに変換したSuzanneのデータ」を利用するのも現実的な手段と思います。
mugi_kun
Scratcher
2 posts

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

KimiruHamiru wrote:

補足。
「obj形式のデータ」を扱うプログラムを読んだり書いたりする際には、
Webで「Wavefront .objファイル」で検索すると出てくるWikpediaの「Wavefront .objファイル」項あたりが参考になると思います。
すごい大雑把には、
・頂点座標は「v 0 0 0」みたいなデータ(一般には小数で書かれる。ガチで処理する場合は指数表記も可能なはずなので結構めんどくさい)
・頂点3つ集めて三角形(仕様上は三角形以外もある)にする際に使うのは「f 1 2 3」みたいなデータ
・影(ドロップシャドウじゃなくシェーディング)を扱う場合は「vn 1 0 0」みたいなデータ(シェーディングの意味はともかく、計算は簡単)
を扱うことになります。色やテクスチャも扱えなくはないですが私はやったことないです。

obj読み込みがしたいんじゃない!Suzanneを書きたいだけなんだ!という場合は、せっかくリミックス自由なScratchなので、「誰かがすでに単純な数値のリストに変換したSuzanneのデータ」を利用するのも現実的な手段と思います。
ご回答ありがとうございます。

そうですね、私が作ろうとしているのはそういう、外部ソフトの3Dモデルを
scratch上で描画するものなので、本当に参考になりました。
教えていただいたことを活かして頑張って作ってみます。
本当にありがとうございました!
oligami
Scratcher
100+ posts

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

#317

mugi_kun wrote:

前に物があって、本来隠れていて見えてはいけない部分が前面に出てきてしまい、見えている状態になってしまいます。
ソートを用いた手法の場合は、大まかな視点の方向ごとにBSP木を構成して、pushソートで補正が一番負荷が少ないかなと思います。
私は、三角形の重心までの距離でソートする手法をよく使います。

mugi_kun wrote:

画面端にて描画しようとすると形が崩れてしまう現象の対策
画面外でもペンを使える裏技があります。

mugi_kun wrote:

影をつける仕組みはどのようにしているのでしょうか。
ここで説明するのは難しいのですが、「投影 (図学)」と調べるとwikiが出てきます。
基本的には、物体の各頂点ごとに、光源と直線を結び、影を映す平面との交点を導きます。この交点で構成された図形が影です。

#321

mugi_kun wrote:

Blenderにて作った3Dモデルをscratch内で描画する
参考になるかはわかりませんが、私が昔作った、objファイルとmtlファイルから、色まで読み込めるやつがあります。例えば、最初から入ってる4,5番あたりのデータは、ネット上のフリーのモデルを、Blenderで変換したものだったと思います。
ただ、多角形の表示部分が壊れているのと、曲面は表示できないのと、重いのでTurbowarpを使わないといけないことが注意点です。
https://scratch.mit.edu/projects/719665030/
oligami
Scratcher
100+ posts

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

#310

finalbacon wrote:

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

oligami wrote:

#310

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

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

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

分かりづらいと思うので図を載せときます。

#316

kokkun1 wrote:

ある方の詳しく解説されたチュートリアルがあります。
https://scratch.mit.edu/projects/470897319/
このチュートリアルは線分の場合についてのみ書いていますが、三角形の場合も(四角形になる場合も考慮しなければならないことを除いて)だいたい同じです。
塗りつぶされた三角形の場合についてのプログラムを書いたことがあるので貼っておきます。
https://scratch.mit.edu/projects/765064224/
(三角形を塗りつぶす部分のプログラムが微妙だったりします)

新しく3Dエンジンを作っていたので遅くなりましたが、kokkun1さんのより、しっかり実装したのができたので、どうぞ
※私は私の書いた理論(#311)で作りましたが、理論的には同じだと思います。

https://scratch.mit.edu/projects/1152532927/
kaisuke9244
Scratcher
100+ posts

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

こちらのバグわかりますか
Scratch-1106
Scratcher
70 posts

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

クローンで奥行きを表現させるためにクローンを大きさ順に並び替えたい(小さいクローンは奥に、大きいクローンは手前に、みたいな感じにしたい)のですがどうしたらいいでしょうか?色々試してみたんですけどできませんでした。
ioqj
Scratcher
500+ posts

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

Scratch-1106 wrote:

(#328)
クローンで奥行きを表現させるためにクローンを大きさ順に並び替えたい(小さいクローンは奥に、大きいクローンは手前に、みたいな感じにしたい)のですがどうしたらいいでしょうか?色々試してみたんですけどできませんでした。
「どうすればいいか」という質問に対して、答えが一つとは決まっていないことが多いので、その「色々試してみた」ものを共有して頂けると、想定している答えにたどり着くことが出来ると思います。
Scratch-1106
Scratcher
70 posts

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

これが1番成功に近かったと思います
てか今試してみたら成功してました。でも定義を使って画面を再描画せずに実行するとバグります。どうしたらいいでしょうか?
ioqj
Scratcher
500+ posts

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

Scratch-1106 wrote:

(#330)
これが1番成功に近かったと思います
てか今試してみたら成功してました。でも定義を使って画面を再描画せずに実行するとバグります。どうしたらいいでしょうか?
プロジェクトを拝見してみましたが、「クローンの大きさは生成される度にランダムに決められる」という条件の下で #328 のような内容を実行したい、という解釈で正しいですか?
また、定義ブロックはどのように挿入しようとして失敗したのでしょうか?
失敗したときのスクリプトの全容を、ブロックプラグインでここに張り付けるなどでいいので、教えてほしいです。

Last edited by ioqj (May 5, 2025 13:05:06)

Scratch-1106
Scratcher
70 posts

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

ブロックプラグインの使い方がいまいち分からないのでこれのスプライト2に入れておきました
ioqj
Scratcher
500+ posts

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

Scratch-1106 wrote:

(#332)
ブロックプラグインの使い方がいまいち分からないのでこれのスプライト2に入れておきました
ありがとうございます。
再描画をせずに実行する定義ブロックを入れたという事は、クローンが大きさ順にソートされて表示される段階を見せたくなかったから、という事なのでしょうか?
kaisuke9244
Scratcher
100+ posts

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

Scratch-1106
Scratcher
70 posts

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

ioqj wrote:

Scratch-1106 wrote:

(#332)
ブロックプラグインの使い方がいまいち分からないのでこれのスプライト2に入れておきました
ありがとうございます。
再描画をせずに実行する定義ブロックを入れたという事は、クローンが大きさ順にソートされて表示される段階を見せたくなかったから、という事なのでしょうか?
そうです!どうしたらいいのでしょうか…?
ioqj
Scratcher
500+ posts

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

Scratch-1106 wrote:

ioqj wrote:

再描画をせずに実行する定義ブロックを入れたという事は、クローンが大きさ順にソートされて表示される段階を見せたくなかったから、という事なのでしょうか?
そうです!どうしたらいいのでしょうか…?
僕が考えてみたやり方は、こんな感じです:
@greenflag が押されたとき
隠す
(10) 回繰り返す
(自分自身 v) のクローンを作る
end
[あ v] を (0) にする
(300) 回繰り返す
[あ v] を (1) ずつ変える
end
(メッセージ1 v) を送って待つ
隠す

クローンされたとき
大きさを ((1) から (300) までの乱数) %にする
<(あ) = (大きさ)> まで待つ
[最前面 v] へ移動する//最背面でも

[メッセージ1 v] を受け取ったとき
表示する
決して早くはないですが、クローンを隠しながらレイヤーがソートされるので、クローンがソートされる様子を閲覧者に見せないようにすることができると思います。試してみてください。
わからないところがあったらまた教えてください。
Scratch-1106
Scratcher
70 posts

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

#336
確かに、最初は隠しておいて大きさ順に変えてから表示させればいいですね!その発想はありませんでした!本当にありがとうございます!!
kaisuke9244
Scratcher
100+ posts

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

finalbacon
Scratcher
100+ posts

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

#338
どういう状況の時それが起こるのか明確に書いていただけると解決しやすくなると思います。
rotXという変数が180あたりになったとき、上下が反転してしまっている、という問題であっていますか?
なら、「何もおかしくない」が答えになります。この作品のrotXは「前を向いている時を0°としたときの頭の角度」と対応していると考えるとわかりやすいと思います。rotXが大きくなりすぎる時、頭の状態は「体操の後ろ反り」みたいな感じになっています。頭自体が上下反転しているので、景色が逆に見えてしまうのですね。実際にやってみるとよくわかると思います。正常な動作です。
ただ、気持ち悪いのもよくわかります。そういうときは、そもそもそういう状況にならないようにすれば解決できます。

また、上下が変わってしまう話とは変わりますが、rotX、Yを変える動作が少し直感的でない感じがします。横向きのマウス座標が縦向きの回転と対応しているからです。逆にすると直感的になると思います。

Last edited by finalbacon (May 8, 2025 14:12:27)

souichi0514
Scratcher
21 posts

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

こちらの作品がうまく動きません。3Dの頂点を2Dに変換するシステムがうまく機能していないみたいです。Wikiに載っているコードをそのまま使用したので、Wikiに載っているコードが間違っているんでしょうか。
yukiscratch44
Scratcher
15 posts

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

souichi0514 wrote:

こちらの作品がうまく動きません。3Dの頂点を2Dに変換するシステムがうまく機能していないみたいです。Wikiに載っているコードをそのまま使用したので、Wikiに載っているコードが間違っているんでしょうか。
それぞれの変数が正しく指定されていません。Wikiと自分の作品をよく比べると分かるかと思います。
修正済み: https://scratch.mit.edu/projects/1172428229/

Powered by DjangoBB