Discuss Scratch

_inosisisamaaonly
Scratcher
8 posts

意外と知られていないテクニック集

今回は3Dエンジンを投稿しようと思う。
使う物は回転行列たったこれだけだ。
定義 3D P((pos_x),(pos_y),(pos_z) )rot x:(rot_x)rot y:(rot_y)
[x v] を ((pos_x) - (center_x)) にする
[y v] を ((pos_y) - (center_y)) にする
[z v] を ((pos_z) - (center_z)) にする
[f v] を (x) にする
[x v] を (((f) * ([cos v] \( (rot_x) \))) - ((z) * ([sin v] \( (rot_x) \)))) にする
[z v] を (((z) * ([cos v] \( (rot_x) \))) + ((f) * ([sin v] \( (rot_x) \)))) にする
[f v] を (y) にする
[y v] を (((f) * ([cos v] \( ((-1) * (rot_y)) \))) + ((z) * ([sin v] \( ((-1) * (rot_y)) \)))) にする
[z v] を (((z) * ([cos v] \( ((-1) * (rot_y)) \))) - ((f) * ([sin v] \( ((-1) * (rot_y)) \)))) にする
[x v] を (((x) - (cam_x)) + (center_x)) にする
[y v] を (((y) - (cam_y)) + (center_y)) にする
[z v] を (((z) - (cam_z)) + (center_z)) にする
[f v] を (x) にする
[x v] を (((f) * ([cos v] \( (cam_rot_x) \))) - ((z) * ([sin v] \( (cam_rot_x) \)))) にする
[z v] を (((z) * ([cos v] \( (cam_rot_x) \))) + ((f) * ([sin v] \( (cam_rot_x) \)))) にする
[f v] を (y) にする
[y v] を (((f) * ([cos v] \( ((-1) * (cam_rot_y)) \))) + ((z) * ([sin v] \( ((-1) * (cam_rot_y)) \)))) にする
[z v] を (((z) * ([cos v] \( ((-1) * (cam_rot_y)) \))) - ((f) * ([sin v] \( ((-1) * (cam_rot_y)) \)))) にする
[return v] を [success] にする
もし <(z) < (0)> なら
[return v] を [error] にする
end
[2D_x v] を (((360) * (x)) / (z)) にする
[2D_y v] を (((360) * (y)) / (z)) にする

~~~~~~~変数説明(補足)~~~~~~~~
(f)
作業用変数(記録)

(x)
一時的に回転変換後のx座標を記録しておく変数
(y)
一時的に回転変換後のy座標を記録しておく変数
(z)
一時的に回転変換後のz座標を記録しておく変数

(center_x)
たとえば3次元空間に6面体があるとする。その6面体の中心の座標x
(center_y)
たとえば3次元空間に6面体があるとする。その6面体の中心の座標y
(center_z)
たとえば3次元空間に6面体があるとする。その6面体の中心の座標z
(あくまでも6面体は例)

(cam_x)
自分のx座標
(cam_y)
自分のy座標
(cam_z)
自分のz座標

(cam_rot_x)
自分の横向きの回転(y軸に対する回転)
(cam_ rot_y)
自分の縦向きの回転(x軸に対する回転)

(2D_x)
三次元(空間)座標を二次元(平面)座標に変換したときの座標x
(2D_y)
三次元(空間)座標を二次元(平面)座標に変換したときの座標y

(return)
(z)
が0未満かを判定し、その結果を保存する
~~~~~定義ブロックの引数説明~~~~~~~~
pos_x 三次元(空間)座標に変換したい座標x
pos_y 三次元(空間)座標に変換したい座標y
pos_z 三次元(空間)座標に変換したい座標z

rot_x (center_x,center_y,center_z)を中心としたときの(pos_x,pos_y,pos_z)の横向きの回転( (center_x,center_y,center_z)を通るy軸に対する回転)
rot_y (center_x,center_y,center_z)を中心としたときの(pos_x,pos_y,pos_z)の縦向きの回転( (center_x,center_y,center_z)を通るx軸に対する回転)
~~~~~~~~~~追記~~~~~~~~~~~~
また、プログラムに
[2D_x v] を (((360) * (x)) / (z)) にする
[2D_y v] を (((360) * (y)) / (z)) にする
としているが、この360は時と場合によって変更して使うとよい。

(return)
にはzが0未満かを判断し保存すると先ほど言ったが、なぜこのようなことをするかと言うとz座標が負の数であるということはその座標が自分より後ろだということを表している。自分より後ろのものは人間が草食動物でない限り(笑)当然見ることはできないため、あえてerrorとすることでそのことを報告している。

