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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

1回答

1075閲覧

UnityでのScreenToWorldPointについて

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2017/12/25 11:40

###4点をマウスクリックすると、そこを頂点とした四角形を表示させたい
四角形の描画まではいったのですが、位置ずれがおきてしまっていたのでScreenToWorldPointを使用しました
四角形を描画するスクリプトはメインカメラに入れています
しかし、z軸を指定していますが、カメラの座標を返してきてます
どのようにすれば絶対座標に変換できるのでしょうか?

###発生している問題・エラーメッセージ
画面上での頂点4つの異なる座標は得られるが、絶対座標にしたときにすべての頂点の値がカメラの座標になってしまう

###該当のソースコード

Vector3[] mousepos=new Vector3[4]; private int hitNum=0; void Update(){ mousePressed() if (hitNum > 3) {//4点以上クリックしていたら Vector3[] vertices=new Vector3[4]; for (int i = 0; i < 4; i++) { vertices [i] = Camera.main.ScreenToWorldPoint (mousepos [i]);//頂点座標を絶対座標に変換したい } } 以下四角形の描画するコード } void mousePressed(){ if(Input.GetMouseButtonDown(0)){ switch(hitNum){//マウスをクリックした回数 case 0: Vector3 mouse = Input.mousePosition; mouse /= 100; mouse.z = 0f; mousepos [0] = mouse; hitNum++; break; case 1: mouse = Input.mousePosition; mouse /= 100; mouse.z = 0f; hitNum++; mousepos [1] = mouse; break; case 2: mouse = Input.mousePosition; mouse /= 100; mouse.z = 0f; hitNum++; mousepos [2] = mouse; break; case 3: mouse = Input.mousePosition; mouse /= 100; mouse.z = 0; hitNum++; mousepos [3] = mouse; break; default: break; } } }

###試したこと
CameraのProjectionをPerspectiveからOrthographicに変えてみたとき、頂点座標はカメラの座標にはならなかったが、すべての頂点の座標が同じ値になってしまった

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

guest

回答1

0

verticesにCamera.main.ScreenToWorldPoint()の結果を代入しておりますが、スコープから察するにverticesはどこにも使われていない気がします。
(このソースの場合、verticesはif文の中でのみ有効です。もし、外部で使用したい場合はif文の外で定義する必要があります)
verticesにすべきところをmouseposにしているからではないでしょうか?


コメントを受けて追記:

あなたと私でこのスクリプトをアタッチしているゲームオブジェクトが違っていたみたいです。
私は(0, 0, 0)の位置に空のゲームオブジェクトを配置して、それにアタッチしていました。

以下のようにすることで、アタッチしたオブジェクトに関わらず、私が意図した通りの位置に配置できるようになります。

C#

1 GameObject meshGameObj = null; 2 3 void Update() 4 { 5 mousePressed(); 6 if (hitNum > 3 && meshGameObj == null) 7 {//4点以上クリックしていたら 8 Vector3[] vertices = new Vector3[4]; 9 for (int i = 0; i < 4; i++) 10 { 11 vertices[i] = Camera.main.ScreenToWorldPoint(mousepos[i]);//頂点座標を絶対座標に変換した 12 } 13 14 int[] triangles = { 0, 1, 2, 0, 2, 3 }; 15 Mesh mesh = new Mesh(); 16 mesh.vertices = vertices; 17 mesh.triangles = triangles; 18 mesh.RecalculateNormals(); 19 meshGameObj = new GameObject(); 20 meshGameObj.transform.position = Vector3.zero; 21 meshGameObj.transform.rotation = Quaternion.identity; 22 MeshFilter meshFilter = meshGameObj.GetComponent<MeshFilter>(); 23 if (!meshFilter) 24 meshFilter = meshGameObj.AddComponent<MeshFilter>(); 25 MeshRenderer meshRenderer = meshGameObj.GetComponent<MeshRenderer>(); 26 if (!meshRenderer) 27 meshRenderer = meshGameObj.AddComponent<MeshRenderer>(); 28 meshFilter.mesh = mesh; 29 meshRenderer.sharedMaterial = material; 30 } 31 }

投稿2017/12/25 12:17

編集2017/12/25 23:41
fiveHundred

総合スコア9803

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

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

退会済みユーザー

退会済みユーザー

2017/12/25 12:40

verticesは四角形の描画に使用しております 「以下四角形の描画するコード」に下記のコードが入ってます int[] triangles = { 0, 1, 2, 0, 2, 3 }; Mesh mesh = new Mesh ();    mesh.vertices = vertices;    mesh.triangles = triangles; mesh.RecalculateNormals (); MeshFilter meshFilter = gameObject.GetComponent<MeshFilter> ();    if (!meshFilter) meshFilter = gameObject.AddComponent<MeshFilter> (); MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer> ();    if (!meshRenderer) meshRenderer = gameObject.AddComponent<MeshRenderer> (); meshFilter.mesh = mesh;    meshRenderer.sharedMaterial = material;
退会済みユーザー

退会済みユーザー

2017/12/25 12:41

「以下四角形を描画するコード」はif文のなかにあります すいません
fiveHundred

2017/12/25 13:15

失礼しました。代わりに以下の方法を試してみてください。 switch文の中にある「mouse.z = 0f;」を「mouse.z = 10f;」などにし、「mouse /= 100;」は削除してみてください。 Camera.main.ScreenToWorldPoint()の引数で指定するz座標は、カメラから見たときの奥行です。 「mouse.z = 0f;」としてしまうと、カメラを原点とした奥行が0の位置、すなわちカメラ自身の位置が代入されてしまいます。 そのため、「mouse.z = 10f;」など、適当な値を入れる必要があります。 また、「mouse /= 100;」は何故このようにしているのかよく分かりませんでしたが、Camera.main.ScreenToWorldPoint()の引数で指定するx座標とy座標は画面上での位置なので、Input.mousePositionの値をそのまま使えばよいので不要です。
退会済みユーザー

退会済みユーザー

2017/12/25 14:05

mouse/=100をなくし、mouse.z=20fにしたらできました ありがとうございます ここで質問なんですが、カメラのz軸が-10でmouse.z=10fの時に四角形がカメラと同じz座標上に描画され、mouse.z=20fの時にz軸が0の場所に四角形が描画されました。 このmouse.z=10fの10fはどこを支点に考えた10fなのでしょうか?
fiveHundred

2017/12/25 23:42

回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問