vectorについて

コード
command /testvector:
trigger:
loop all entities:
loop-entity is armor stand
loop-entity's name is "test"
set {_v} to loop-entity
set {_v2} to vector from player's head to {_v}'s head
set player's velocity to {_v2}
command /testvector:
trigger:
loop all entities:
loop-entity is armor stand
loop-entity's name is "test"
set {_v} to loop-entity
set {_v2} to vector from player's head to {_v}'s head
set player's velocity to {_v2}
Vectorについてよくわかりません。 やりたいことは、commandを実行したプレイヤーの視点をtestという名前のアーマースタンドのほうにむけたいです。 この投稿を参考にしました。(ほぼ同じ) https://discord.com/channels/545926404785569793/1072066341617541211 Vectorについて調べてみたんですけどあまりわからなかったです。 認識こんな感じなんですけどあってますか..?
11 Replies
ぐううううう
認識があってたらこのvectorからyaw,pitchを取得する方法を教えてください。 ちなみに今のコードのままだと大体のアマスタの方向に吹っ飛んでいきます。
何か
何か2y ago
まずyawはプレイヤーとアマスタを上から見た時の
何か
何か2y ago
何か
何か2y ago
この角度のことで この角度を求めるために逆関数atanを使います atanでなくても 水色の部分はxzの長さなので asinやacosでも求まるはずです 次にpitchは 横から見た時のこの角度のことで
何か
何か2y ago
何か
何か2y ago
これはvectorの長さとyを使ってasinで求められます xzの長さを使えばatanでも求められます wikivgのprotocolにものってます
何か
何か2y ago
何か
何か2y ago
そしてskriptではこの計算をしなくても vector yaw of vector pitch of という構文があります
ぐううううう
command /testvector:
trigger:
loop all entities:
loop-entity is armor stand
loop-entity's name is "test"
set {_v} to loop-entity
set {_v2} to vector from {_v}'s head to player's head
set {_l} to {_v}'s location
set {_l}'s yaw to vector yaw of {_v2}
teleport {_v} to {_l}
command /testvector:
trigger:
loop all entities:
loop-entity is armor stand
loop-entity's name is "test"
set {_v} to loop-entity
set {_v2} to vector from {_v}'s head to player's head
set {_l} to {_v}'s location
set {_l}'s yaw to vector yaw of {_v2}
teleport {_v} to {_l}
計算はとても難しかったのでvector yaw ofの構文を使ってやりました。 アマスタの視点をプレイヤー方向に動かせるようになりました。 わかりやすい説明、ありがとうございます!
tanoKun
tanoKun2y ago
//ベクトルからyaw, pitchへ
double length = Math.sqrt(vector.getZ() * vector.getZ() + vector.getY() * vector.getY() + vector.getX() * vector.getX());
double pitch = -Math.asin(vector.getY() / length) / Math.PI * 180;
double yaw = -Math.atan2(vector.getX(), vector.getZ()) / Math.PI * 180;
yaw = yaw < 0 ? 360 + yaw : yaw;

//yaw, pitchからベクトルへ
x = -Math.cos(pitch) * Math.sin(yaw);
y = -Math.sin(pitch);
z = Math.cos(pitch) * Math.cos(yaw);
Vector vector = new Vector(x, y, z);
//ベクトルからyaw, pitchへ
double length = Math.sqrt(vector.getZ() * vector.getZ() + vector.getY() * vector.getY() + vector.getX() * vector.getX());
double pitch = -Math.asin(vector.getY() / length) / Math.PI * 180;
double yaw = -Math.atan2(vector.getX(), vector.getZ()) / Math.PI * 180;
yaw = yaw < 0 ? 360 + yaw : yaw;

//yaw, pitchからベクトルへ
x = -Math.cos(pitch) * Math.sin(yaw);
y = -Math.sin(pitch);
z = Math.cos(pitch) * Math.cos(yaw);
Vector vector = new Vector(x, y, z);
こんなコードあったよ @nannka 任せた
Want results from more Discord servers?
Add your server