はじめに
ディスプレイエンティティとは、アイテムやブロック、テキストを表示するためのエンティティです。
ディスプレイエンティティには、block_display、item_display、text_displayがありますが、text_displayは今回の説明に含みません。
本記事ではディスプレイエンティティ特有のタグの解説とそれらを使った実際の使用例を紹介します。
ディスプレイエンティティでできること
今までアイテムやブロックを表示するためには、透明のアーマースタンドにアイテムを持たせたり、falling_blockを召喚するなど回りくどい方法を使っていましたが、表示エンティティの実装により直接召喚することができるようになりました。
また、召喚したブロックやアイテムの表示位置、回転、スケールなどを自由に変更することが可能です。
さらに、位置や形の変化を滑らかにアニメーションさせる事もできます。
看板やチェスト、旗、エンドポータルなどのブロックエンティティ(タイルエンティティ)は、正しく表示されない場合があります。
召喚コマンド
- アイテムディスプレイの召喚コマンド
tagを付けることで任意のカスタムモデルやアイテムのデータで表示できます。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b}}
summon item_display ~ ~ ~ {item:{id:"apple",count:1b,components:{custom_model_data:1}}}
summon item_display ~ ~ ~ {item:{id:"potion",count:1b,components:{potion_contents:"night_vision"}}}
- ブロックディスプレイの召喚コマンド
Propertiesを付けることでブロック状態を指定できます。
summon block_display ~ ~ ~ {block_state:{Name:"stone"}}
summon block_display ~ ~ ~ {block_state:{Name:"stone_stairs",Properties:{"half":"top","facing":"east"}}}
特有のデータタグ
1. billboard
billboardはエンティティの表示をカメラに対して正対させるためのタグです。
| 値 | 内容 |
|---|---|
| fixed | 表示向きを固定します。デフォルトはこの値です。 |
| vertical | カメラに正対するよう、左右にのみ回転します。 |
| horizontal | カメラに正対するよう、上下にのみ回転します。 |
| center | カメラに正対するよう、全ての向きが回転します。 |
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},billboard:"center"}
2. brightness
描画するときの明るさレベルを指定できます。
0~15まで指定でき、15が一番明るい状態です。
デフォルトはエンティティの位置によって明るさが決まります。
| 値 | 内容 |
|---|---|
| block | ブロックによる光の値 |
| sky | 空からの光の値 |
指定する場合はblockとskyの両方を書く必要があります。(明るい方の値で表示されます)
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},brightness:{block:15,sky:0}}
例えば、表示エンティティのPosが
石ブロックの中に埋まっている場合、blockとskyの値は0になります。
泣く黒曜石に埋まっている場合、blockの値は10、skyの値は0になります。
brightnessの値を決める事によって、このデフォルトの値を無視し明るさを固定できます。
3. shadow_radius
エンティティの影の大きさの半径を指定できます。0~64の値で変化します。
エンティティの影が下のブロックに表示される距離にも影響します。
デフォルトは0で、影が無い状態です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},shadow_radius:0.5f}
4. shadow_strength
エンティティの影の濃さを指定できます。
デフォルトは1です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},shadow_radius:0.5f,shadow_strength:5f}
5. view_range
エンティティが描画される最大距離を指定できます。
デフォルトは1です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},view_range:5f}
最大距離は自分が検証した結果以下のような式になりました。
最大距離の計算式
$
(\ view\_range\ ×\ 描画距離\ ×\ 8\ )_{(max:160)}\ ×\ エンティティの描画距離
$
例えば、view_rangeが5、描画距離が6チャンク、エンティティの描画距離が50%だった場合
$(5×6×8)\geqq160より$
$160×0.5=80$
になり、80m離れたところから表示されなくなります。
6. glow_color_override
発光時の色を設定できます。
デフォルトは-1(白)でチームの色を反映させられます。
エフェクトで発光は付与できませんが、Glowingを付けることで発光させることができます。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},glow_color_override:16776960,Glowing:1}
指定する値は、256階調(0~255)のRGBを10進数で表現したものです。
発光色の計算式
$65536×(R)+256×(G)+(B)$
例えば、黄色に発光させたい場合
$
\begin{pmatrix}
R & G & B
\end{pmatrix}
=
\begin{pmatrix}
255 & 255 & 0
\end{pmatrix}
$
なので、
$
65536×255+256×255+0=16776960
$
となります。
7. height、width
カリングの当たり判定のサイズを設定できます。
画面内にカリングの当たり判定がある時のみエンティティが描画されます。
※衝突の当たり判定とは異なります
- height
カリングの垂直方向の当たり判定を設定できます。
当たり判定はY座標からY座標+heightまで広がります。
デフォルトは0(heightとwidthの両方無効)で常に表示されます。 - width
カリングの水平方向の当たり判定を設定できます。
当たり判定はX座標からX座標+widthまで広がります。
デフォルトは0(heightとwidthの両方無効)で常に表示されます。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},width:0.1,height:0.1}
Optifine等の軽量化MODを入れている場合はこのタグの有無に限らず視界外で表示しなくなることがあります。
8. transformation
エンティティの表示の移動・回転・縮尺を変更できます。
移動はtranslation、回転はleft_rotation・right_rotation、縮尺はscaleによって指定します。
召喚時のみ全ての値を指定する必要があります。
指定方法は分解形式と行列形式のどちらでも可能ですが、データタグとして保存されるのは分解形式です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},transformation:{right_rotation:[0f,0f,0f,1f],scale:[1f,1f,1f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f]}}
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},transformation:[1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f]}
表示の位置を平行移動できます。
移動距離 $[\ x\ ,y\ ,z\ ]$ の値をリスト形式で指定します。
デフォルトの値は、[0f,0f,0f] です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},transformation:{right_rotation:[0f,0f,0f,1f],scale:[1f,1f,1f],left_rotation:[0f,0f,0f,1f],translation:[0.5f,1f,-0.5f]}}
表示の拡大率を変更できます。
各軸の拡大率 $[\ x\ ,y\ ,z\ ]$ の値をリスト形式で指定します。
デフォルトの値は、[1f,1f,1f] です。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},transformation:{right_rotation:[0f,0f,0f,1f],scale:[1f,3f,2f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f]}}
表示の回転を指定できます。
指定方法は四元数形式と軸角形式のどちらでも可能ですが、データタグとして保存されるのは四元数形式です。
デフォルトの値は、[0f,0f,0f,1f]です。
個人的に指定する方法は、軸角形式の方がやりやすいので、軸角形式で指定する方法を解説します。
軸角形式はaxis(回転軸となる3次元ベクトル)とangle(ラジアン)で指定します。
例えば、y軸で90°回転させたい場合、
axisは、y軸方向の単位ベクトル[0f,1f,0f]になります。
angleは、90°をラジアンにする必要があるため、
$\frac{π}{180}×90≒1.5708$ で1.5708fとなります。
結果、{axis:[0f,1f,0f],angle:1.5708f}と指定します。
もう少し応用すると、
エンティティの位置の原点を通るxy平面上の45°の軸で45°回転させたい場合
axisは、xy平面での45°の単位ベクトル $[\ cos45°,\ sin45°,\ 0\ ]$ で[0.7071f,0.7071f,0f]になります。
angleは、45°のラジアン $\frac{π}{180}×45≒0.7854$ で0.7854fになります。
結果、{axis:[0.7071f,0.7071f,0f],angle:0.7854f}と指定します。
transformationの変換順
right_rotation → scale → left_rotation → translationの順に変換が適用されるので、
right_rotationを変更すると、回転後の x、y、z がscaleに適用されます。
left_rotationを変更すると、scale変更後のエンティティを回転させられます。
summon block_display ~ ~ ~ {block_state:{Name:"furnace"},transformation:{right_rotation:{axis:[0f,1f,0f],angle:0.7854f},scale:[1f,1f,0f],left_rotation:[0f,0f,0f,1f],translation:[-0.5f,-0.5f,-0.5f]}}
summon block_display ~ ~ ~ {block_state:{Name:"furnace"},transformation:{right_rotation:[0f,0f,0f,1f],scale:[1f,1f,0f],left_rotation:{axis:[0f,1f,0f],angle:0.7854f},translation:[-0.5f,-0.5f,-0.5f]}}
9. interpolation_duration、start_interpolation
interpolation_durationで補間する時間を指定できます。
interpolation_durationの補間は、shadow_radius、shadow_strength、transformationのタグに影響します。
start_interpolationで補間が開始されるまでの時間を指定できます。
値を0にすると、すぐに変化を開始します。
値をマイナスにすることで、そのtick数だけ変化した場所からスタートします。
例えば、interpolation_durationを10、start_interpolationを-5にした時
初め5tickかけて動くはずところを0tickで変化し、残り5tickかけて最後まで変化します。
使い方としては、
shadow_radius、shadow_strength、transformationの値をdataコマンドで変更した時、start_interpolationで指定したtick後にinterpolation_durationで指定したtick数をかけて変化します。
start_interpolationはdataコマンドで変更するタイミングで付与します。
変化のタイミングについて
ディスプレイエンティティを召喚した瞬間に変化を開始することはできません。
召喚した1tick後以降にdataコマンドで変更することにより、召喚時の値から変更した値にinterpolation_durationで指定した時間をかけて変化させることができます。
※環境によっては2tick以上必要な場合があります。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},interpolation_duration:5}
data merge entity @e[type=item_display,limit=1] {transformation:{translation:[0.5f,1f,-0.5f]},start_interpolation:0}
10. teleport_duration
teleport_durationで補間する時間を指定できます。
teleport_durationの補間はディスプレイエンティティ自身のPosとRotationの変化に影響します。
つまり、エンティティをテレポートした時に指定した時間をかけて移動します。
補間中のPos、Rotationについて
teleport_durationを指定したエンティティをTPさせると外見上はゆっくり移動していますが、
実際のPosやRotationは変化後の位置にあります。
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},teleport_duration:5}
11. item_display
※このタグはアイテムディスプレイにのみ適用できます。
アイテムモデルの表示の仕方を変更できます。
| 値 | 内容 |
|---|---|
| none | デフォルトの値 |
| thirdperson_lefthand | 三人称視点での左手の表示 |
| thirdperson_righthand | 三人称視点での右手の表示 |
| firstperson_lefthand | 一人称視点での左手の表示 |
| firstperson_righthand | 一人称視点での右手の表示 |
| head | 頭に装備した時の表示 |
| gui | インベントリ上の表示 |
| ground | 地面にドロップした時の表示 |
| fixed | 額縁に飾った時の表示 |
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},item_display:thirdperson_righthand}
実際の使用例
ディスプレイエンティティを使って実際にどのようなことができるのか、
自分がX(旧Twitter)に上げたものをいくつか紹介します。
CustomModelDataでアニメーションアイテムを入れたitem_displayを一瞬表示することでカスタムパーティクルができます。
billboardと合わせて2Dのパーティクルもできます。
アニメーションアイテムをアイテムディスプレイに使ったカスタムパーティクル pic.twitter.com/Ro6ZPNjOtf
— ひろばお🙃コマンド (@Hirobao1) February 24, 2023
view_rangeをかなり小さくしてプレイヤーの目の位置にテレポートさせ続けることでできます。
三人称視点にするだけでも距離が離れるので見えなくなります。
特定の人にしか見えないエンティティできた
— ひろばお🙃コマンド (@Hirobao1) April 13, 2023
view_rangeをめっちゃ小さくしてエンティティの描画範囲を頭部内に収めた!
ホラー系とか、鬼ごっこのアイテムとかに使えそう!
0.0003にすればどの設定でも他から見えなくなる#マイクラ #コマンド pic.twitter.com/42EcXwBRMS
ディスプレイエンティティのtransformationのtranslationで表示位置を変更できるので、カスタムモデルでプレイヤーの部位毎にスケールを変更したモデルを制作し、召喚時にtranslationで部位毎に位置をずらし、バニラシェーダーで元の位置にそれぞれのテクスチャーを表示しています。
マイクラIDから誰のスキンでも出せるプレイヤーディスプレイ!
— ひろばお🙃コマンド (@Hirobao1) August 19, 2023
ポーズとらせたりエモートさせたり色々できる。
プレイヤーヘッドのスキンデータを全身に反映して、マクロでSkullOwner変えてる!@kenasoyu @komaramune @nanorann
スキン表示許可ありがとうございます!#マイクラ #コマンド pic.twitter.com/2NQIl45TER
transformationのscaleをマイナスに設定するとエンティティの内側からテクスチャを見ることができます。
さらに、left_rotationのaxisを移動方向によって傾け回転させることで浮遊感を演出しています。
マイクラで宇宙空間みたいなの作った!
— ひろばお🙃コマンド (@Hirobao1) September 10, 2023
アイテムディスプレイのスケールをマイナスにでかくして、マクロ使って操縦に沿って弾や背景を傾けたり回転させたりしてる。
浮遊感でていい感じ!
シューティングゲームとかに使えそう!#マイクラ #コマンド pic.twitter.com/K8i7nfIHGN
ディスプレイエンティティの上に乗っているMOBは、teleport_durationの補間機能の影響を受けるので、MOBやプレイヤーなども滑らかにテレポートさせることができます。
1.20.2で追加されたteleport_durationを設定したディスプレイエンティティにrideさせることで、乗ってるエンティティもTP補間させられる!
— ひろばお🙃コマンド (@Hirobao1) September 24, 2023
これでMOBやプレイヤーをカクカクさせずにTPすることが出来る!#マイクラ #コマンド pic.twitter.com/KT9db9HBod
さいごに
ディスプレイエンティティの実装により、いろんなことが可能になりました。
こういうことを書くのは初めてで拙いところもあったかもしれませんが、
皆さんのコマンド制作でこの記事がお役に立てれば幸いです。
ご清覧ありがとうございました。
……余談ですが、
私は普段コマンドでゲーム制作をしていて、YouTubeやX(旧Twitter)で投稿しています。
最近ディスプレイエンティティをメインに使った動画をYoutubeにアップロードしたので、
よければご視聴ください。