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

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

ただいまの
回答率

91.25%

  • C#

    5037questions

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

  • Unity

    2483questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

UnityでのScreenToWorldPointについて

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 77

moyashi0331

score 1

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/ツール等のバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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


コメントを受けて追記:

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

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

    GameObject meshGameObj = null;

    void Update()
    {
        mousePressed();
        if (hitNum > 3 && meshGameObj == null)
        {//4点以上クリックしていたら
            Vector3[] vertices = new Vector3[4];
            for (int i = 0; i < 4; i++)
            {
                vertices[i] = Camera.main.ScreenToWorldPoint(mousepos[i]);//頂点座標を絶対座標に変換した
            }

            int[] triangles = { 0, 1, 2, 0, 2, 3 };
            Mesh mesh = new Mesh();
            mesh.vertices = vertices;
            mesh.triangles = triangles;
            mesh.RecalculateNormals();
            meshGameObj = new GameObject();
            meshGameObj.transform.position = Vector3.zero;
            meshGameObj.transform.rotation = Quaternion.identity;
            MeshFilter meshFilter = meshGameObj.GetComponent<MeshFilter>();
            if (!meshFilter)
                meshFilter = meshGameObj.AddComponent<MeshFilter>();
            MeshRenderer meshRenderer = meshGameObj.GetComponent<MeshRenderer>();
            if (!meshRenderer)
                meshRenderer = meshGameObj.AddComponent<MeshRenderer>();
            meshFilter.mesh = mesh;
            meshRenderer.sharedMaterial = material;
        }
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/25 21: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 21:41

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

    キャンセル

  • 2017/12/25 22: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 23:05

    mouse/=100をなくし、mouse.z=20fにしたらできました
    ありがとうございます

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

    キャンセル

  • 2017/12/26 08:42

    回答に追記しました。

    キャンセル

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

ただいまの回答率

91.25%

関連した質問

  • 受付中

    画面上でランダムに画像を表示したい

    以前にも質問した内容ですが、 「画面内に現れるオブジェクト にマウスのアイコンを持っ   ていくと、オブジェクトが消え別の顔が現れる。これを三   回 繰り返す、それを数回消した

  • 解決済

    unityで鏡

    unityで対戦ゲームを作っていています。 こちらのサイトを参考にして(http://atsushishi.com/blog/2016/04/unity-mirror/)アイテム

  • 受付中

    unityのドラッグについて

    初心者です Unityのスクリプトでオブジェクトをドラックさせて移動させたいと思い、他サイトを参考にしましたが出来ていないようでした(ドラックしようとしてもSceneがいつものよ

  • 解決済

    Unity5.4:二つの位置の距離を保ったまま移動させたい

    タッチした場所(この後スワイプ)とオブジェクトの距離はそのままにオブジェクトを移動させたいです。 座標で例えるとタッチ(1.1)→(2.2)になった場合,obj(2.2)→(3.

  • 解決済

    Unity シューティングゲームでの移動について

    前提・実現したいこと Unityの学習でiPhone用シューティングゲームを制作しています。 自機の移動について質問させてください。 以下のサイト様のサンプルコードを参考

  • 解決済

    Unity2D:プログラムの流れと画像を連続で変えたい

    現在、Unity2Dについて勉強中の者です。 ふと気になったことと解決しない問題がそれぞれ出たため、僭越ながらここにご質問させていただきます。 いろいろここで質問してみ

  • 受付中

    画面のタッチした場所にオブジェクトを徐々に移動させる(iTween)

    前提・実現したいこと タッチしたところにオブジェクトを徐々に移動させたい 発生している問題・エラーメッセージ タッチしたところに瞬間移動する 該当のソースコード

  • 解決済

    Unity 2D C# オブジェクトをタップした方向に時計の針のように回転させたい。

    ・スティック状の画像 ・空のオブジェクト 現状空のオブジェクトをスティック画像の左端に配置し スティック画像の回転ができている状態です。 スティック画像をタッチ、スワイプさ

同じタグがついた質問を見る

  • C#

    5037questions

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

  • Unity

    2483questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。