本当はroll pitch yawを使いたいところだが、scratchでよく創作されている3次元アクションゲームは上下左右の矢印キーで辺りを見回すことになっているようなので都合が悪い。その為今回は回転方法を2種類に限定してプログラムを組んだつもりだ。

回転行列の証明については個人で検索をかけて調べてくれ。

どうせだったら視野も限定したいという人に。scratchの画面はx軸に480px、y軸に360pxと限られている為画面外にはみ出た物は画面に表示されない。この事を利用するために2D変換後の座標である2D_x,2D_yを算出するプログラムを
[f v] を ((180) / (視野(度))) にする
[2D_x v] を ((((360) * (x)) / (z)) * (f)) にする
[2D_y v] を ((((360) * (y)) / (z)) * (f)) にする
とすることで画面外にはみ出させる。これにより、プレイヤーにはあたかもそれが無いように見せかけることができる。ただし、これは大変簡易的な物であるため180度を超えることはできない。180度を超える時はまた新たな回転行列に似たものを用意しなくてはならない。そこは各自で研究して貰うようにする。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

Last edited by _inosisisamaaonly (July 31, 2023 00:02:15)

taiyo_a
Scratcher
100+ posts

意外と知られていないテクニック集

[色 v] の効果を ((1) / (0)) にする

