実現したいこと
unityで3人称視点でポータルガンのようにポータルの先の景色が見えるようなレンダーテクスチャを作成したいです。
前提
ここに質問の内容を詳しく書いてください。
https://www.youtube.com/watch?v=IZ4mjwZBWtk
https://www.youtube.com/watch?v=PkGjYig8avo&t=189s
これらの動画を参考にポータルの景色のレンダーテクスチャを作るためにカメラの回転や位置の制御を実装できたのですがカメラの距離がポータルから離れた状態だとポータルやポータルより手前のオブジェクトが映ってしまうのですが、動画では何故かうまくいっているので何が原因でうまくいかないのか悩んでいます。
該当のソースコード
追記 ソースコード更新しました!
C#
1using UnityEngine; 2 3[RequireComponent(typeof(Camera))] 4public class test2 : MonoBehaviour 5{ 6 // 視錐台の切断面となるオブジェクト 7 [SerializeField] private Transform planeTransform; 8 public GameObject cupcel; 9 public GameObject portal; 10 public GameObject Otherportal; 11 private readonly Vector3[] clipCorners = new Vector3[8]; 12 private new Camera camera; 13 14 private void Start() 15 { 16 this.camera = this.GetComponent<Camera>(); 17 } 18 19 private void LateUpdate() 20 { 21 if (this.planeTransform == null) 22 { 23 return; 24 } 25 26 var plane = new Plane(this.planeTransform.up, this.planeTransform.position); 27 var planeWorldVector = (Vector4)plane.normal; 28 planeWorldVector.w = plane.distance; 29 // ワールド空間でのニアクリップ面ベクトルを作成する 30 31 var diff = portal.transform.position - cupcel.transform.position; 32 transform.position = Otherportal.transform.position + diff; 33 transform.LookAt(Otherportal.transform.position); 34 35 // ビュー変換行列を取得する 36 var worldToView = this.camera.worldToCameraMatrix; 37 38 // ニアクリップ面ベクトルをビュー座標に直す 39 var planeViewVector = worldToView.inverse.transpose * planeWorldVector; 40 41 // プロジェクション行列を正しく加工するには、切断面の法線が画面奥を 42 // 向いている必要があるため、法線のZ成分の符号に応じて面を反転する 43 44 // 斜めに加工したプロジェクション行列を作る 45 var obliqueMatrix = this.camera.CalculateObliqueMatrix(planeViewVector); 46 47 // カメラにプロジェクション行列をセットする 48 this.camera.projectionMatrix = obliqueMatrix; 49 50 // クリップ空間を視覚的に確認するため、角のワールド座標を求める 51 var clipToView = obliqueMatrix.inverse; 52 var viewToWorld = worldToView.inverse; 53 for (var z = 0; z < 2; z++) 54 { 55 for (var y = 0; y < 2; y++) 56 { 57 for (var x = 0; x < 2; x++) 58 { 59 var p = clipToView.MultiplyPoint((new Vector3(x, y, z) * 2.0f) - Vector3.one); 60 p *= Mathf.Sign(-p.z); 61 this.clipCorners[(z << 2) | (y << 1) | x] = viewToWorld.MultiplyPoint3x4(p); 62 } 63 } 64 } 65 } 66 67 private void OnDrawGizmos() 68 { 69 // シーンビュー上に枠線を描く 70 Gizmos.color = Color.red; 71 Gizmos.DrawLine(this.clipCorners[0], this.clipCorners[1]); 72 Gizmos.DrawLine(this.clipCorners[1], this.clipCorners[3]); 73 Gizmos.DrawLine(this.clipCorners[3], this.clipCorners[2]); 74 Gizmos.DrawLine(this.clipCorners[2], this.clipCorners[0]); 75 Gizmos.color = new Color(1.0f, 0.5f, 0.0f); 76 Gizmos.DrawLine(this.clipCorners[0], this.clipCorners[4]); 77 Gizmos.DrawLine(this.clipCorners[1], this.clipCorners[5]); 78 Gizmos.DrawLine(this.clipCorners[2], this.clipCorners[6]); 79 Gizmos.DrawLine(this.clipCorners[3], this.clipCorners[7]); 80 Gizmos.color = Color.yellow; 81 Gizmos.DrawLine(this.clipCorners[4], this.clipCorners[5]); 82 Gizmos.DrawLine(this.clipCorners[5], this.clipCorners[7]); 83 Gizmos.DrawLine(this.clipCorners[7], this.clipCorners[6]); 84 Gizmos.DrawLine(this.clipCorners[6], this.clipCorners[4]); 85 } 86}
試したこと
AIやグループLINEに質問してみましたがなかなか解決できず、悩んでいます。
再追記
動画バージョン
https://38.gigafile.nu/1216-62c595b9a4ccfd60149ad52230543472
補足情報(FW/ツールのバージョンなど)
unity 2021.3.22f1
3D環境です。
カメラの視錐台を斜め?にするために動画ではVector4などを使っていてよく理解できなかったので、可能であればカメラやVector4関係の学習が初心者にもできるようなサイトなどを教えていただければ嬉しいです。
回答3件
あなたの回答
tips
プレビュー