グレンジAdvent Calendar 2018 17日目の記事です。
グレンジでクライアントエンジニア(Unity)をしています。
今回はUnityでまぁまぁ使う計算、判定を何個か書くので、コピペして使っちゃってください!
▼対象(t)の正面に対して指定座標(targetPosition)が右側か判定
public bool IsRight(Transform t, Vector3 targetPosition) {
Vector3 diff = targetPosition- t.position;
Vector3 axis = Vector3.Cross(t.forward, diff);
return axis.y > 0;
}
▼対象(t)の正面に対して指定座標(targetPosition)が下側か判定
public bool IsDown(Transform t, Vector3 targetPosition) {
Vector3 diff = targetPosition- t.position;
Vector3 axis = Vector3.Cross(t.forward, diff);
return axis.x > 0;
}
▼角度(angle)を+180~-180に整える
public float AdjustAngle180(float angle) {
float subNormal = Mathf.Floor((Mathf.Abs(angle) + 180f) / 360f) * 360f;
return (angle > 0f) ? angle - subNormal : angle + subNormal;
}
※180f、360fは定数で定義しておいたほうがいいです
▼2つの角度(rot1, rot2)間の差を計算 ※上記のAdjustAngle180(float angle)を使用してます
public float CalcAngleGap(float rot1, float rot2) {
rot1 = AdjustAngle180(rot1);
rot2 = AdjustAngle180(rot2);
return AdjustAngle180(rot1 - rot2);
}
▼2つの角度ベクトル(vec1,vec2)間の差ベクトルを求める ※上記の CalcAngleGap(float rot1, float rot2)を使用してます
public static Vector3 CalcAngleGap(Vector3 vec1, Vector3 vec2) {
Vector3 gapAngle = new Vector3(
CalcAngleGap(vec1.x, vec2.x),
CalcAngleGap(vec1.y, vec2.y),
CalcAngleGap(vec1.z, vec2.z)
);
return gapAngle;
}
▼2点間(position1, position2)のベクトルの大きさが指定したもの(magnitude)より大きいか
public bool IsMagnitudeGreaterThan(Vector3 position1, Vector3 position2, float magnitude) {
return (position1 - position2).sqrMagnitude > magnitude * magnitude ;
}
▼中心座標(center)、半径(radius)の球内に指定座標(targetPosition)があるか ※IsMagnitudeGreaterThan(Vector3 position1, Vector3 position2, float magnitude)を使用します
public bool IsInSphere(Vector3 center, float radius, Vector3 targetPosition) {
return IsMagnitudeGreaterThan(center, targetPosition, radius) == false;
}
簡単な計算なので内容はすぐに理解できるかと。
改良の余地だらけなのでコピペしていろいろ試してみてくださいm(__)m