回答編集履歴

2

実験結果についての考察を追記

2018/06/15 23:58

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -40,7 +40,9 @@
40
40
 
41
41
  でいけるかと思うのですが、ご質問者さんの実験結果がちょっと妙ですので、なにか他の問題があるかもしれません。
42
42
 
43
- スクリプトがちゃんと目的のキューブにアタッチされているか(こちらは気づきやすいので間違ってはいないかと思いますが...)、カメラのタグが「MainCamera」になっているか、といった点を確認してみる必要がありそうです。
43
+ ~~スクリプトがちゃんと目的のキューブにアタッチされているか(こちらは気づきやすいので間違ってはいないかと思いますが...)、カメラのタグが「MainCamera」になっているか、といった点を確認してみる必要がありそうです。~~
44
+
45
+ ※下に追記しましたが、実験結果について説明が付きそうでしたので、この部分は取り下げます。
44
46
 
45
47
 
46
48
 
@@ -119,3 +121,39 @@
119
121
  ご質問者さんの参考にされたサイトでzにnearClipPlaneを使っているのは多分「nearClipPlaneの位置が視錐台前後方向の手前側の境界だから」といった理由ではないでしょうかね。
120
122
 
121
123
  今回重要なのは水平垂直方向の境界がワールド空間ではどの位置にあるかということであって、zについては本来のオブジェクトの位置を維持したいということなので、上に例示したコードのように元のビューポート座標のzをそのまま使えばいいかと思います。
124
+
125
+
126
+
127
+ ### さらに追記
128
+
129
+ ご質問者さんのコードをあらためて見直してみたところ、実験結果はこのように説明できそうでした。
130
+
131
+
132
+
133
+ - nearClipPlaneを使わないで(0,0)の配置を試みた場合
134
+
135
+ カメラのワールド座標を(cx, cy, cz)とする。
136
+
137
+ `Camera.main.ViewportToWorldPoint(new Vector2(0, 0))`は型変換によってzが補われ、`Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0))`と解釈される。
138
+
139
+ 得られるVector3は、引数として与えたビューポート座標のzが0なので、カメラを頂点とする四角錐の頂点...つまりカメラ自身の座標(cx, cy, cz)となる。
140
+
141
+ これを一旦Vector2型の`min`に代入したため型変換が起こり、czは欠落する。
142
+
143
+ `min`をVector3である`this.transform.position`に代入する際にまた型変換が起こり、z座標が補われた結果キューブの座標は(cx, cy, 0)に移動する...つまりワールドX、ワールドYはカメラの位置と同じで、ワールドZは0となる。
144
+
145
+  
146
+
147
+ - nearClipPlaneを使って(0,0)の配置を試みた場合
148
+
149
+ 移動前のキューブのワールド座標を(ox, oy, oz)とする。このうちozを変数に保管しておく。
150
+
151
+ `Camera.main.ViewportToWorldPoint(new Vector3 (0.0f, 0.0f, Camera.main.nearClipPlane))`の結果はニアクリップ面矩形の左下隅...つまりシーンビュー上に表示されているカメラ描画範囲の、カメラに近い側の四角形の左下隅のワールド座標となる。この座標を(nx, ny, nz)とする。
152
+
153
+ 得られた座標のX、Yと、保管しておいたozを組み合わせて新たなVector3とし、これを`this.transform.position`に代入する。
154
+
155
+ 結果、キューブの座標は(nx, ny, oz)に移動する...つまりニアクリップ面矩形の左下隅をZ軸方向に動かしていき、ozの位置に合わせたのと同等な位置となる。
156
+
157
+
158
+
159
+ こう考えれば、キューブの位置がご提示いただいた図のような位置になりそうです。ですので、先の回答で申し上げたカメラのタグ確認などは不要そうでしたね。お手間を取らせすみませんでした。

1

nearClipPlane、farClipPlaneについて補足

2018/06/15 23:58

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -109,3 +109,13 @@
109
109
  __ビューポート空間は正規化された、カメラに対して相対的な座標系となります。ビューポートの左下は(0,0)、右上は(1,1)です。z位置はワールド座標系単位でのカメラからの位置です。__
110
110
 
111
111
  __注意:ViewportToWorldPointはx-yからなるビューポート位置をx-y-zからなる三次元空間上の位置に変換します。引数として与えるベクトルはx-y成分にビューポート座標を、z成分に変換先平面のカメラからの距離を指定してください。__
112
+
113
+
114
+
115
+ ### 追記
116
+
117
+ nearClipPlane、farClipPlaneについてですが、これらはカメラのインスペクタの「Clipping Planes」の「Near」と「Far」に対応していて、カメラに対して前後にこの範囲を外れた部分はスッパリ切断されたように描画されなくなってしまいます。描画の都合上、カメラに極めて近い部分や無限に遠い部分を表示することはできないため、これらに適切な値を入れて前後方向の描画範囲を制限してやる必要があります(参考:[【Unity】【数学】視錐台(Frustum)について(第1回) – 株式会社ロジカルビート](http://logicalbeat.jp/blog/815/))。
118
+
119
+ ご質問者さんの参考にされたサイトでzにnearClipPlaneを使っているのは多分「nearClipPlaneの位置が視錐台前後方向の手前側の境界だから」といった理由ではないでしょうかね。
120
+
121
+ 今回重要なのは水平垂直方向の境界がワールド空間ではどの位置にあるかということであって、zについては本来のオブジェクトの位置を維持したいということなので、上に例示したコードのように元のビューポート座標のzをそのまま使えばいいかと思います。