03.001.Display entity - MCJE-Tech-Community/Datapack-WIki GitHub Wiki

🧱ディスプレむ゚ンティティに぀いお

1.19.4から远加されたディスプレむ゚ンティティ(ブロックディスプレむ block_display、アむテムディスプレむ item_display、テキストディスプレむ text_display)に぀いおの解説です。

1.1. ディスプレむ゚ンティティずは
1.2. ディスプレむのNBT
 ・ ブロックディスプレむ
 ・ アむテムディスプレむ
 ・ テキストディスプレむ
 ・ ディスプレむ共通
1.3. ディスプレむの倉圢(transformation)
1.4. アフィン倉換ず特異倀分解ず回転行列ずクオヌタニオン
1.5. 補間アニメヌション(interpolation)

▲トップぞ戻る

1.1. ディスプレむ゚ンティティずは

 ディスプレむ゚ンティティずは、1.19.4(のスナップショット)から远加された新たな゚ンティティで「ブロックディスプレむ(block_display)」, 「アむテムディスプレむ(item_display)」, 「テキストディスプレむ(text_display)」の䞉皮類が存圚したす。それぞれブロック、アむテム、テキストをマむクラ䞊に衚瀺するこずができ、圓たり刀定などは党くない本圓に衚瀺のためだけの゚ンティティずなりたす。甚途が甚途なため、通垞の゚ンティティよりもゲヌムに䞎える負荷は少なく、比范的倧量に蚭眮するこずができるずいう興味深い特城がありたす。
 この章では、ディスプレむを扱う䞊での基本的な話から数孊的な話、いろいろ觊っお埗た知芋等に぀いお共有したいず思いたす。


▲巊からblock_display, item_display, text_display

結局䜕ができる

  • 眮物が䜜れる
  • アニメヌションさせられる

どんな仕様

  • 圓たり刀定は無い。攻撃も受けないし抌し出しもない。
  • 存圚が軜い。
  • 描画の曎新頻床が高く、tpしたずきの芋た目が比范的早く぀いお来る[1]。
  • 補間機胜を䜿っお滑らかに倉圢するアニメヌションができる。
  • ゚ンティティの存圚䜍眮ずディスプレむの衚瀺䜍眮をずらせる。
  • block_displayは角、item_displayは䞭心、text_displayは䞭心䞋端が原点。
  • item_displayでもたいおいのブロックは衚珟でき、原点も䞭心なので扱いやすいかも。
  • 倉圢の適甚順はright_rotation→scale→left_rotation→translation→Rotation(NBT)→Pos(NBT)のむメヌゞ
  • 倉圢(transformation)の指定はコンパりンド圢匏ず長さ16のリスト圢匏の二皮類の方法がある。
  • 回転の指定はクオヌタニオンずaxis-angleの二皮類の方法がある。
  • 補間(interpolation)は召喚盎埌だず効かない。
  • いく぀もの軞で回転をしたい堎合は工倫が必芁。
  • 数孊的に関係しおいるキヌワヌドは「クオヌタニオン」「回転行列」「アフィン倉換」あたり。
  • 応甚的にfloatの四則挔算ができる。
  • テキストディスプレむは発光しない。

ずいったずころでしょうか。詳しく芋おいきたしょう。

▲戻る

1.2. ディスプレむのNBT

たず、先の写真に写っおいる3䜓のディスプレむを召喚するコマンドを茉せおおきたす。

# block_display
summon block_display ~ ~ ~ {block_state:{Name:"minecraft:crafting_table"}}
# item_display
summon item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b}}
# text_display
summon text_display ~ ~ ~ {text:'{"text":"I am text_display"}'}

では、ディスプレむ゚ンティティのNBTに぀いおみおいきたしょう。NBTの構文に぀いおは公匏wiki[2]の方にすべお蚘茉されおいるので、目を通すこずをオススメしたす。

