1. OKsaiyowa

    No comment

    OKsaiyowa
Changes in body
Source | HTML | Preview
@@ -1,95 +1,95 @@
##視線
VRで視線判定をけっこう使うのでメモしときます。
[Rayを使用した視線の判定](https://qiita.com/OKsaiyowa/items/5bf32ec513bcd987ab8e)も十分簡単にできます。
-"目(カメラ)からビーム出してビームターゲット衝突したら処理を行う"
+"目(カメラ)からビーム出してビームターゲット衝突したら処理を行う"
ただこれだけです。
ただし、障害物があるとLayerやTagで衝突を避ける設定をする必要があります。
今回は会社の上司に教えてもらった
LayerやTagを一切気にしなくてもいい方法で実装してみようと思います。
##内積
まずは内積とは何かを一言で説明したいのですが、
一言で表すとなると全く思いつきませんでした。
私の理解もその程度だということなので、複数のリンクを貼っておきます。
個人的に動画の解説が一番しっくりきました。
Qiita記事 :[【数学】「内積」の意味をグラフィカルに理解すると色々見えてくる その1](https://qiita.com/kenmatsu4/items/a144047c1b49aa8c7eb0)
Youtube : [喋り方の癖だけ耐えればめちゃめちゃわかりやすい動画](https://www.youtube.com/watch?v=2aoyhQzmnAI&t=215s)
Youtube : [シンプルにわかりやすい動画](https://www.youtube.com/watch?v=pTE5y9cBUzs&t=571s)
##コード
たったこれだけです。
```C#:カメラにアタッチ
using UnityEngine;
public class Dot : MonoBehaviour
{
[SerializeField]
Transform targetTransform;
Transform cameraDirection;
void Start()
{
cameraDirection = this.gameObject.GetComponent<Transform>();
}
void Update()
{
//ターゲットからカメラの方向へ正規化したベクトルを作成
Vector3 targetToCameraDirection_N = (cameraDirection.position - targetTransform.position).normalized;
//正規化したベクトルの内積が一定以下なら見たことにする
if (Vector3.Dot(targetToCameraDirection_N, cameraDirection.forward.normalized) < -0.9)
{
print("見た!");
}
}
}
```
##normarized
ベクトルを正規化してくれます。
問答無用で値を1にしてくれるってことです。(ただし小さすぎると0になるので注意)
`normarized`を利用することで、2点の位置から算出したベクトルを
常に一定の大きさで取得することができます。
##Vector3.Dot
二つのベクトルを渡してあげるだけで内積を返してくれます。([参考リンク](https://docs.unity3d.com/jp/460/ScriptReference/Vector3.Dot.html))
![B292E9AE-1C23-44DB-8684-C87F4EEC9C84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e2532c6b-1d03-d698-dd39-87725e880a95.png)
lhs,rhsは`Left(Right) hand side`の略らしいです。
今回はVector3.Dotを利用して**内積が-0.9(約cos155°)**以下になると見たという判定にしています。
**人間の有効視野の上限は20~30度**だといわれている[^1]ので
完全に視線が一致(内積が-1(cos180°))するまで判定させないより
**だいたいこの辺りを見たと判断させる**方が良い方法だと思います。
・ターゲットの位置からカメラの位置へ向けたベクトル
・カメラの正面方向(Z軸正の向き)のベクトル
↑これらのベクトルから内積を計算してます。
##デモ
視線判定の範囲内に入ると赤色に変わるようにしたデモです。
![Gif_Dot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/659832b8-5a52-0561-04b3-944ff6fc0eda.gif)
`-0.9`を`-0.95`のように-1に近づけてあげるともっと厳格な視線判定もできます。
  
大学はおろか高校ですら ろくに数学をやってこなかったので間違いがあれば
遠慮なくご指摘ください。
[^1]: 参考リンク [①](https://xr-hub.com/archives/3095) [②](https://www.omoiyari-light.com/LAB/INTERVIEW/000812.html)