Excelの図形だけで動く3Dルービックキューブ|AI登場前に書いたVBAクラス12個のしくみ
まずは動画で、キューブが動く様子と、しくみの全体をご覧ください。
このルービックキューブは、Excelのワークシートに図形(シェイプ)を並べて描いています。3Dの機能や外部のライブラリは使っていません。1コマごとに小さな四角形の図形を描き直し、その画面を画像として保存して、つなげて動画にしています。

この記事では、動画の内容を文章と画面で振り返ります。数学の話が多く出てきますが、すべてを理解する必要はありません。「Excelの中でこんな計算をしているのか」という雰囲気を感じていただければうれしいです。
AIが登場する前に書いたプログラム
作ったのは2022年1月です。ChatGPTが公開されたのは2022年11月なので、その10か月ほど前になります。
ベクトルの計算、行列、平面の方程式といった部品も、すべて自分でクラスとして書いています。下の画面は、ベクトルの外積を計算する部分の実際のコードです。

規模は、クラスが12個、コードが約5,000行です。ここからは、動画と同じ4つの章に分けて紹介します。
第1章:本当に図形でできているのか
まずは証拠からです。描かれたキューブの図形を、マウスでつかんで引っ張ってみました。

小さな四角形が1枚ずつ外れていきます。外れた跡には黒い面が見えます。立方体の内側の面を黒く塗っているためで、ただの絵ではなく、立方体を組み立てて描いていることが分かります。
まとめて選んで横に引き伸ばすと、キューブがただの図形の集まりだということがよく分かります。

12個のクラスを5つの層に分けた
中身は、12個のクラスが5つの層に分かれています。下の層ほど単純な道具で、上の層はそれを組み合わせて使います。
数学:ベクトル(clsVector3D)、直線の式(clsLineEq)、平面の式(clsPlateEq)
形:空間に置いた多角形(clsPlate3D)と線(clsLine3D)
描画:多角形をExcelの図形に変える(clsShapePlate3D と、その集まりの clsShapePlates3D など)
部品:面6枚でできた立方体(clsCube)
全体:立方体を集めたルービックキューブ(clsRubiksCube)と、回転の管理(clsRubiksCubeRotation)

1コマごとに描き直す
1コマを描くたびに、次の4つをくり返しています。
視点を決める
空間の点を画面に写す
面の前後を並べる
光の向きから色を塗る
描いた画面は、セルの範囲ごと画像として保存します。5×5のキューブでは402コマを保存し、それをつないで動画にしました。

第2章:3Dを画面に写す
立方体の向きは3本のベクトルで決まる
立方体の位置と向きは、X方向とY方向の2本のベクトルと、基準になる点の3つだけで持っています。Z方向は、2本のベクトルの外積から計算します。

回すときは、この3本に回転の行列をかけるだけです。6枚の面の位置は、回したベクトルから自動で組み立て直されます。実際のコードは次のとおりです(Z軸まわりに回す部分)。
視点から見た角度で画面の位置を決める
空間の点を画面に写すときは、視点の「右・前・上」の3本のベクトルで行列を作り、その逆行列をかけて、視点から見た座標に変えます。そこから左右と上下の角度を求めて、画面の位置にします。
角度で位置を決めるので、遠くにあるものほど画面では小さく写ります。下の図では、同じ大きさの箱でも、遠い箱(青)のほうが画面上では短くなっています。

最後に、4つの頂点をつないだ多角形を、AddPolyline でシートに描きます。これがExcelの図形になります。

第3章:手前の面を正しく描く
Excelの図形には奥行きがない
ここがいちばん苦労したところです。Excelの図形には奥行きの情報がなく、後から描いたものが上に重なるだけです。何も考えずに描くと、奥にあるはずの面が手前の面の上に出てしまいます。

そこでまず、裏を向いた面を消します。面の向きと視線の角度が90度を超えたら、その面は描きません。立方体なら、これで6枚のうち3枚ほどが減ります。

2枚ずつ前後を比べる
残った面は、2枚ずつ前後を比べます。比べ方は次のとおりです。
視点から、相手の面(B)の頂点に向かって線を引く
その線と、自分の面(A)の平面との交点を求める
交点が面Aの多角形の内側にあるかを調べる(横に伸ばした線が辺と交わる回数を数え、奇数なら内側)
内側を通り抜けていたら、視点からの距離を比べて、どちらが手前かを決める

点が多角形の内側にあるかどうかは、交わる回数で判定しています。実際のコードの一部です。
順位をつけて奥から描く
すべての組み合わせの結果を表にまとめ、行ごとに合計して順位をつけます。そして、奥の面から順に描いていきます。いちばん手前の面が最後に描かれるので、正しく重なります。

光の向きから色を計算する
面の色は、光の向きと面の角度から計算しています。光が当たらない面ほど暗くなり、立体らしく見えます。

第4章:回転の二重管理と、元に戻るしくみ
見た目と「どこに何があるか」を別々に管理する
ルービックキューブを回すとき、2つのことを別々に管理しています。
見た目:回す段の立方体だけを、少しずつ回して、なめらかに動かす
どこに何があるか:90度回り切ったところで、立方体の名前を入れた3次元の配列を入れ替える

見た目だけを回していると、何回か回したあとで「次に回す段にどの立方体があるか」が分からなくなります。そのため、立方体に「1_1_3」のような位置の名前を付け、配列で居場所を記録しています。
段を取り出し、90度回して戻す
配列の入れ替えは、回した段を2次元の配列として取り出し、90度回して、元の場所に戻すという手順です。これで、次にどの段を回しても、正しい立方体を動かせます。

ログを逆から再生して元に戻す
回した記録(どの軸の何段目を、どちら向きに回したか)は、ログとして残しています。最後は、そのログを下から順に、向きを反対にして再生し、そろった状態に戻しています。

1辺の個数は自由に変えられる
1辺の個数は自由に変えられます。1×1も、2×2も、5×5も、同じコードで動きます。
内側の見えない立方体は作らないようにしているので、そのぶん計算も軽くなります。5×5×5なら125個のうち、作るのは外側の98個だけです。

まとめ
Excelの図形だけで3Dのルービックキューブを動かすために、次のような道具を組み合わせています。
ベクトルと外積、回転の行列
逆行列と角度を使った、画面への投影
直線と平面の交点、多角形の内外判定による前後の判定
3次元の配列とログによる回転の管理

AIのない時代でも、数学と設計を一つずつ積み重ねれば、Excel VBAでここまで作ることができます。小さな部品をクラスに分けて組み合わせる考え方は、ふだんの業務ツールの開発にもそのまま生きています。
同じように図形を描き直して動かす例として、Excelで幾何学模様を自動作図するツールも紹介しています。