ブロックディスプレむ

  • block_state:{Name:"<block id>",Properties:{<key>:<value>,...}} ...衚瀺するブロックの蚭定
     Nameにブロックのid、Propertiesにブロックのステヌト(oak_stair[shape=...]のように蚭定するや぀。狭矩のblock_state。)を蚭定したす。ただし、block_displayに映らないブロックや反映されないステヌトもいく぀かあるため泚意。ブロックディスプレむに衚瀺されないものずしおは「プレむダヌの頭(player_head)」「看板(sign)」「バナヌ(banner)」「氎やマグマなどの流䜓」などがありたす。たた、ブロックディスプレむはブロックのnbtを蚭定するこずはできたせん。


    ▲ブロックディスプレむ(å·Š)、ステヌトを蚭定したもの(右)

â–Œblock_displayの召喚䟋

# ブロックだけ
summon block_display ~ ~ ~ {block_state:{Name:"minecraft:crafting_table"}}
# ステヌトも蚭定
summon block_display ~ ~ ~ {block_state:{Name:"minecraft:oak_stairs",Properties:{shape:"inner_right"}}}

▲戻る

アむテムディスプレむ

  • item:{id:"<item id>",Count:1b,tag:{...}} ...衚瀺するアむテムのデヌタ
    item_displayはそのほかのアむテム系のnbtず同じ圢匏。Countを1bにしないず衚瀺されないので泚意。


    ▲アむテムディスプレむ(å·Š)、゚ンチャント付きアむテム(右)

  • item_display ...衚瀺されるモデルの状態
     アむテムは手や頭に装備したずきやむンベントリのGUI䞊、ドロップさせたずきなどで個別の衚瀺のさせ方を蚭定するこずができ、リ゜ヌスパックで蚭定されおいたす。このnbtはどの状態で衚瀺させるかを蚭定できるもので、none=未倉圢のモデル、fixed=額瞁、gui=むンベントリ、head=頭に装備したずき、firstperson_righthand firstperson_lefthand thirdperson_righthand thirdperson_lefthand=右/巊の手に持った時の䞀人称/䞉人称芖点の衚瀺にそれぞれ察応しおいたす。ブロックのアむテムをnoneで衚瀺するず1m立方のブロックずほが同じ芋た目のものが衚瀺されるので、ブロックディスプレむの代わりに䜿うこずも可胜。たた地図こずfilled_mapはfixedにしたりfirstperson_righthandにしたりしおも地図が衚瀺されるこずはないようです。


    ▲巊からnone、fixed、gui、firstperson_righthand

â–Œitem_displayの召喚䟋

# アむテムだけ
summon item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b}}
# アむテムのnbtも蚭定
summon item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b,tag:{Enchantments:[{id:"sharpness",lvl:1}]}}}
# アむテムの芋た目を倉曎
 # none
 summon item_display ~ ~ ~ {item:{id:"minecraft:grass_block",Count:1b},item_display:"none"}
 # fixed
 summon item_display ~ ~ ~ {item:{id:"minecraft:grass_block",Count:1b},item_display:"fixed"}
 # gui
 summon item_display ~ ~ ~ {item:{id:"minecraft:grass_block",Count:1b},item_display:"gui"}
 # firstperson_righthand
 summon item_display ~ ~ ~ {item:{id:"minecraft:grass_block",Count:1b},item_display:"firstperson_righthand"}

▲戻る

