Discuss Scratch
- Discussion Forums
- » 日本語
- » 意外と知られていないテクニック集
- _inosisisamaaonly
-
8 posts
意外と知られていないテクニック集
今回は3Dエンジンを投稿しようと思う。
使う物は回転行列たったこれだけだ。
~~~~~~~変数説明(補足)~~~~~~~~
(あくまでも6面体は例)
~~~~~定義ブロックの引数説明~~~~~~~~
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軸に対する回転)
~~~~~~~~~~追記~~~~~~~~~~~~
また、プログラムに
本当はroll pitch yawを使いたいところだが、scratchでよく創作されている3次元アクションゲームは上下左右の矢印キーで辺りを見回すことになっているようなので都合が悪い。その為今回は回転方法を2種類に限定してプログラムを組んだつもりだ。
回転行列の証明については個人で検索をかけて調べてくれ。
どうせだったら視野も限定したいという人に。scratchの画面はx軸に480px、y軸に360pxと限られている為画面外にはみ出た物は画面に表示されない。この事を利用するために2D変換後の座標である2D_x,2D_yを算出するプログラムを
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
使う物は回転行列たったこれだけだ。
定義 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)) にするとしているが、この360は時と場合によって変更して使うとよい。
[2D_y v] を (((360) * (y)) / (z)) にする
(return)にはzが0未満かを判断し保存すると先ほど言ったが、なぜこのようなことをするかと言うとz座標が負の数であるということはその座標が自分より後ろだということを表している。自分より後ろのものは人間が草食動物でない限り(笑)当然見ることはできないため、あえてerrorとすることでそのことを報告している。
本当はroll pitch yawを使いたいところだが、scratchでよく創作されている3次元アクションゲームは上下左右の矢印キーで辺りを見回すことになっているようなので都合が悪い。その為今回は回転方法を2種類に限定してプログラムを組んだつもりだ。
回転行列の証明については個人で検索をかけて調べてくれ。
どうせだったら視野も限定したいという人に。scratchの画面はx軸に480px、y軸に360pxと限られている為画面外にはみ出た物は画面に表示されない。この事を利用するために2D変換後の座標である2D_x,2D_yを算出するプログラムを
[f v] を ((180) / (視野(度))) にするとすることで画面外にはみ出させる。これにより、プレイヤーにはあたかもそれが無いように見せかけることができる。ただし、これは大変簡易的な物であるため180度を超えることはできない。180度を超える時はまた新たな回転行列に似たものを用意しなくてはならない。そこは各自で研究して貰うようにする。
[2D_x v] を ((((360) * (x)) / (z)) * (f)) にする
[2D_y v] を ((((360) * (y)) / (z)) * (f)) にする
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Last edited by _inosisisamaaonly (July 31, 2023 00:02:15)
- taiyo_a
-
100+ posts
意外と知られていないテクニック集
[色 v] の効果を ((1) / (0)) にする
これで、なんと画像がモノクロになります。
ですが、これは試したところ、私の家にある端末で試してみると、三種中一種だけ上手く作動しませんでした。
さらにさらに、あるひらめきで、「モノクロは色が黒と白を混ぜただけなので、モノクロに画像をしてから色を判別するプログラムを使うと、画像をスキャンするプログラムが簡単になるのではないか」、と思い試してみたのですが、上手くいかず、何とその色を判別するスプライトは、スキャンしたい画像の
モノクロにする前の色にも、モノクロにした後の色にも触れていないことになりました!どういうことかっていうと、
<[#22aca0] 色に触れた>のプログラムって、背景から色を取り出すことができるじゃないですか?で、モノクロにした背景からその色を取り出し、スプライトをそこに置き
trueかfalseか調べてみると、何とfalseを示しました。
その後、見えている色と画面上の色が違ってしまうバグがあったのを思い出し、モノクロにする前の色で同様に試してもfalseになったのです。
興奮しすぎて喋りすぎてしまったけれど、わかりにくかったらごめんなさい。
- 104toshi
-
5 posts
意外と知られていないテクニック集
なめらかに行かない際は、
[右] キーが押されたときではなく、
(1) 歩動かす
[右] キーが押されたときのようにするといい
<<[右] キーが押された> ではない> まで繰り返す
(1) 歩動かす
(0.03) 秒待つ
end
- KRTSD0823
-
100+ posts
意外と知られていないテクニック集
0.03秒待つは要らないですね なめらかに行かない際は、[右] キーが押されたときではなく、
(1) 歩動かす[右] キーが押されたときのようにするといい
<<[右] キーが押された> ではない> まで繰り返す
(1) 歩動かす
(0.03) 秒待つ
end
- _inosisisamaaonly
-
8 posts
意外と知られていないテクニック集
暇だから投稿。
まぁ数学の定理をそのまま書いただけなんだけど⭐︎
本当は位置ベクトルで表したいんだけど…。scratchはしょうがない…。
まぁ数学の定理をそのまま書いただけなんだけど⭐︎
定義 三角形の内接円 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
-
7 posts
意外と知られていないテクニック集
リミックスツリーはスクラッチチームによって削除されたとかいう話を聞いたことがあります りみっくすつり一ってどうやって使うの?
- zonbi1014
-
7 posts
意外と知られていないテクニック集
でもたまにプロジェクトを見るとリミックスツリーのHPに飛べるように作者がHPをかいていることもありますリミックスツリーはスクラッチチームによって削除されたとかいう話を聞いたことがあります りみっくすつり一ってどうやって使うの?
正直やり方はわかりません
- kingtaiyaki
-
8 posts
意外と知られていないテクニック集
作品を作っている途中にCommand+Sを押して保存できる
もし< [command+s] キーが押された> なら
保存する
end
- KRTSD0823
-
100+ posts
意外と知られていないテクニック集
作品を作っている途中にCommand+Sを押して保存できる付け足しもし< [command+s] キーが押された> なら
保存する
end
これはMacの場合です。windowsはCtrl+Sです。
- kouryou118103
-
1000+ posts
意外と知られていないテクニック集
コスチュームごとにクローンを作りたいけど、時間差(一定ではない)をつけたい…
そんなときは、
①コスチューム名を出現する時間(タイマーを使用するので時間(秒)がおすすめ)にする
②以下のようにプログラムを組む
これで、タイマーの時間になったらクローンできる!
これを応用すれば、時間ごとに出てくる障害物になったりするかも…?
そんなときは、
①コスチューム名を出現する時間(タイマーを使用するので時間(秒)がおすすめ)にする
②以下のようにプログラムを組む
コスチュームを [0 v] にする//1番目のコスチューム 「コスチュームを(()+())にする」で代用もできる
[n v] を [10] にする//コスチュームの個数
(n) 回繰り返す
<(コスチュームの名前::looks) > (タイマー)> まで待つ
[自分自身 v] のクローンを作る
次のコスチュームにする
end
クローンされたとき
…//やりたいこと(場所とか)
これで、タイマーの時間になったらクローンできる!
これを応用すれば、時間ごとに出てくる障害物になったりするかも…?
- yama918
-
18 posts
意外と知られていないテクニック集
((2) * ([切り下げ v] \( ((数) / (2)) \))これで数を偶数にできます。切り上げにしても同じです。
もうあったらごめんなさい。
- taiyo_a
-
100+ posts
意外と知られていないテクニック集
#3828
こんな方法も
こんな方法も
((変数) + ((変数) を (2) で割った余り))あります。初心者にも理解できるシンプルな構造です。
- KRTSD0823
-
100+ posts
意外と知られていないテクニック集
現在は不可能です。https://scratch-mit-edu.ezproxyberklee.flo.org/projects/78816118/<[ ((shift) + ())] キーが押された>
シフトキー検知