前提・実現したいこと
Unityにて,Sceneビューに出てくる,カメラの位置から伸びる4つの直線にRayを重ねて表示したいと思っています.
<流れ>
0. リストカメラコンポーネントより,アスペクト比(aspect),垂直視野角(fovV)を取得
0. 番号リストその2つから水平視野角(fovH)を計算
0. 番号リスト水平垂直視野角それぞれの半分の角度(thetaV, thetaH)を計算
0. カメラの方向ベクトルに対して,thetaV・thetaH分だけ回転させた4つのベクトルを生成
0. 4つのベクトルの方向にそれぞれRayを飛ばす
発生している問題・エラーメッセージ
Rayが少しずれてしまう
左右でずれの角度が異なっているのも謎...
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.XR; 6using Valve.VR; 7 8public class Auto_test : MonoBehaviour 9{ 10 public GameObject camera; 11 Camera cameraComponent; 12 Vector3 cameraPos; 13 Vector3 cameraVec; 14 Vector3 leftup, leftdown, rightdown, rightup; 15 float fovV, fovH, thetaV, thetaH; 16 float aspect; 17 18 void Start() 19 { 20 cameraPos = camera.transform.position; 21 cameraVec = camera.transform.forward; 22 23 //アスペクト比,垂直視野角の取得及び水平視野角の計算 24 cameraComponent = camera.GetComponent<Camera>(); 25 aspect = cameraComponent.aspect; 26 fovV = cameraComponent.fieldOfView; 27 fovH = Mathf.Atan(Mathf.Tan(fovV * 0.5f * Mathf.Deg2Rad) * aspect) * 2.0f * Mathf.Rad2Deg; 28 29 thetaV = fovV * 0.5f; 30 thetaH = fovH * 0.5f; 31 32 //カメラの方向ベクトルを回転させて4つのベクトルを計算 33 leftup = Quaternion.Euler(new Vector3(thetaV, -thetaH, 0)) * cameraVec; 34 leftdown = Quaternion.Euler(new Vector3(-thetaV, -thetaH, 0)) * cameraVec; 35 rightdown = Quaternion.Euler(new Vector3(thetaV, thetaH, 0)) * cameraVec; 36 rightup = Quaternion.Euler(new Vector3(-thetaV, thetaH, 0)) * cameraVec; 37 } 38 39 40 void Update() 41 { 42 //カメラの方向ベクトルにRayを生成 43 Ray ray = new Ray( 44 origin: cameraPos, 45 direction: cameraVec); 46 Debug.DrawRay(ray.origin, ray.direction * 20, Color.red, 0); 47 48 //以下4つの方向にRayを生成 49 Ray rayleftup = new Ray( 50 origin: cameraPos, 51 direction: leftup); 52 Debug.DrawRay(rayleftup.origin, rayleftup.direction * 20, Color.red, 0); 53 54 Ray rayleftdown = new Ray( 55 origin: cameraPos, 56 direction: leftdown); 57 Debug.DrawRay(rayleftdown.origin, rayleftdown.direction * 20, Color.red, 0); 58 59 Ray rayrightdown = new Ray( 60 origin: cameraPos, 61 direction: rightdown); 62 Debug.DrawRay(rayrightdown.origin, rayrightdown.direction * 20, Color.red, 0); 63 64 Ray rayrightup = new Ray( 65 origin: cameraPos, 66 direction: rightup); 67 Debug.DrawRay(rayrightup.origin, rayrightup.direction * 20, Color.red, 0); 68 } 69}
試したこと
カメラの方向ベクトルが小さすぎて,大きくしたときに誤差が広がっているのかと思い,
「cameraVec = camera.transform.forward」を
「cameraVec = obj.transform.position - camera.transform.position」に変更してみましたが同じ挙動でした.
fovHの計算結果が内部データのものと一致していることを確認しました.
(Unityのインスペクタにて確認)
補足情報(FW/ツールのバージョンなど)
Unity 2019.2.2f1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/09 04:51
2021/12/09 09:20 編集