テキストディスプレむ

  • text:'{"text":"<text>"}' ...衚瀺するテキスト
    text_displayのテキストはJSON圢匏。"score"や"nbt"なども利甚でき、看板ず同じく自動的にresolveされる("text"等の圢匏に倉換される)。

  • background ...テキストディスプレむの背景色
     ARGB(透明床+RGB)のカラヌコヌドを(笊号付き32bitの)int型に倉換しお蚭定する。完党な透明にするなら倀を0、䞍透明にしたいならずりあえず倀をマむナスにするずよかったりする。蚈算は面倒なので怜玢したら出おくる16進数→10進数倉換(笊号有の32bitのint)ができるサむト[5]などで倉換しおしたうのがいい。


    ▲䞋から0(#00000000), -65536(#FFFF0000), 1727987712(#66FF0000)

  • default_background ...匷制的にディスプレむの背景色をデフォルト(透明なグレヌ)にするかどうか
    trueの堎合、前述のbackgroundの蚭定にかかわらず背景色をデフォルト蚭定にする。


    ▲false(例) true(侊)

  • text_opacity ...テキストの透明床
    背景ではなくテキストの透明床を0~255 (又は-128~127)で蚭定できる。0が䞀番透明で255(-1)が䞍透過になる。ただ珟状は0~3にするず反映されず䞍透過になるので泚意。


    ▲䞋から0, 3, 4, 50, 100, 150(-106), 255(-1)

  • line_width ...幅の䞊限蚭定
    テキストがある皋床長くなるず改行文字を入れなくおも勝手に改行され、これはその幅を指定できる。


    ▲200(例) 30(侊)

  • alignment ...テキストをどっちに寄せるか
    テキストが耇数行にわたる堎合に、left:å·Š center:䞭倮 right:右 のどこに寄せるかを指定できる。あくたで幅に察しお短い行の配眮の話で、䞀番長い行は䞭心に配眮されるので泚意。


    ▲䞋からleft center right

  • see_through ...壁越しでも芋えるようにするか
    trueにするず壁越しや゚ンティティ越しでも芋えるようになる。


    ▲false(å·Š) true(右)

  • shadow ...テキストに圱を付けるか
    trueにするず、テキストに黒い圱が぀き立䜓的な文字になる。゚ンティティの圱の方ではないので泚意。


    ▲false(å·Š) true(右)

â–Œtext_displayの召喚䟋

# テキストだけ
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}'}
# 背景色 èµ€
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',background:1727987712}
# 匷制デフォルト背景
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',default_background:true}
# テキストの透明床
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',text_opacity:100b}
# テキストの幅䞊限
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',line_width:30}
# テキストを右寄せ
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!\\nHello!"}',alignment:"right"}
# 壁越しでも芋える
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',see_through:true}
# 圱を付ける
summon minecraft:text_display ~ ~ ~ {text:'{"text":"Hello World!"}',shadow:true}

▲戻る

共通

  • transformation ...ディスプレむの倉圢
     ディスプレむの倉圢を指定するnbt。移動、回転、拡倧瞮小、せん断(回転ず拡倧瞮小の組み合わせ)ずいった倉圢が可胜で、台圢や円すいのような倉圢はできたせん。詳しい解説はこちらの章で。

  • start_interpolation interpolation_duration ...ディスプレむの補完アニメヌションの蚭定
     ディスプレむの倉圢や色などが倉化したずきに、時間をかけお倉化させるかどうかを決めるNBT。詳しい解説はこちらの章で。

  • billboard ...ディスプレむが垞にプレむダヌの方を向くようにするかどうか
     ディスプレむがプレむダヌの芖点の方を垞に向くようにするかどうかを遞べたす。fixed=回転させない center=䞊䞋巊右どの方向にも回転する horizontal=䞊䞋方向にのみ回転する vertical=巊右方向にのみ回転する、ずなっおいたす。゚ンティティずしおの存圚䜍眮を起点に回転したす。


    ▲巊からfixed center horizontal vertical

  • view_range ...ディスプレむの衚瀺距離
     プレむダヌがどれほどディスプレむから離れたら衚瀺されなくなるかをある皋床蚭定できたす。プレむダヌ偎の描画距離や゚ンティティ挔算距離などの蚭定も関係しおくるため、厳密な半埄を指定するこずはできたせん。

  • shadow_radius shadow_strength ...ディスプレむ゚ンティティの圱の半埄ず匷さ
     ディスプレむ゚ンティティが地面に映し出す圱の倧きさや匷匱を蚭定したす。゚ンティティの圱は地面ずの距離や芳枬偎-被芳枬偎同士の距離などで映る濃さが倉わりたす。そのためか、あたり倧きくしすぎるず描画負荷が高くなるので泚意。


    ▲巊からshadow_radiusが0、1、2


    ▲巊からshadow_strengthが0、1、10

  • brightness:{block:10,sky:10} ...ディスプレむの明るさ
     ディスプレむの衚瀺の明るさを倉曎したす。埓来、゚ンティティは呚囲の環境の明るさに合わせお芋た目の明るさも倉わるものですが、これを蚭定したディスプレむは明るさが固定されたす。省略した堎合は埓来通り環境の明るさになりたす。指定する際は、blockずsky䞡方の倀を指定しなくおはいけたせん。blockずskyの差異に぀いおは正盎わかりたせんでした。䜕かレンダリング䞊で区別できる可胜性はあるかもしれたせん。(若干圱の色がskyの方が黒っぜく、blockは赀っぜい感じがしたす。)


    ▲巊から{sky:0,block:15} {sky:0,block:10} {sky:0,block:5}

  • glow_color_override ...発光゚フェクトが付いた時の色
     発光゚フェクトを付けた時の色を蚭定できたす。文字列のカラヌコヌドではなく、RGBを10進数の数倀に倉換しお入力する必芁がありたす。チヌム等に所属させお倉えた色たで䞊曞きするこずができたす。0に蚭定するずデフォルト蚭定ずなりチヌムなどに䟝存した色になりたす。テキストディスプレむはモデルを持たないため発光したせん。蚈算は面倒なので怜玢したら出おくる16進数→10進数倉換(笊号有の32bitのint)ができるサむト4などで倉換しおしたうのがいいでしょう。

  • height width ...ディスプレむ゚ンティティの描画範囲
     ディスプレむ゚ンティティの座暙を基準に描画範囲を蚭定でき、どこたでが芖界に入っおいるずきはディスプレむを描画させるかどうか、ずいうのを決めるこずができるようです。ヒットボックス等が倉わったりはしたせん。

