まずこちらを見てください!
これは主にPlayanimationコマンドを使った3D Rendererです!
コマンドの解説
このコマンドは、狐を使ったPlayanimationモデリングと、Molangを使っています。
Playanimationモデリングの説明は省きます。
Playanimationコマンドのstop_expressionの欄でMolangを使うことで、variableという変数を変更でき、それによって3D Rendererが動いています。
このコマンドではアマスタにcoreという名前を付け、そのcoreにPlayanimationコマンドを実行させています。計算はすべてPlayanimation(Molang)コマンド内で行っており、それを狐モデリングで可視化させています。
1つの線はstartPositionとendPositionの2つの点を持っています。CameraはPosとRot、Fovがあり、それらを使って3Dを2Dに変換しています。
3D→2Dに変換するにあたって、次の操作が必要になります。
辺(点)をカメラの相対位置、回転に変換 → 辺をそれぞれのZ座標から2D座標に変換 → 描画
1つ目の操作ついて説明します。
ある点を回転させるとき、2つの回転方法があります。オイラー角回転と、クォータニオン回転です。オイラー角はジンバルロックという、特定の角度で自由度が失われてしまう現象が発生するので、今回はクォータニオン回転を使っていきます。ですが、クォータニオンを人力で設定などをするのは難しいので、オイラー角をクォータニオンに変換することでそれらの問題を防いでいます。
点をカメラからの相対位置に変換します。これは普通に点の座標からカメラ座標を引けばいいのです。変換した相対位置を回転させるときにクォータニオンを使います。計算は難しいので説明は省きます。変換されたもののZ座標はカメラ回転に合わせられているので、そのまま奥行きになります。これをすべての辺(点)に実行します。これで1つ目の操作は完了です。
2つ目の操作について説明します。
2つ目の操作は簡単で、1つ目の操作を終えた点を使います。3D座標の点を2D座標に変換する式は以下の通りです。
(スクリーンX)=X/Z
(スクリーンY)=Y/Z
これをすべての点に実行すると3Dの座標が2Dの座標に変換され、2つ目の操作は完了です。
3つ目の操作について説明します。
今の段階で、3Dが2Dの座標に変換されました。変換されたものを描画するには、狐モデリングを使います。簡単に狐モデリングを説明すると、Playanimationの重ね掛けでスケールやポジション、回転を適応させるもので、狐はブロックを持てるので、ディスプレイとして使えます。この狐に線のデータを渡し、そこから角度や位置を割り出して描画させます。これですべての操作が完了しました。
このような操作で、3Dを2Dに変換し、描画させています。難しいところはあったと思いますが、少しでも理解して、興味があると思っていただければ幸いです。
コメント
このコマンドを最初に実行してください。
scoreboard objectives add edge dummy
scoreboard objectives add playanimation dummy
kill @e[type=fox,tag=canvas]
kill @e[type=armor_stand,name=core]
summon fox canvas_0 0 -60 0
summon fox canvas_1 0 -60 0
summon fox canvas_2 0 -60 0
summon fox canvas_3 0 -60 0
summon fox canvas_4 0 -60 0
summon fox canvas_5 0 -60 0
summon fox canvas_6 0 -60 0
summon fox canvas_7 0 -60 0
summon armor_stand core 0 -60 0
tag @e[type=fox,name=canvas_0] add canvas
scoreboard players set @e[type=fox,name=canvas_0] edge 0
tag @e[type=fox,name=canvas_1] add canvas
scoreboard players set @e[type=fox,name=canvas_1] edge 1
tag @e[type=fox,name=canvas_2] add canvas
scoreboard players set @e[type=fox,name=canvas_2] edge 2
tag @e[type=fox,name=canvas_3] add canvas
scoreboard players set @e[type=fox,name=canvas_3] edge 3
tag @e[type=fox,name=canvas_4] add canvas
scoreboard players set @e[type=fox,name=canvas_4] edge 4
tag @e[type=fox,name=canvas_5] add canvas
scoreboard players set @e[type=fox,name=canvas_5] edge 5
tag @e[type=fox,name=canvas_6] add canvas
scoreboard players set @e[type=fox,name=canvas_6] edge 6
tag @e[type=fox,name=canvas_7] add canvas
scoreboard players set @e[type=fox,name=canvas_7] edge 7