execute幾何学 - kyaco

提供: Minecraft Wiki
移動先: 案内検索


execute幾何学の個人的なメモです。

このページについて[編集 | ソースを編集]

 Minecraftのコマンドでコマンド呼び出し座標からコマンド実行座標を指定する方法をまとめます(予定)。

 なお、このページでは1コマンドを適宜改行し複数行に分けて書いています。 コマンド全体をコピーしてマイクラのチャット欄・コマンドブロックに貼り付けて実行できます。


execute幾何学とは[編集 | ソースを編集]

 executeコマンドには、コマンド実行座標を指定するサブコマンドがいくつか用意されています。 サブコマンドでの座標指定は絶対座標だけではなく、コマンド呼び出し座標に基づいた相対座標と、 コマンド呼び出し座標・向きに基づいたローカル座標を使うことができます。

# 最寄りのプレイヤーの前方 10m にパーティクルを表示する例
# 選ばれたプレイヤーのローカル座標で、
# 奥向きに10mの位置を実行座標としてparticleコマンドを実行。
# プレイヤーの足の裏の高さが基準となるので画面ではやや下に見える。
/execute 
	as @p 
	at @s 
	positioned ^ ^ ^10 
	run particle heart


 1つのexecuteコマンド内でサブコマンドを連ねることもできます。 サブコマンドを連ねた分コマンド実行座標も移動し、一連の移動を1コマンドに収めることができます。

# 最寄りのプレイヤーの前方 10m にパーティクルを表示する例その2
# ローカル座標で10m前方を指定し、続けて相対座標で高さ1.8m(プレイヤーの足から目の高さ)を補正
/execute 
	as @p 
	at @s 
	positioned ^ ^ ^10 
	positioned ~ ~1.8 ~ 
	run particle heart


 これらのテクニックに幾何学的な要素を取り入れることで高度な操作ができるようになります。

executeコマンドで主に使うサブコマンド[編集 | ソースを編集]

executeのサブコマンドのうち、よく使うものを抜粋しておきます。

as
実行者を決める。ほかのサブコマンドで基準としたいエンティティを一時記録しておくのにつかう
at
実行ディメンション・座標・方向を決める
positioned
実行座標を決める。
rotated
実行時の向きを決める。
anchored
facingやローカル座標の基準点を自分の足元か視点かに設定する(よく理解していない)
facing
実行時の向きを決める。

 エンティティによって足の裏と目の高さが異なる、TPでは足の裏が基準となる、などの理由から、 途中は全部feet基準で進めて行って、最後に足元から視点の高さまでの補正をするのが無難だと思います。



基本的な移動[編集 | ソースを編集]

エンティティの向いている方向に移動[編集 | ソースを編集]

# P: 平行移動の方向を向いているエンティティ
# Pの向きに10m移動した場所でコマンドを実行する
/execute 
	as @p 
	at @s 
	rotated as @e[tag=P] 
	positioned ^ ^ ^10 
	run particle heart

エンティティのある方向に移動[編集 | ソースを編集]

# @e[tag=P]: 移動したい方向にあるエンティティ
# @e[tag=P]のある方向に10m移動した場所でコマンドを実行する
/execute 
	as @p 
	at @s 
	facing entity @e[tag=P] feet 
	positioned ^ ^ ^10 
	run particle heart

角の二等分[編集 | ソースを編集]

2つのエンティティの向いている方向を二等分した方向を向くように移動します。 後述の座標変換の基準軸や基準面を計算するときによく使います。

# @e[tag=A], @e[tag=B]: 向きを指定する2つのエンティティ
# 2つのエンティティの向いている角度を二等分した方向を向かせる
/execute 
	as @p 
	at @s 
	rotated as @e[tag=A] 
	positioned ^ ^ ^-1 
	rotated as @e[tag=B] 
	positioned ^ ^ ^-1 
	facing entity @s feet 
	positioned as @s 
	run tp @s ~ ~ ~ ~ ~



近似的な移動[編集 | ソースを編集]

 実現したいコマンド実行座標を近似的に求めるテクニックです。 十分遠くの点から引いてきた2本の線を平行線とみなす近似を使ったものばかりです。

(誤差の評価とかもできたらやりたい)

正射影[編集 | ソースを編集]

 1つのエンティティで平面(エンティティの存在する座標を通り、エンティティの向いている方向に垂直な平面)を表したときに、 他のエンティティからその平面に下した垂線の足をコマンド実行座標にします。

# @e[tag=P]が表す平面に、最寄りのプレイヤーから引いた垂線の足でコマンドを実行する。
/execute 
	at @e[tag=P] 
	positioned ^ ^ ^1000 
	facing entity @p feet 
	positioned ^ ^ ^1000 
	run particle heart

(正射影の近似を説明する画像)

内分・外分[編集 | ソースを編集]

 2つのエンティティの座標に対して、内分点や外分点にコマンド実行座標を移動します。

# @e[tag=A], @e[tag=B]: 2つのエンティティ
# AがBの方向を向いている必要があるのでコマンドが2つになっている
# ここではAとBの間を2:1に内分した点でコマンドを実行する
/execute 
	as @e[tag=A] 
	at @s 
	facing entity @e[tag=B] feet 
	run tp @s ~ ~ ~ ~ ~
/execute 
	as @e[tag=A] 
	at @s 
	positioned ^3000 ^ ^ 
	facing entity @e[tag=B] feet 
	positioned ^ ^ ^2000 
	rotated as @s 
	positioned ^-1000 ^ ^ 
	run particle heart