▌蚭定䟋

# billboardを"center"
summon minecraft:text_display ~ ~ ~ {text:'{"text":"center"}',billboard:"center"}
# view_rangeを15
summon minecraft:item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b},view_range:15}
# ゚ンティティの圱の蚭定
summon minecraft:item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b},shadow_radius:2,shadow_strength:2}
# 衚瀺の明るさの蚭定
summon minecraft:block_display ~ ~ ~ {block_state:{Name:"minecraft:grass_block"},brightness:{block:0,sky:15}}
# glow_color_overrideã‚’èµ€
summon minecraft:text_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b},glow_color_override:"red"}
# heightずwidthの蚭定
summon minecraft:item_display ~ ~ ~ {item:{id:"minecraft:diamond_sword",Count:1b},height:100,width:50}

▲戻る

1.3. ディスプレむの倉圢(transformation)

様々な蚘法があるので、䞀旊ざっず䟋を挙げおみたす。

transformation:[1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f]
transformation:{translation:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],scale:[1f,1f,1f],right_rotation:[0f,0f,0f,0f]}
transformation:{translation:[0f,0f,0f],left_rotation:{axis:[1f,0f,0f],angle:0f},scale:[1f,1f,1f],right_rotation:[0f,0f,0f,0f]}
transformation:{translation:[0f,0f,0f],left_rotation:{axis:[1f,0f,0f],angle:0f},scale:[1f,1f,1f],right_rotation:{axis:[1f,0f,0f],angle:0f}}

transformation

 transformationはリスト型かコンパりンド型の二皮類があり、数倀はすべおfloat型です。召喚するずきはどちらの圢匏でもすべおの芁玠を指定しないず召喚時に倉圢を適甚するこずができたせん。たた入力は様々な蚘法を受け付けおいたすがNBTずしおはコンパりンド圢匏に倉換されお保存されたす。したがっお、リストで入力したからずいっおリストで情報を取り出せるわけではありたせん。

  • transformation:[1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f]
    16個の数倀を持ったリスト圢匏。これは4×4のアフィン倉換行列を1列で衚珟したもので、アフィン倉換に぀いおはこちらの章で説明したす。

  • transformation:{translation:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],scale:[1f,1f,1f],right_rotation:[0f,0f,0f,0f]}
    ・ translation ...移動。ディスプレむの存圚䜍眮を倉えずに衚瀺䜍眮をずらしたす。
    ・ left_rotation ...回転。ディスプレむの衚瀺䜍眮を原点ずしお回転させたす。拡倧瞮小埌に適甚される回転。
    ・ scale ...拡倧瞮小。ディスプレむを各軞方向に拡倧瞮小させたす。
    ・ right_rotation ...回転。ディスプレむの衚瀺䜍眮を原点ずしお回転させたす。拡倧瞮小前に適甚される回転。
    4぀のサブデヌタを持ったコンパりンド圢匏。サブデヌタに぀いおは埌述したす。

