8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Minecraft CommandAdvent Calendar 2023

Day 9

ブロックディスプレイとアイテムディスプレイについて

Last updated at Posted at 2023-12-08

はじめに

ディスプレイエンティティとは、アイテムやブロック、テキストを表示するためのエンティティです。
ディスプレイエンティティには、block_displayitem_displaytext_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 空からの光の値

指定する場合はblockskyの両方を書く必要があります。(明るい方の値で表示されます)

使用例
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},brightness:{block:15,sky:0}}

例えば、表示エンティティのPos
石ブロックの中に埋まっている場合、blockskyの値は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_rotationright_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]}
  • translation

表示の位置を平行移動できます。
移動距離 $[\ 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]}}
  • scale

表示の拡大率を変更できます。
各軸の拡大率 $[\ 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]}}
  • left_rotation、right_rotation

表示の回転を指定できます。
指定方法は四元数形式と軸角形式のどちらでも可能ですが、データタグとして保存されるのは四元数形式です。
デフォルトの値は、[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_rotationscaleleft_rotationtranslationの順に変換が適用されるので、
right_rotationを変更すると、回転後の x、y、z がscaleに適用されます。
left_rotationを変更すると、scale変更後のエンティティを回転させられます。

使用例1(スケール前に回転を適用する)
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]}}
使用例2(スケール後に回転を適用する)
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_radiusshadow_strengthtransformationのタグに影響します。

start_interpolationで補間が開始されるまでの時間を指定できます。
値を0にすると、すぐに変化を開始します。
値をマイナスにすることで、そのtick数だけ変化した場所からスタートします。
例えば、interpolation_durationを10、start_interpolationを-5にした時
初め5tickかけて動くはずところを0tickで変化し、残り5tickかけて最後まで変化します。

使い方としては、
shadow_radiusshadow_strengthtransformationの値をdataコマンドで変更した時、start_interpolationで指定したtick後にinterpolation_durationで指定したtick数をかけて変化します。
start_interpolationdataコマンドで変更するタイミングで付与します。

変化のタイミングについて
ディスプレイエンティティを召喚した瞬間に変化を開始することはできません。
召喚した1tick後以降にdataコマンドで変更することにより、召喚時の値から変更した値にinterpolation_durationで指定した時間をかけて変化させることができます。
※環境によっては2tick以上必要な場合があります。

使用例コマンド1(召喚)
summon item_display ~ ~ ~ {item:{id:"apple",count:1b},interpolation_duration:5}
使用例コマンド2(召喚したエンティティに対して実行)
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の補間はディスプレイエンティティ自身のPosRotationの変化に影響します。
つまり、エンティティをテレポートした時に指定した時間をかけて移動します。

補間中のPos、Rotationについて
teleport_durationを指定したエンティティをTPさせると外見上はゆっくり移動していますが、
実際のPosRotationは変化後の位置にあります。

使用例
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のパーティクルもできます。


  • 自分しか見えないエンティティ

view_rangeをかなり小さくしてプレイヤーの目の位置にテレポートさせ続けることでできます。
三人称視点にするだけでも距離が離れるので見えなくなります。


  • プレイヤーヘッドから全身表示

ディスプレイエンティティのtransformationtranslationで表示位置を変更できるので、カスタムモデルでプレイヤーの部位毎にスケールを変更したモデルを制作し、召喚時にtranslationで部位毎に位置をずらし、バニラシェーダーで元の位置にそれぞれのテクスチャーを表示しています。


  • 巨大空間なアトラクション

transformationscaleをマイナスに設定するとエンティティの内側からテクスチャを見ることができます。
さらに、left_rotationaxisを移動方向によって傾け回転させることで浮遊感を演出しています。

  • MOBを滑らかにTP

ディスプレイエンティティの上に乗っているMOBは、teleport_durationの補間機能の影響を受けるので、MOBやプレイヤーなども滑らかにテレポートさせることができます。

さいごに

ディスプレイエンティティの実装により、いろんなことが可能になりました。
こういうことを書くのは初めてで拙いところもあったかもしれませんが、
皆さんのコマンド制作でこの記事がお役に立てれば幸いです。
ご清覧ありがとうございました。

……余談ですが、
私は普段コマンドでゲーム制作をしていて、YouTubeやX(旧Twitter)で投稿しています。
最近ディスプレイエンティティをメインに使った動画をYoutubeにアップロードしたので、
よければご視聴ください。

参考文献

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?