質問編集履歴

2

スクリプトの修正と指摘部分の修正

2023/12/10 20:27

投稿

pimen
pimen

スコア6

test CHANGED
File without changes
test CHANGED
@@ -11,43 +11,103 @@
11
11
 
12
12
 
13
13
  ### 該当のソースコード
14
-
14
+ 追記 ソースコード更新しました!
15
15
  ```C#
16
- using System.Collections;
17
- using System.Collections.Generic;
18
16
  using UnityEngine;
19
17
 
18
+ [RequireComponent(typeof(Camera))]
20
- public class portalcam1 : MonoBehaviour
19
+ public class test2 : MonoBehaviour
21
20
  {
21
+ // 視錐台の切断面となるオブジェクト
22
+ [SerializeField] private Transform planeTransform;
22
- public Camera maincam1;
23
+ public GameObject cupcel;
23
- public Camera porcam1;
24
- public GameObject portal1;
24
+ public GameObject portal;
25
+ public GameObject Otherportal;
25
- // Start is called before the first frame update
26
+ private readonly Vector3[] clipCorners = new Vector3[8];
26
- void Start()
27
+ private new Camera camera;
27
- {
28
-
29
- }
30
28
 
31
- // Update is called once per frame
32
- void Update()
29
+ private void Start()
33
- {
30
+ {
31
+ this.camera = this.GetComponent<Camera>();
32
+ }
34
33
 
35
- Vector3 cameraOffset = maincam1.transform.position - portal1.transform.position;
34
+ private void LateUpdate()
35
+ {
36
- porcam1.transform.position = portal1.transform.position + cameraOffset;
36
+ if (this.planeTransform == null)
37
+ {
38
+ return;
39
+ }
37
40
 
41
+ var plane = new Plane(this.planeTransform.up, this.planeTransform.position);
42
+ var planeWorldVector = (Vector4)plane.normal;
43
+ planeWorldVector.w = plane.distance;
44
+ // ワールド空間でのニアクリップ面ベクトルを作成する
45
+
38
- // Make portal cam face the same direction as the main camera.
46
+ var diff = portal.transform.position - cupcel.transform.position;
39
- porcam1.transform.rotation = Quaternion.LookRotation(maincam1.transform.forward, Vector3.up);
47
+ transform.position = Otherportal.transform.position + diff;
48
+ transform.LookAt(Otherportal.transform.position);
49
+
50
+ // ビュー変換行列を取得する
51
+ var worldToView = this.camera.worldToCameraMatrix;
52
+
53
+ // ニアクリップ面ベクトルをビュー座標に直す
54
+ var planeViewVector = worldToView.inverse.transpose * planeWorldVector;
55
+
56
+ // プロジェクション行列を正しく加工するには、切断面の法線が画面奥を
57
+ // 向いている必要があるため、法線のZ成分の符号に応じて面を反転する
58
+
59
+ // 斜めに加工したプロジェクション行列を作る
60
+ var obliqueMatrix = this.camera.CalculateObliqueMatrix(planeViewVector);
61
+
62
+ // カメラにプロジェクション行列をセットする
63
+ this.camera.projectionMatrix = obliqueMatrix;
64
+
65
+ // クリップ空間を視覚的に確認するため、角のワールド座標を求める
66
+ var clipToView = obliqueMatrix.inverse;
67
+ var viewToWorld = worldToView.inverse;
68
+ for (var z = 0; z < 2; z++)
69
+ {
70
+ for (var y = 0; y < 2; y++)
71
+ {
72
+ for (var x = 0; x < 2; x++)
73
+ {
74
+ var p = clipToView.MultiplyPoint((new Vector3(x, y, z) * 2.0f) - Vector3.one);
75
+ p *= Mathf.Sign(-p.z);
76
+ this.clipCorners[(z << 2) | (y << 1) | x] = viewToWorld.MultiplyPoint3x4(p);
40
- }
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ private void OnDrawGizmos()
83
+ {
84
+ // シーンビュー上に枠線を描く
85
+ Gizmos.color = Color.red;
86
+ Gizmos.DrawLine(this.clipCorners[0], this.clipCorners[1]);
87
+ Gizmos.DrawLine(this.clipCorners[1], this.clipCorners[3]);
88
+ Gizmos.DrawLine(this.clipCorners[3], this.clipCorners[2]);
89
+ Gizmos.DrawLine(this.clipCorners[2], this.clipCorners[0]);
90
+ Gizmos.color = new Color(1.0f, 0.5f, 0.0f);
91
+ Gizmos.DrawLine(this.clipCorners[0], this.clipCorners[4]);
92
+ Gizmos.DrawLine(this.clipCorners[1], this.clipCorners[5]);
93
+ Gizmos.DrawLine(this.clipCorners[2], this.clipCorners[6]);
94
+ Gizmos.DrawLine(this.clipCorners[3], this.clipCorners[7]);
95
+ Gizmos.color = Color.yellow;
96
+ Gizmos.DrawLine(this.clipCorners[4], this.clipCorners[5]);
97
+ Gizmos.DrawLine(this.clipCorners[5], this.clipCorners[7]);
98
+ Gizmos.DrawLine(this.clipCorners[7], this.clipCorners[6]);
99
+ Gizmos.DrawLine(this.clipCorners[6], this.clipCorners[4]);
100
+ }
41
101
  }
42
102
  ```
43
103
 
44
104
  ### 試したこと
45
105
  AIやグループLINEに質問してみましたがなかなか解決できず、悩んでいます。
46
- 追記
106
+ 追記
47
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-09/103f5f58-3cb1-4e79-9a98-c05e5fb61960.png)
48
- ゲーム画面
49
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-09/624d7a9c-e6ee-4cd8-9553-1af29df4b070.png)
107
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-11/476d6893-369f-457a-840c-36e20d253bc6.png)
50
- なぜか切り取りがうまくいきません
108
+ 動画バージョン
109
+ https://38.gigafile.nu/1216-62c595b9a4ccfd60149ad52230543472
110
+
51
111
  ### 補足情報(FW/ツールのバージョンなど)
52
112
  unity 2021.3.22f1
53
113
  3D環境です。

1

bobgoさんのコードを丸々コピペで実行した結果を追加いたしました。

2023/12/09 05:52

投稿

pimen
pimen

スコア6

test CHANGED
File without changes
test CHANGED
@@ -43,7 +43,11 @@
43
43
 
44
44
  ### 試したこと
45
45
  AIやグループLINEに質問してみましたがなかなか解決できず、悩んでいます。
46
-
46
+ 追記
47
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-09/103f5f58-3cb1-4e79-9a98-c05e5fb61960.png)
48
+ ゲーム画面
49
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-09/624d7a9c-e6ee-4cd8-9553-1af29df4b070.png)
50
+ なぜか切り取りがうまくいきません
47
51
  ### 補足情報(FW/ツールのバージョンなど)
48
52
  unity 2021.3.22f1
49
53
  3D環境です。