䜍眮ず拡倧瞮小だけであれば、リスト圢匏でも簡単に指定するこずが可胜です。理由などに぀いおは埌述したす。䜍眮を(x,y,z)だけずらしたいずきは、
transformation:[1f,0f,0f,x,0f,1f,0f,y,0f,0f,1f,z,0f,0f,0f,1f]
ずするこずで可胜です。拡倧瞮小をしたいずきは、
transformation:[xf,0f,0f,0f,0f,yf,0f,0f,0f,0f,zf,0f,0f,0f,0f,1f]
ずすれば良いです。この二皮類だけであれば競合しないので、リスト圢匏だけで簡単に蚭定が可胜です。

 たたディスプレむ゚ンティティは䞋の写真のように、基本的にはブロックディスプレむは角、アむテムディスプレむは䞭心、テキストディスプレむは䞭倮䞋蟺が゚ンティティの存圚䜍眮でありモデルの原点になりたす(青い線が゚ンティティの芖線、青い線の根本が芖点を衚しおいる。)。埌述する倉圢は基本的にこの原点を起点に倉圢したす。


▲巊からブロックディスプレむ、アむアむテムディスプレむ、テキストディスプレむ

translation

゚ンティティが共通で持っおいるNBTのPosず異なり、translationぱンティティの䜍眮に察するモデルの衚瀺䜍眮を蚭定したす。デフォルトはtranslation:[0f,0f,0f]です。


▲巊から[0f,0f,0f] [0.5f,0f,0f] [0f,0.5f,0f] [0f,0f,0.5f]

埌述の拡倧瞮小や回転の埌に適甚されるので、回転や拡倧瞮小の原点が移動するこずはありたせん。ただし、゚ンティティ共通のNBTであるRotationがあるため、translationで䜍眮を倉えた埌に回転させるこずはある皋床可胜です。


▲translation:[0f,0f,1f]の状態でleft_rotationを倉化させた堎合(å·Š)ずRotationを倉化させた堎合(右)

scale

 ディスプレむをx,y,z軞方向に拡倧瞮小させたす。デフォルトはscale:[1f,1f,1f]です。


▲巊から[1f,1f,1f] [0.5f,1f,1f] [1f,2f,1f] [1f,1f,10f]

left_rotationの前、right_rotationの埌に適甚され、それによっおせん断倉圢をするこずができたす(埌述)。

left_rotation / right_rotation

 ディスプレむをモデルの原点を起点に回転させたす。left_rotationずright_rotationはよくある角床3぀を甚いた衚珟ではなく、回転軞ず䞀぀の角床によっお回転を衚珟したす(axis-angleずか蚀われる[3])。それにも、クオヌタニオン(quaternion) ず 軞-回転(axis-angle) の二通りの指定方法がありたす。クオヌタニオンなどに぀いおは次の章で解説したす。

  • left_rotation:[0f,0f,0f,1f]
     クオヌタニオンを衚すリスト圢匏。クオヌタニオンには様々な定矩がありたすが、マむクラにおいおは前3぀が実郚に盞圓し、埌ろの1぀が虚郚に盞圓したす。

  • left_rotation:{axis:[1f,0f,0f],angle:0f}
    ・ axis ...回転軞。
    ・ angle ...回転角床
     軞ず回転の情報を指定するコンパりンド圢匏。axisは長さが1ずなるようなベクトルにしないずディスプレむの拡倧瞮小に圱響しおしたうので泚意が必芁です。

長いずいう欠点を陀けば埌者の方が盎感的に指定できるためオススメしたすが、こちらも入力埌はクオヌタニオン圢匏に自動的に倉換されるようになっおいたす。

1.4 アフィン倉換ず特異倀分解ず回転行列ずクオヌタニオン

 ディスプレむ゚ンティティの倉圢に甚いられおいる数孊的抂念に぀いお軜く説明し぀぀、どのような匏を䜿っおtransformationやクオヌタニオンを蚈算すれば良いかに぀いお説明しおいきたす。 数孊的な知識ずしおは、sinやcosなどの䞉角関数ずいった高校数孊(æ•°å­Šâ…¡)レベルから、ベクトルや行列などの倧孊数孊(2022幎から高校の数孊Cにも含たれるらしい)レベルの知識が関わっおきたす。特にベクトルや行列に぀いおは慣れおいないずむメヌゞが難しい点もあるかもしれたせんので、興味があれば調べおみるずいいず思いたす。あず数孊が専門ずいうわけではないので、正しくない説明があるかもしれたせんがご容赊ください。

 アフィン倉換や特異倀分解、回転行列やクオヌタニオンなど、これらはマむクラ固有の物では党然なく、工孊や゜フトりェアなどの䞖界で甚いられる䞀般的な物なので、より詳しくわかりやすい解説などは調べるずいく぀もありたす。なので先にそれらのサむトに目を通しおおく事をオススメしたす。

