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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

2回答

4862閲覧

スクリーン座標について

Qoo

総合スコア1249

Unity

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

0グッド

1クリップ

投稿2019/03/20 21:51

編集2019/03/21 00:02

unityでワールドの位置に対して四角形を描画することはできたのですが、
スクリーン座標に対してどのように座標変換すればよいのかがわかりません。

ワールド座標で四角を描画

c#

1 2 line = this.gameObject.AddComponent<LineRenderer>(); 3 line.SetWidth(0.1f,0.1f); 4 line.SetVertexCount(5); 5 6 var startVec = new Vector3 (0.0f, 0.0f, 0.0f); 7 line.SetPosition (0, startVec); 8 line.SetPosition (1, new Vector3(startVec.x + 2.0f,startVec.y,startVec.z)); 9 line.SetPosition (2, new Vector3(startVec.x + 2.0f,startVec.y + 2.0f ,startVec.z)); 10 line.SetPosition (3, new Vector3(startVec.x,startVec.y + 2.0f ,startVec.z)); 11 line.SetPosition (4, new Vector3(startVec.x,startVec.y,startVec.z)); 12 13

例えば画面の左上を0,0として 右に100px、下に100pxの位置から500pxの四角を描画するにはどのようにすればよいのでしょうか?
一応下記のようにScreenToWorldPointを使用してみたのですが、画面上には何も描画されません

c#

1 2 var x = 100; 3 var y = 100; 4 var width = 500; 5 var height = 500; 6 7 Vector2 vec2pos = new Vector2(x,y); 8 Vector3 vecpos = Camera.main.ScreenToWorldPoint( vec2pos ); 9 line.SetPosition (0, vecpos); 10 11 vec2pos = new Vector2(x + width,y); 12 vecpos = Camera.main.ScreenToWorldPoint( vec2pos ); 13 line.SetPosition (1, vecpos); 14 15 vec2pos = new Vector2(x + width,y + height); 16 vecpos = Camera.main.ScreenToWorldPoint( vec2pos ); 17 line.SetPosition (2, vecpos); 18 19 vec2pos = new Vector2(x ,y + height ); 20 vecpos = Camera.main.ScreenToWorldPoint( vec2pos ); 21 line.SetPosition (3, vecpos); 22 23 vec2pos = new Vector2(x ,y ); 24 vecpos = Camera.main.ScreenToWorldPoint( vec2pos ); 25 line.SetPosition (4, vecpos); 26

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

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

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

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

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

y_waiwai

2019/03/20 23:53

質問文が中途半端になってます。修正しましょう もしかして、Teratailのバグかな?その場合は編集ボタン押してそのまま保存すればいいです (編集理由は適当に入れときましょう)
Qoo

2019/03/21 00:02

顔文字使ったら文字化けしたので修正
guest

回答2

0

ベストアンサー

vecpos = Camera.main.ScreenToWorldPoint( vec2pos );
の次の行にそれぞれ
vecpos.z = 0.0f;(数字は任意)
を追加してください。

そのままだと各頂点のZ位置がカメラのZ位置と同じになりますが、カメラはあまりに近くの物は映せません。(具体的にはCameraコンポーネントのClipping PlanesのNearより近い物は映らない)
なので適宜Z位置を調整して、カメラから適度に離れた状態にすれば映ると思います。

なお、Unityのスクリーン座標の原点は左下です。(Xが増えるほど右へ、Yが増えるほど上へ進む)
基準点を変えたい場合は、Screen.widthScreen.heightで画面全体の横pxと縦pxが取得出来るので、適宜計算してください(算数の問題なのでそう難しくはない筈です)。

投稿2019/03/21 05:27

sakura_hana

総合スコア11427

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

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

Qoo

2019/03/21 05:49

ありがとうございます!そういうことだったんですね! とても良くわかりました!ありがとうございました!
guest

0

四角形というものがAABBの事なのかOBBの事なのかは不明ですがここのCamera.main.WorldToViewportPoint(Vector3)関数を参考にすれば、点のスクリーン座標変換は可能です。

投稿2019/03/21 01:48

stdio

総合スコア3307

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

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

Qoo

2019/03/21 04:52

URLページのCamera.main.WorldToViewportPoint(Vector3)関数を参考にし 作成してみたのですが、うまく描画されなかったのでご質問させて頂きました。 記載したコードの何が間違いなのかが知りたいという意味合いになります。
stdio

2019/03/21 05:28

そもそも2次元から3次元へは行くこと自体が色々な要素が必要になる為、容易ではありません。 その辺をよく理解していますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問