水平面での回転[編集 | ソースを編集]

直径に対する円周角の定理を利用した方法があります。

軸対称移動[編集 | ソースを編集]

 エンティティの位置と向きで定まる直線を軸として180度回転した位置にコマンド実行座標を移動します。 後述の座標変換で使います。

# @e[tag=A]: 対称軸を表すアーマースタンド
# 最寄りのプレイヤーの位置と対称軸に関して対称な位置でコマンドを実行する
/execute 
	as @p 
	at @s 
	rotated as @e[tag=A] 
	positioned ^ ^ ^1000 
	facing entity @e[tag=A] feet 
	positioned ^ ^ ^2000 
	rotated as @e[tag=A] 
	positioned ^ ^ ^1000 
	run particle heart

鏡像[編集 | ソースを編集]

 エンティティの位置と向きで定まる平面に関して対称な位置にコマンド実行座標を移動します。 正射影と内分・外分の組み合わせと考えることもできます。 後述の座標変換で使います。

# @e[tag=A]: 
/execute 
	as @p 
	at @e[tag=A] 
	positioned ^ ^ ^1000 
	facing entity @s feet 
	positioned ^ ^ ^1000 
	rotated as @e[tag=A] 
	positioned ^ ^1000 ^ 
	facing entity @s feet 
	positioned ^ ^ ^-1000 
	rotated as @e[tag=A] 
	positioned ^ ^2000 ^ 
	run particle heart


座標変換[編集 | ソースを編集]

 一般的な回転をコマンドで実現しようとすると、相対座標系でもローカル座標系でも数値計算無しでは難しいでしょう。 一方で、回転軸が水平だったり垂直だったり特殊な場合には簡単に実現できます。 そこで、適当な鏡を持ってきて一般的な回転の回転軸が垂直に見えるよう鏡を設置することを考えてみます。 鏡の中では水平に回転させるだけなのでコマンドでの回転を簡単に実現できます。 鏡の中から元の世界に戻ると一般的な回転が完了しています。

 回転に限らず、一般的な問題を特殊な問題に置き換えるためのアイディアが座標変換です。 一般的には困難な問題を特殊な場合とみなせるように座標系を変換し、 行いたい操作を行った後に最初と逆の座標変換をして元の座標系に戻します。

 これまでに出てきた軸対称移動と鏡像は座標変換に応用できるテクニックです。 軸対称移動も鏡像も、変換と逆の変換は同じもの(鏡写しにされたものを元に戻すには、同じ鏡を使えばいい) なので、コマンドの構成は次のようになります。

軸対称移動 → 特殊な場合の操作 → 軸対称移動
鏡像 → 特殊な場合の操作 → 鏡像

外積[編集 | ソースを編集]

座標変換と水平面での90°回転を組み合わせることで実現できます。

一般的な回転[編集 | ソースを編集]

座標変換と水平面での回転を組み合わせることで実現できます。





実行座標の増幅[編集 | ソースを編集]

同じタグ"XXXX"をつけた複数のエンティティを用意し、 エンティティセレクタ@e[tag=XXXX]を繰り返し使うと処理回数を増幅できます。 これを利用すると1コマンドでコマンド実行座標を複数指定できます。

曲線描画[編集 | ソースを編集]

実行座標の増幅に他のサブコマンドを組み合わせることで、様々な形状の曲線上にコマンド実行座標を並べることができます。 幾何学の知識が応用されます。

直線と平面との交点[編集 | ソースを編集]

微妙に増幅ではない気もしますが同じタグを持つ複数のエンティティを利用しているのでここに分類しました。 エンティティで指定された平面と、他のエンティティで指定された平面の交点をコマンド実行座標に選択できます。 逆向きの2つのエンティティから「近い方を選択して移動」を繰り返すことで、二分探索により近似的に交点を探索しています。

視線トレース[編集 | ソースを編集]

直線と平面との交点が発展した手法です。 プレイヤーの視線がブロックにぶつかる場所にエンティティをテレポートさせることができます。 コマンドの実行座標が増幅されたときに、実行される順番を制御するためセレクターでsortを指定しています。

# @p[tag=X]: タグXを付与された対象のプレイヤー
# @e[tag=X]: タグXを付与されたプレイヤーとアーマースタンド
/execute 
	at @p[tag=X] 
	positioned ^ ^ ^-1 
	facing ^ ^ ^-1 
	run tp @e[type=armor_stand,tag=X] ~ ~ ~ ~ ~
/execute 
	as @p 
	at @s 
	anchored feet 
	positioned ^ ^ ^16 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^8 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^4 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^2 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^1 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^0.5 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^0.25 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^0.125 
	rotated as @e[tag=X,sort=nearest] positioned ^ ^ ^0.0625 
	facing entity @s feet 
	unless block ~ ~1.7 ~ air 
	run tp @e[type=armor_stand,tag=X] ~ ~1.8 ~ ~ ~

モンテカルロ法[編集 | ソースを編集]

パーティクルで線や面を描画するときに、指定したい点が多くなりすぎて重くなるのを防ぐ手法です。 コマンドの1回の実行でパーティクルを表示する点の数は少なく設定し、表示する場所をランダムに選択します。 パーティクルはしばらく残るので、繰り返し実行すると線や面として見ることができます。 1つのパーティクルが50tick消えずに残る場合で1tickごとに16個のパーティクルを生成すると、 ある瞬間には50×16=800個のパーティクルが全体に分布して描画されるのでたいていの場合十分です。