これで、なんと画像がモノクロになります。
ですが、これは試したところ、私の家にある端末で試してみると、三種中一種だけ上手く作動しませんでした。
さらにさらに、あるひらめきで、「モノクロは色が黒と白を混ぜただけなので、モノクロに画像をしてから色を判別するプログラムを使うと、画像をスキャンするプログラムが簡単になるのではないか」、と思い試してみたのですが、上手くいかず、何とその色を判別するスプライトは、スキャンしたい画像の
モノクロにする前の色にも、モノクロにした後の色にも触れていないことになりました!どういうことかっていうと、
<[#22aca0] 色に触れた>
のプログラムって、背景から色を取り出すことができるじゃないですか?で、モノクロにした背景からその色を取り出し、スプライトをそこに置き
trueかfalseか調べてみると、何とfalseを示しました。
その後、見えている色と画面上の色が違ってしまうバグがあったのを思い出し、モノクロにする前の色で同様に試してもfalseになったのです。

興奮しすぎて喋りすぎてしまったけれど、わかりにくかったらごめんなさい。
104toshi
New Scratcher
5 posts

意外と知られていないテクニック集

なめらかに行かない際は、
[右] キーが押されたとき
(1) 歩動かす
ではなく、
[右] キーが押されたとき
<<[右] キーが押された> ではない> まで繰り返す
(1) 歩動かす
(0.03) 秒待つ
end
のようにするといい
KRTSD0823
Scratcher
100+ posts

意外と知られていないテクニック集

104toshi wrote:

なめらかに行かない際は、
[右] キーが押されたとき
(1) 歩動かす
ではなく、
[右] キーが押されたとき
<<[右] キーが押された> ではない> まで繰り返す
(1) 歩動かす
(0.03) 秒待つ
end
のようにするといい
0.03秒待つは要らないですね
_inosisisamaaonly
Scratcher
8 posts

意外と知られていないテクニック集

暇だから投稿。
まぁ数学の定理をそのまま書いただけなんだけど⭐︎

定義 三角形の内接円 x1:(x1)y1:(y1)x2:(x2)y2:(y2)x3:(x3)y3:(y3)
[AB v] を ([floor v] \( ((((x1) - (x2)) * ((x1) - (x2))) + (((y1) - (y2)) * ((y1) - (y2)))) \)) にする
[BC v] を ([floor v] \( ((((x2) - (x3)) * ((x2) - (x3))) + (((y2) - (y3)) * ((y2) - (y3)))) \)) にする
[AC v] を ([floor v] \( ((((x1) - (x3)) * ((x1) - (x3))) + (((y1) - (y3)) * ((y1) - (y3)))) \)) にする
[三角形の面積 v] を ((((AB) + (BC)) + (AC)) / (2)) にする
[内接円半径 v] を (((2) * (三角形の面積)) / (((AB) + (BC)) + (AC))) にする
[内接円中心x v] を (((((x3) * (AB)) + ((x1) * (BC))) + ((x2) * (CA))) / (((AB) + (BC)) + (AC))) にする
[内接円中心y v] を (((((y3) * (AB)) + ((y1) * (BC))) + ((y2) * (CA))) / (((AB) + (BC)) + (AC))) にする

本当は位置ベクトルで表したいんだけど…。scratchはしょうがない…。
zonbi1014
Scratcher
7 posts

意外と知られていないテクニック集

kusitomo wrote:

りみっくすつり一ってどうやって使うの?
リミックスツリーはスクラッチチームによって削除されたとかいう話を聞いたことがあります
zonbi1014
Scratcher
7 posts

意外と知られていないテクニック集

zonbi1014 wrote:

kusitomo wrote:

りみっくすつり一ってどうやって使うの?
リミックスツリーはスクラッチチームによって削除されたとかいう話を聞いたことがあります
でもたまにプロジェクトを見るとリミックスツリーのHPに飛べるように作者がHPをかいていることもあります
正直やり方はわかりません
Clemens829
Scratcher
100+ posts

意外と知られていないテクニック集

リミックスツリーは削除されていません。このようにURLの末尾に/remixtreeと付ければ見れます。昔は表示するボタンもあったのですが削除されました。何故。それと質問は質問コーナーでお願いします。
追記:この質問に既視感があったので調べたらこのトピの#15ですね。もう既に回答されているので回答は不要だと思われます。そもそも2017年の投稿ですし。

Last edited by Clemens829 (Aug. 4, 2023 00:02:07)

kingtaiyaki
Scratcher
8 posts

意外と知られていないテクニック集

作品を作っている途中にCommand+Sを押して保存できる

もし< [command+s]  キーが押された> なら
保存する
end

KRTSD0823
Scratcher
100+ posts

意外と知られていないテクニック集

kingtaiyaki wrote:

作品を作っている途中にCommand+Sを押して保存できる

もし< [command+s]  キーが押された> なら
保存する
end


付け足し
これはMacの場合です。windowsはCtrl+Sです。
Yukihisa2022
Scratcher
1000+ posts

意外と知られていないテクニック集

[wp]ja:記事名[/wp] 
ウィキペディア日本語版 のリンクが載せられる
例↓
ja:Scratch (プログラミング言語)
kouryou118103
Scratcher
1000+ posts

意外と知られていないテクニック集

コスチュームごとにクローンを作りたいけど、時間差(一定ではない)をつけたい…

そんなときは、
①コスチューム名を出現する時間(タイマーを使用するので時間(秒)がおすすめ)にする
②以下のようにプログラムを組む

コスチュームを [0 v] にする//1番目のコスチューム  「コスチュームを(()+())にする」で代用もできる
[n v] を [10] にする//コスチュームの個数
(n) 回繰り返す
<(コスチュームの名前::looks) > (タイマー)> まで待つ
[自分自身 v] のクローンを作る
次のコスチュームにする
end
クローンされたとき
…//やりたいこと(場所とか)

これで、タイマーの時間になったらクローンできる!
これを応用すれば、時間ごとに出てくる障害物になったりするかも…?
yama918
Scratcher
18 posts

意外と知られていないテクニック集

((2) * ([切り下げ v] \( ((数) / (2)) \))
これで数を偶数にできます。切り上げにしても同じです。

もうあったらごめんなさい。
taiyo_a
Scratcher
100+ posts

意外と知られていないテクニック集

#3828
こんな方法も
((変数) + ((変数) を (2) で割った余り))
あります。初心者にも理解できるシンプルな構造です。
ashiato0521
Scratcher
18 posts

意外と知られていないテクニック集

[音量] > (80) のとき
これで叫ぶとプロジェクトが始まるようにできる
taiyo_a
Scratcher
100+ posts

意外と知られていないテクニック集

[色 v] の効果を ([] と [Infinity]) にする
でモノクロ画像になります。
hanya326
Scratcher
100+ posts

意外と知られていないテクニック集

<[ ((shift) + ())] キーが押された>

シフトキー検知
KRTSD0823
Scratcher
100+ posts

意外と知られていないテクニック集

hanya326 wrote:

<[ ((shift) + ())] キーが押された>

シフトキー検知
現在は不可能です。https://scratch-mit-edu.ezproxyberklee.flo.org/projects/78816118/
zonbi1014
Scratcher
7 posts

意外と知られていないテクニック集

Clemens829 wrote:

リミックスツリーは削除されていません。このようにURLの末尾に/remixtreeと付ければ見れます。昔は表示するボタンもあったのですが削除されました。何故。それと質問は質問コーナーでお願いします。
追記:この質問に既視感があったので調べたらこのトピの#15ですね。もう既に回答されているので回答は不要だと思われます。そもそも2017年の投稿ですし。
削除されたというのはボタンのことということですか?
ボタンだとするのであれば簡単にできますね
hanya326
Scratcher
100+ posts

意外と知られていないテクニック集

本当だ出来ませんでした前までできたのに、、、、、

Powered by DjangoBB