プロゼミseesaa Wikiより引用しているので、表記がおかしい部分があります。
現在、この記事の情報が少し不足しています。有識者はこの記事への追記お願いします。
| + | 前置き(読み飛ばしてもOK) |
#1:投影
まず、scratch、springin、プログラミングゼミなどの多くのビジュアルプログラミング言語は、x、yの2次元しかありません。
←こういうやつ
ですが、ここでは、zというもう一つの次元、つまり深さを追加します。
物体は、遠くに行くほど小さく見えるので、xとyをzで割り、それに焦点距離(focal length)を掛けることで、3dが再現できます。(焦点距離を掛ける理由は、xとyをzで割るだけだと、結果が小さい値になるため。)
これを用いて3dができます。
←こういうやつ
ですが、ここでは、zというもう一つの次元、つまり深さを追加します。
物体は、遠くに行くほど小さく見えるので、xとyをzで割り、それに焦点距離(focal length)を掛けることで、3dが再現できます。(焦点距離を掛ける理由は、xとyをzで割るだけだと、結果が小さい値になるため。)
これを用いて3dができます。
プログラム
#ref error :画像URLまたは、画像ファイル名を指定してください。
#1.5:様々なビジュアルプログラミング言語を扱う人のための解説
プログラミングゼミは、画面の中心が400,215なので、最終的に描画する際、x,yに400,215を足してください。
scratchには、画面から全部はみ出ることができませんが、大きさを1/0にすることでこの問題は解決します。
scratchには、画面から全部はみ出ることができませんが、大きさを1/0にすることでこの問題は解決します。
#2:クリッピング
3dで描画したものの後ろに行くと、ペンが後ろにあるはずのものを描こうとしているため、画面がめちゃくちゃになります。
これを解決するために、z-clippingを使用します。これは、カメラに近づきすぎた線を切り取るものです。
→
これを使うのに以下の式を使います。
これを解決するために、z-clippingを使用します。これは、カメラに近づきすぎた線を切り取るものです。
→
これを使うのに以下の式を使います。
(z1<nの場合)
clip%=(z1-n)/(z2-z1)
(x,y,z)=(x1-{(x1-x2)*clip%}, y1-{(y1-y2)*clip%},n)
(z2<nの場合)
clip%=(z2-n)/(z1-z2)
(x,y,z)=(x2-{(x2-x1)*clip%}, y2-{(y2-y1)*clip%},n)
(z1<nとz2<nの両方の条件が満たされているなら、描画しない。つまり、clip%が1未満の時。)
| 変数一覧 | 解説 |
| n | 視点をクリッピングする位置。10~20推奨。 |
| clip% | 一時的な変数。 |
プログラム
#ref error :画像URLまたは、画像ファイル名を指定してください。
#3:カメラ回転
カメラの回転軸は、水平方向(h)、垂直方向(v)の2つあります。
水平方向に回転すると、xとzが変わり、
垂直方向に回転すると、yとzが変わります。
(逆に言えば、水平方向だとyは変わらず、垂直方向だとxが変わりません。)
これを実行するには、回転行列を使用します。
水平方向に回転すると、xとzが変わり、
垂直方向に回転すると、yとzが変わります。
(逆に言えば、水平方向だとyは変わらず、垂直方向だとxが変わりません。)
これを実行するには、回転行列を使用します。
プログラミングゼミで扱える形式にすると…
水平回転(h):
x' = z*sinh + x*cosh
z' = z*cosh - x*sinh
垂直回転(v):
y' = y*cosv - z*sinv
z' = y*sinv + z*cosv
(sin、cos計算はかなり重いので、あらかじめ変数に保存しとくことを推奨します。)
プログラム
#ref error :画像URLまたは、画像ファイル名を指定してください。
#4.描画
まず、3Dワイヤーフレームの塗りつぶし方法は主に2つあります。
- 三角形ペン方式
- 変形スプライト方式
ペン方式
3Dの図形の塗り潰しはやろうとおもえばひとつの頂点からひとつの面に向かって線を引きまくるだけで塗りつぶせますが、この場合
android勢は地獄を味わいます
iOSでやると
30個あたり0.05秒。まあ早い
androidでやると
#ref error :画像URLまたは、画像ファイル名を指定してください。
30個あたり 秒。
(追記お願いします。)
内接円(三角形からギリギリはみ出さない図形)を使って、高速で描画します。
まずは3つの辺a,b,cの長さを求めたいので、それぞれの変数をこの式を使って求めます。
まずは3つの辺a,b,cの長さを求めたいので、それぞれの変数をこの式を使って求めます。
a
=√(x2-x3)+(y2-y3)
b =√(x3-x1)+(y3-y1)
c =√(x1-x2)+(y1-y2)
b =√(x3-x1)+(y3-y1)
c =√(x1-x2)+(y1-y2)
つぎに、ペンの太さを求めます。
n
=(a+b+c)/2
S =√n(n-a)(n-b)(n-c)
r (ペンの太さ)=S/n×2
S =√n(n-a)(n-b)(n-c)
r (ペンの太さ)=S/n×2
内接円を求めたあとは描画を行うx4,y4 x5,y5 x6,y6に内接円の中心の座標をいれて、内接円の大きさを1/2 1/4と減らし、描画の行う座標を頂点に近づけながら描画していけばきれいな三角形が塗りつぶせます。
プログラム
| + | ... |
プログラム2
| + | ... |
メリット / デメリット
まず大前提として、Android勢はプロゼミの最適化の問題によりカクつきが起こりやすいので注意が必要。
3D作品でパフォーマンスが発揮しやすい端末は、
Android < PC < IPhone ≒ IPad
こんな感じになる。
Android < PC < IPhone ≒ IPad
こんな感じになる。
| メリット | デメリット | |
| ペン方式 | ・Scratchのプログラムが使える~~・制作が(比較的)簡単 | ・変形スプライト式と比べて重い~~・擬似的なテクスチャ描画ができない。 |
| 変形スプライト方式 | ・ペン式より軽い~~・三角形にテクスチャを貼り付ければ擬似的なテクスチャが描画可能 | ・参考になる動画がほぼ無い~~・ペン式より難しい。 |
編集者の方々は、この3Dの計算アルゴリズムを追記していただけると幸いです。
小ネタ
プロゼミとスクラッチは、ペンの形が少し異なります。
スクラッチは両端が円のようになりますが、プロゼミでは両端がテープが切れたような形になります。
スクラッチは両端が円のようになりますが、プロゼミでは両端がテープが切れたような形になります。
zバッファとかいう謎の技術について、AIが生成したコンテンツ
| ⚠ |
注意
↓の[+](もしくは[-])の中のコンテンツの |
| + | ... |
現在このページを作る上で起こっている問題
三角形の描画手順
↑を考慮しないと、こうなる(ペン方式)
| 通常 | ごまかしver. |
|---|---|
![]() |
![]() |
不透明度を下げればギリギリ大丈夫なように見える…
コメント
- 現在、このページは少しわかりづらいので編集者は編集お願いします。 -- 名無しさん (2026-03-01 16:20:46)
- なんかすごい() -- 魚のもなか (2026-03-01 18:50:36)
- 文が長いよ -- りふぬ (2026-03-01 18:54:14)
- 変形スプライト式塗りつぶし、やっとやってることが理解できました。すごすぎる〜 -- eclipse (2026-03-13 12:36:40)
- Zバッファ法ってもしかして重すぎてプロゼミじゃできないとかありますかね -- eclipse (2026-03-13 13:24:24)
- 見た感じすごく重そうなのですが -- eclipse (2026-03-13 13:24:51)
- 実際プロゼミそのものが重いのとpythonとは違うブロック形式だから通常の3dの考え(ピクセル単位のzバッファ)が通用しづらい -- 名無しさん (2026-03-13 16:00:59)
- バックフェイスカリングつければめっちゃ軽くなりそう -- LLL (2026-03-14 14:35:18)
- 軽くはなってもプロゼミベンチマークスペックが75万のやつでも三角形を50個〜100個ぬつぶして重くなるようなやつにはどうもこうもできない(そらもんの3dを100体描画したら…ローポリゴンでもめっちゃ重くなるだろう) -- 名無しさん (2026-03-14 17:12:15)
- eclさんいたんだ -- どくろもん (2026-03-15 08:44:17)
- 3Dの研究行き詰まったからAIに専念したほうがいいかも…
-- -- --
このページの対する侮じょk(((殴 (2026-04-04 12:36:17) - 複雑すぎて頭がパーリナイ(?) -- かてらもん (2026-06-03 21:38:20)