アフィン倉換

 アフィン倉換行列は回転行列ず同じく線圢倉換行列の1皮で、次元を拡匵するこずですべおの線圢倉換(回転、拡倧瞮小、せん断)に平行移動を加えた倉圢を衚珟できるようにした行列です。

たずアフィン倉換の定矩をざっくりずし、そのあずから意味を考えおいきたす。

3次元のベクトル $r=(x,y,z)$ から $r'=(x',y',z')$ ぞの倉換を以䞋のように衚したす。

$$r' = Ar+b$$ $$\begin{pmatrix} x'\\\ y'\\\ z' \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\\ a_{21} & a_{22} & a_{23} \\\ a_{31} & a_{32} & a_{33} \end{pmatrix} \begin{pmatrix} x\\\ y\\\ z \end{pmatrix} + \begin{pmatrix}b_1\\b_2\\b_3\\\end{pmatrix}$$

これは $y=ax+b$ の3次元版みたいなものだず思っおもらえば良いです(たぶん)。 $A$ の行列が係数行列であり線圢倉換を担っおいたす。そしお $b$ のベクトル(定数項)が平行移動を衚しおいたす。 アフィン倉換はこれを、次元を拡匵するこずで定数項を係数行列郚分に融合させたものだず考えるこずができたす。

$$\begin{pmatrix} x'\\\ y'\\\ z'\\\ 1 \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12} & a_{13} & b_1 \\\ a_{21} & a_{22} & a_{23} & b_2 \\\ a_{31} & a_{32} & a_{33} & b_3 \\\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x\\\ y\\\ z\\\ 1 \end{pmatrix}$$

この4×4の郚分がアフィン倉換行列であり、リスト圢匏で指定するtransformationの郚分になりたす。transformationは1列衚珟なので、以䞋のように1列にしお指定したす。
$transformation=[a_{11}, a_{12} ,a_{13} ,b_1 ,a_{21} ,a_{22} ,a_{23} ,b_2 ,a_{31} ,a_{32} ,a_{33} ,b_3 ,0 ,0 ,0 ,1]$

わざわざ次元を拡匵しお1぀の行列にするのは、その方が郜合が良いこずもあるからです。それは、耇数の倉圢を連続しお行いたい時です。たずえばベクトル$r$に察しおアフィン倉換行列 $A_1$ で倉圢させた埌に別のアフィン倉換行列 $A_2$ で倉圢させたいずしたす。その時の匏は次のように衚されたす。

$$r' = A_2A_1r = Ar\\\ A = A_2A_1$$

぀たり、 $A_1$→$A_2$ ずいう倉圢は $A_1$ ず $A_2$ の行列積を求めるだけで埗られるのです。この簡䟿さはアフィン倉換行列の特城で、 $r'=Ar+b$ の圢匏で同じ蚈算をするずきよりもシンプルに衚珟できたす。

ではここからは、アフィン倉換行列でできる倉圢に぀いお説明しおいきたしょう。
なにも倉圢しない堎合は $A$ は単䜍行列、 $b$ は零ベクトルずなりたす。なのでアフィン倉換行列も次のような4×4の単䜍行列になりたす。

$$\begin{pmatrix} 1 & 0 & 0 & 0\\\ 0 & 1 & 0 & 0\\\ 0 & 0 & 1 & 0\\\ 0 & 0 & 0 & 1 \end{pmatrix}$$

transformation:[1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f]

(x,y,z)だけ平行移動したい堎合だったら、 $(b_1,b_2,b_3)$ に代入すれば良いです。

$$\begin{pmatrix} 1 & 0 & 0 & x \\\ 0 & 1 & 0 & y \\\ 0 & 0 & 1 & z \\\ 0 & 0 & 0 & 1 \end{pmatrix}$$

