質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

1242閲覧

【Unity】カメラの位置から伸びる4つの直線にRayを重ねて表示したい

makeinu00

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/12/08 09:01

編集2021/12/09 04:52

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Unityを知らんので,ググった感じでの話になりますが,あなたのやっている計算結果と別の計算手段による結果とを照らし合わせてみれば,どこに問題があるのかを判断できるのではないでしょうか.

  • VerticalToHorizontalFieldOfView とかいうのがあるっぽい.

これが使えるのであれば,これの結果と fovH の計算結果とを照らし合わせてみてはどうか.

  • camera.transform.forward だけでなく,up とか right も取れるっぽいから,

カメラ座標系の基底ベクトルが揃う.ならば,「回転」ではなくて,thetaV, thetaH から直接的に方向ベクトルを計算してみてはどうか.
camera.transform.forwardcamera.transform.right が張る二次元平面で thetaH について考えれば,下図のように,求める方向ベクトル(をこの平面に投影したものを赤矢印で示す)の camera.transform.right 方向成分(図内r)を求めることができますよね.
thetaV から同様に camera.transform.up 方向成分を求められる)
イメージ説明

投稿2021/12/08 14:31

編集2021/12/09 09:16
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makeinu00

2021/12/09 04:51

回答頂きありがとうございます. fovHの値は内部のデータと計算結果が一致していることを確認しました. やはり,ベクトルの回転でおかしな計算結果になっているんだと思われます. ほかにベクトルを回転させる方法がないか模索してみます.
fana

2021/12/09 09:20 編集

何かを回転させるのではなくて,もっと直接的に計算すればよいのでは? という趣旨です. (文章と絵を追加しました.) 例えばこの絵のように求めたい方向ベクトルの camera.transform.forward 方向成分を1を定めれば, tan(thetaH) = r/1 として r を決定できますよね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問