前提・実現したいこと
ビューポート座標の変換で意図した通りにならないのでご教示お願いします。
質問1
C#
1 Vector3 worldpos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, 0)); 2 Vector3 viewpos = Camera.main.WorldToViewportPoint(worldpos); 3 Debug.Log(viewpos);
上記、(0.8f, 0.6f, 0)の出力を期待していたのですが、実際の出力結果は下記のようになってしまいました。
何故でしょうか?
(0.5, 0.5, 0.0)
試したこと
0の近似値で試してみました。少し値が変わりましたが、やはり意図した座標ではありません。
C#
1Vector3 worldpos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, 0.000001f)); 2//(0.6, 0.5, 0.0)
上記よりちょっと値を上げたら、意図した座標になりましたが、これは何故でしょうか?
C#
1Vector3 worldpos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, 0.00001f)); 2//(0.8, 0.6, 0.0)
リファレンスを見たら、
nearClipPlaneというのがあったので、ビューポートのZ値の最小値はnearClipPlaneということであれば、納得がいったのですが、
nearClipPlaneは0.3だったので、成功した上記は0.3よりもはるかに小さい値だったので、今一つ、腑に落ちません。
また、0はダメだけど、0の近似値ならばOKという場合だったら、何故、0.000001fではうまくいかなかったのでしょうか。
C#
1Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, Camera.main.nearClipPlane)); 2//(0.8, 0.6, 0.3)
質問2
質問1がよくわからなかったので、Camera.main.nearClipPlaneでコードを進めてみることにしました。
下記コードを組んだのですが、コメントのような出力結果になってしまいました。
C#
1 Vector3 worldpos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, Camera.main.nearClipPlane)); 2 cube.transform.position = worldpos + Camera.main.transform.forward * 5; 3 Vector3 cubeViewport = Camera.main.WorldToViewportPoint(cube.transform.position); 4 Debug.Log("cubeViewport.x:" + cubeViewport.x); //0.5169811 5 Debug.Log("cubeViewport.y:" + cubeViewport.y); //0.5056604 6 Debug.Log("cubeViewport.z:" + cubeViewport.z); //5.299999
Camera.main.transform.forward * 5 は、x,yに影響を与えないかと思っていたのですが、
なぜ、cubeViewport.xが0.8fに、cubeViewport.yが0.6fにならないのでしょうか?
誤差にしては大き過ぎると思いました。
追記
C#
1 Vector3 worldpos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.6f, 5f)); 2 cube.transform.position = worldpos; 3 Vector3 cubeViewport = Camera.main.WorldToViewportPoint(cube.transform.position); 4 Debug.Log("cubeViewport.x:" + cubeViewport.x); //0.7999997 5 Debug.Log("cubeViewport.y:" + cubeViewport.y); //0.5999997 6 Debug.Log("cubeViewport.z:" + cubeViewport.z); //5 7 Debug.Log(Vector3.Distance(Camera.main.transform.position, cube.transform.position)); //6.727412 8 9 Vector3 dir = cube.transform.position - Camera.main.transform.position; 10 cube.transform.position = cube.transform.position + Vector3.Normalize(dir)*3; 11 Vector3 cubeViewport2 = Camera.main.WorldToViewportPoint(cube.transform.position); 12 Debug.Log("cubeViewport2.x:" + cubeViewport2.x); //0.7999997 13 Debug.Log("cubeViewport2.y:" + cubeViewport2.y); //0.5999997 14 Debug.Log("cubeViewport2.z:" + cubeViewport2.z); //7.229684 15 Debug.Log(Vector3.Distance(Camera.main.transform.position, cube.transform.position)); //9.727413
追記②
メモ
nDir・forward = cosθ
v=nDir/cosθ
v=nDir/nDir・forward
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/14 14:05
2019/08/14 19:58
退会済みユーザー
2019/08/15 17:38
2019/08/15 23:15
退会済みユーザー
2019/08/16 17:05 編集
2019/08/16 21:10
退会済みユーザー
2019/08/17 15:05 編集
2019/08/17 19:20
退会済みユーザー
2019/08/18 01:59
退会済みユーザー
2019/08/18 04:36 編集
2019/08/18 05:36
退会済みユーザー
2019/08/18 05:42