🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

2回答

1769閲覧

unityの3D座標からスクリーン座標への変換の手動実装について

k.shiho

総合スコア5

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2021/01/30 15:00

unityの3D座標からスクリーン座標への変換について質問です。
RectTransformUtility.WorldToScreenPointと言う命令を使えばすぐに取得できる事についてです

TransformのpositionをJobSystemのTransformAccessから変更したいと思っています。
WorldToScreenPointの引数のCameraはJobsystemの中で使えない為、ビューポート座標に手動変換してTransformを更新しようと思ってます。

こちらの記事を参考に
https://edom18.hateblo.jp/entry/2019/01/06/121013
逆行列をしないでScreen座標を求めようとしました。
(とりあえずテストの為、メインスレッドで実装してます。)

var v = _cam.worldToCameraMatrix;//Camera座標変換 var p = _cam.projectionMatrix;//プロジェクション変換 var vp = Matrix4x4.identity;//ビューポート変換 vp.m00 = Screen.width / 2f; vp.m03 = Screen.width / 2f; vp.m11 = Screen.height / 2f; vp.m13 = Screen.height / 2f; vp.m22 = (_cam.farClipPlane - _cam.nearClipPlane) / 2f; vp.m23 = (_cam.farClipPlane + _cam.nearClipPlane) / 2f; var vt = v * _t.position; var pt = p * vt; var vpt = vp * pt;

この時に最後のvptの中身として

var rp = RectTransformUtility.WorldToScreenPoint(_cam, _t.position);

と同じ答えを期待したのですが、上手く答えが返ってきません。
計算順序や計算方法のおかしい所をご教示願えますでしょうか?
恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

最後の変換を適用する部分で、「【Unity】 Matrix4x4の罠 - エフアンダーバー」と同様の状況になっていませんでしょうか?
下記のように変更してみてはいかがでしょう。

C#

1 // Vector3をVector4に変換すると、足りないwは0.0fとなるので... 2 var t = (Vector4)_t.position; 3 4 // 1.0fに変更する 5 t.w = 1.0f; 6 7 var vt = v * t; 8 var pt = p * vt; 9 var vpt = vp * pt; 10 11 // ちなみに、ご存じかとは思いますがvptは同次座標系にありますので 12 // rpと同じ値を得るには、さらにw成分で割る必要があるでしょう 13 var screenPos = (Vector2)vpt / vpt.w;

投稿2021/01/30 21:40

Bongo

総合スコア10811

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

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

k.shiho

2021/01/31 07:04

bongo様 ご指摘のw値1.0にすることにより思った通りの計算ができました。 当方、とても行列を理解できる知識を持っていない為、途方に暮れていました。 答えを頂いた感じで大変ありがたく思います。 どうもありがとうございました。
guest

0

自己解決

Bongo様ご指摘のW値への1.0を利用した行列計算で解決できました。
どうもありがとうございました。

投稿2021/01/31 07:26

k.shiho

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問