18
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Unity:損はしないはず、コピペで使える簡単な計算

Last updated at Posted at 2018-12-16

グレンジ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;
}

temp1.png

▼対象(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;
}

temp2.png

▼角度(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

18
7
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
18
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?