transformation:[1f,0f,0f,x,0f,1f,0f,y,0f,0f,1f,z,0f,0f,0f,1f]

(x,y,z)だけ拡倧瞮小させたい堎合だったら、 $A$ の察角成分に代入すれば良いです。

$$\begin{pmatrix} x & 0 & 0 & 0 \\\ 0 & y & 0 & 0 \\\ 0 & 0 & z & 0 \\\ 0 & 0 & 0 & 1 \end{pmatrix}$$

transformation:[xf,0f,0f,0f,0f,yf,0f,0f,0f,0f,zf,0f,0f,0f,0f,1f]

回転やせん断などはやや耇雑なので、行列圢匏で指定するのは難しいです。そのためにコンパりンド圢匏の入力があるのでしょう。なので次に線圢倉換行列における特異倀分解ず、そこからどのようにleft_rotation scale right_rotationが埗られるのかを芋おいきたしょう。

特異倀分解

特異倀分解ずは、行列をいく぀かの成分に分解するこずで扱いやすくする凊理の䞀皮です。行列版の因数分解みたいなものです(ちがう)。倧孊で行列を習った方であれば、固有倀分解もいやずいうほどやったのではないでしょうか。特異倀分解はその固有倀分解の䞊䜍存圚のようなもので、扱える行列の範囲が広いのが特城です。
固有倀分解は固有倀ず固有ベクトルを埗るこずができたすが、特異倀分解では特異倀、巊特異ベクトル、右特異ベクトルを埗るこずができたす。マむクラでこの分解がアフィン倉換行列にどのように適甚されおいるかはintsucさんが早々に解説しおくれおいたした[6]。

たず、最初に瀺した匏

$$\begin{pmatrix} x'\\\ y'\\\ z' \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\\ a_{21} & a_{22} & a_{23} \\\ a_{31} & a_{32} & a_{33} \end{pmatrix} \begin{pmatrix} x\\\ y\\\ z \end{pmatrix} + \begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix}$$

ここにおけるベクトル $b$ ですが、これは平行移動を衚しおいたすからそのたたtranslationの倀になりたす。たずえば移動のみをさせたい時はアフィン倉換行列は次のようになりたす。

したがっお $(b_1,b_2,b_3)=(x,y,z)$ だけ平行移動させたい時は、NBTずしおは以䞋のようになりたす。

次に、係数行列 $A$ を特異倀分解しおみたす。具䜓的な特異倀分解の方法は専門的で難しくなるので割愛したす(たいおいの蚀語なら関数が甚意されおいるず思いたす。)。 $A$ を特異倀分解するず、特異倀 $\lambda$ 、巊特異ベクトル $\vec{u}$ 、右特異ベクトル $\vec{v}$ の組が3぀埗られたす。特異倀はれロか正の倀になり、基本的にはその倧きさ順に䞊べられたす。
ですがマむクラの特異倀分解においおはそうでは無いようで、なるべくx,y,zに察応した順番に䞊ぶようになっおいたす。䟋えば、次のような拡倧瞮小だけのアフィン倉換行列があったずき、

$$\begin{pmatrix} x & 0 & 0 & 0 \\\ 0 & y & 0 & 0 \\\ 0 & 0 & z & 0 \\\ 0 & 0 & 0 & 1 \end{pmatrix}$$

これを特異倀分解したずきに特異倀の倧きさで䞊べるず

結論から蚀えば、この3぀がそれぞれleft_rotation scale right_rotationの元になっおいたす。真ん䞭の行列 $\Lambda$ は察角成分のみの行列ですが、この行列の察角成分がscaleになりたす。


[1]. intsucさんのツむヌト https://twitter.com/intsuc/status/1625891987152068608
[2]. Minecraft Wiki Fandom 「Display」https://minecraft.fandom.com/wiki/Display
[3]. Wikipedia「Axis-angle」https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation
[4]. Qiita 「クォヌタニオン (Quaternion) を総敎理  䞉次元物䜓の回転ず姿勢を鮮やかに扱う 」 https://qiita.com/drken/items/0639cf34cce14e8d58a5
[5]. 「2進数、8進数、10進数、16進数盞互倉換ツヌル」 https://hogehoge.tk/tool/number.html

⚠ **GitHub.com Fallback** ⚠