「EnDlEss DREamER」ブログ

最近はunity5メインで活動中。以前はツクールRGSSネタなど。

§ 射線と角度 接触面と方向

やっと戦車の主砲を撃って、被弾した箇所の入射角とか
どこの面に当たったのかを取得する処理ができた!

流れとして・・・・・・

1.弾のスクリプトに処理を全て入れている。
2.弾がprefabで生成された直後にレイを飛ばして情報取得&初期座標を保存。
3.OnCollisionEnterで接触時に現在座標-初期座標とRaycastHitなnormalを使ったVector3.Angleで
入射角取得
4.Mathf.RoundToInt(hit.normal.x);で面情報の座標を四捨五入して整数化。そしてVector3.frontなどで分岐

ソースは続きにて。

ここまでたどり着くのに長かった・・・・・


 
private void Ray_Bullet_Line()
{
RaycastHit hit; // Rayが衝突したコライダーの情報を得る
Ray ray = new Ray(transform.position, transform.forward);// Rayの作成
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(ray, out hit, 1000))
{
//Debug.Log(hit.normal);
}
}



private void OnCollisionEnter(Collision collision)
{
//2点間の角度を取得(弾丸初期位置と弾丸接触座標)
var forward = transform.TransformDirection(Vector3.forward);
var target = transform.position - initial_position;
//レイで得た衝突面から射線ベクトルによる角度。鋭角(90度以下)で衝突面との角度算出。
float angle = Vector3.Angle(target, hit.normal) - 90f;//これが正解
//Debug.Log((Vector3.Angle(target, hit.normal)) - 90f);

// レイでヒットした面情報は方向も意味するので、値を四捨五入して整数化
int normal_x = Mathf.RoundToInt(hit.normal.x);
int normal_z = Mathf.RoundToInt(hit.normal.z);


//四捨五入した値をVector3の向きと比較して同じなら分岐
if (normal_z == Vector3.forward.z)
//(b_point.z > t_center.z)
{
//中心より前側が接触
Debug.Log("front");

} else if (normal_z == Vector3.back.z) //(b_point.z < t_center.z)
{
//中心より後ろ側が接触
Debug.Log("back");

} else if (normal_x == Vector3.right.x) //(b_point.x > t_center.x)
{
//中心より右側
Debug.Log("right");
} else if (normal_x == Vector3.left.x) //(b_point.x < t_center.x)
{
//中心より左
Debug.Log("left");
}
}
2017/05/11/Thu 14:34:27  unity/CM:0/TB:0/
new 05/22のツイートまとめ / MAIN / アプリ内広告収入 old

COMMENT

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

  この記事のURL:
   http://edlogtkool.blog36.fc2.com/tb.php/1233-e00336a5


MAIN
copyright © 2006 「EnDlEss DREamER」ブログ. All Rights Reserved.
Template by TAE-3rd☆テンプレート工房