序文
Unity には、ワールド座標系、ローカル座標系、スクリーン座標系、ビューポート座標系など、さまざまな座標系があります。これらの座標系は、初心者 (私) にとっては多くのトラブルを引き起こすことがよくありますが、不可欠です。たとえば、マウスの位置をワールド座標で求める場合、ワールド座標とスクリーン座標の意味と変換方法を理解しておく必要があります.この記事では、さまざまな座標系とその変換方法と応用について詳しく紹介します.みんなを助けて。
目次
前列のリマインダー:この記事は、交換と学習のための個人的な意見のみを表しています.異なる意見がある場合は、コメントを残してください.著者は一生懸命勉強し、毎日進歩しなければなりません.
この記事を読んで、わからないことがあれば、この記事に記載されている参考資料を見て比較することをお勧めします。
著者の数学は比較的ずさんです. 読者はこの記事の座標系の説明を精査して見てください. 間違いがあれば修正してください. 著者は非常に感謝しています!
Unity版【2019.4.10f1】Dream Xiaotianyou&転載禁止
1. Unity の座標系
1.ワールド座標
Unity から新しいオブジェクト オブジェクトを作成すると、その Transform パラメータは、図に示すように左手座標系と右手座標系に分けられるワールド座標系を採用します。このうち、左手座標系は Unity でのワールド座標系であり、右手座標系は数学でより一般的に使用されるため、ここでは説明しません。
読者が概念を混同しないことを願っています。左手座標系と右手座標系の 2 つの座標系があり、Unity では左手座標系が採用されています。つまり、Z 軸は正、X 軸は右、Y 軸が上です。
Unity 内のオブジェクトの座標情報は、3 次元ベクトルで XYZ 情報を格納する Vector3 変数である Transform.position によって格納されます。
Unity では、正の方向は Transform.forward で表すことができ、正の方向は Vector3.forward で表すこともできます。2 つの違いは次のとおりです。
Vector3.forward の値は常に (0,0,1) ですが、transform.forward の値は現在のオブジェクト自体の座標系の Z 軸に基づいており、必ずしも (0,0,1) に等しいとは限りません。 . それをどのように理解するか、例えば .
まず、オブジェクトの transform.position は、ワールド座標におけるオブジェクトの位置でなければならず、対応する transform.localPosition は、オブジェクトのローカル座標です. 次に、transform += Vector3.forward の場合、前進することと同じです.ワールド座標の Z 軸に、transform += transform.forward の場合、ローカル座標の Z 軸に進むことと同じです。
2. 画面座標系
画面座標系とは、画面を左下隅の(0,0)、右上隅を(Screen.width, Screen.height)とする座標系とみなすことから、それとも呼ばれます。ピクセル座標系 次のコード行を実行すると、現在のゲーム ウィンドウの画面解像度が取得されます。
void Start()
{
Debug.Log("当前窗口的分辨率为:" + Screen.width + "X" + Screen.height);
Debug.Log("当前屏幕的分辨率为:" + Screen.currentResolution);
}
マウスの位置座標はスクリーン座標系に属し、スクリーン座標とワールド座標との相互変換により、Unity3D でのマウスの実際のインタラクティブな位置を取得し、ロジックを介してフィードバックすることができます。
3. ビューポート座標系
この座標系の計算方法はスクリーン座標系の計算方法に似ていますが、そのパラメータは標準化されており、比例計算により適しています。
左下隅は (0,0)、右上隅は (1,1) です。
ここでは、ビューポート座標であろうとスクリーン座標であろうと、深さを示す z 値は引き続き使用できます。
4. GUI座標系
座標は左上隅から計算され、左上隅は (0,0)、右下隅は (Screen.width, Screen.height) です。
二、座標系の相互変換
Unity での複数の座標系の使用は、さまざまな状況でさまざまな座標を使用して、より便利にすることです。さまざまな座標が使用されるため、適切な変換方法を提供する必要があります. 以下は、上記の座標の相互変換の簡単な要約です.
実際、これらの座標系は多くの外観を備えたまばゆいばかりに見えます. 実際には、実際にワールドからスクリーン (またはスクリーンからワールド) について議論する価値があり、他の座標系は簡単に実装できます.
1.ワールド座標とスクリーン座標の相互変換
スクリーン座標からワールド座標へ
Camera.ScreenToWorldPoint(Vector3 Pos);
ワールド座標からスクリーン座標へ
Camera.WorldToScreenPoint(Vector3 Pos);
アプリケーションについて:
これらの変換は、通常、マウスで移動するオブジェクトなど、マウスで操作したいワールド オブジェクトに適用されます...
ケースプレゼンテーション
オブジェクトはマウスで移動、xyz は移動
このコードを見ただけでは理解できないかもしれません. たとえば、次の文を直接使用できるように感じます. なぜわざわざ? これを見て、試してみてから見下ろす必要があります
Camera.main.WorldToScreenPoint(Input.mousePosition);
さて、上記の文をそのまま使うと世界座標が Z 値を欠いてしまうので、変換後の座標が間違っているに違いないことは理解できたはずです.そこで、このバグを巧妙に補う必要があります.コード
は次のように。(この文言はインターネットで見つけたもので、ソースが見つかりません)
void Update()
{
// 首先将要操纵的物体的世界坐标转为屏幕坐标
Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
// 然后获取鼠标的屏幕坐标
Vector3 mousePos = Input.mousePosition;
// 然后将已经转换好的物体的屏幕坐标的Z值赋给缺失z值的鼠标屏幕坐标
mousePos.z = screenPos.z;
// 然后将已经完整的鼠标屏幕坐标转成世界坐标
Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
// 最后每帧修改物体世界坐标位置
transform.position = worldPos;
}
2. ワールド座標とビューポート座標の相互変換
ワールド座標をビューポート座標に変換します
Camera.WorldToViewportPoint(Vector3 Pos)
ビューポート座標からワールド座標へ
Camera.ViewportToWorldPoint(Vector3 Pos);
この原理は先ほどと同様で、画面とビューポートを相互に変換できるため、上記の変換関数を次のように置き換えても同様です。ビューポートをワールド座標に変換する場合、マウス位置の画面座標をビューポートに変換してから使用する必要があります. わからない場合は、単に変更してコードを貼り付けます.同じ効果があるため、ダイナミック ダイアグラムは表示されません。
// 首先将要操纵的物体的世界坐标转为视口做坐标
Vector3 screenPos = Camera.main.WorldToViewportPoint(transform.position);
// 然后获取鼠标的屏幕坐标
Vector3 mousePos = Input.mousePosition;
// 然后将已经转换好的物体的屏幕坐标的Z值赋给缺失z值的鼠标屏幕坐标
mousePos.z = screenPos.z;
// 将屏幕坐标转为视口坐标
mousePos = Camera.main.ScreenToViewportPoint(mousePos);
// 然后将已经完整的视口坐标转成世界坐标
Vector3 worldPos = Camera.main.ViewportToWorldPoint(mousePos);
// 最后每帧修改物体世界坐标位置
transform.position = worldPos;
3. 画面座標とビューポート座標の相互変換
画面座標をビューポート座標に変換します
Camera.ScreenToViewportPoint(Vector3 Pos)
ビューポート座標からスクリーン座標へ
Camera.ViewportToScreenPoint(Vector3 Pos);
例は上に示したので、ここでは説明しません。
4. ワールド座標とローカル座標の相互変換
ここでの使用法はより複雑で、内容は包括的ではなく、この部分の知識は将来書き直され、フラグが設定されます
ワールド座標をローカル座標に変換します
transform.InverseTransformPoint(Vector3 Pos);
transform.worldToLocalMatrix
ローカル座標をワールド座標に変換します
transform.TransformPoint(Vector3 Pos);
transform.localToworldMatrix
3. 座標系の混乱
座標系を使用する場合、非常に多くの別名を聞いたことがあるかもしれません.初心者にとっては、より一般的でない名前のいくつかに疑問を抱くのは簡単です.ここでそれらを整理しましょう.
- ワールド座標、グローバル座標、左手座標、絶対座標
- ローカル座標、自身の座標、オブジェクト座標、ローカル座標、相対座標
- 画面座標、ピクセル座標
- ビューポート座標、ウィンドウ座標
- GUI座標、UI座標
これらはおそらく私が聞いたことがあるものであり、将来他の名前に出くわすことがあり、それらを追加します.
4. まとめと参考文献
1. まとめ
Unity の座標系
- ワールド座標 (絶対座標、ワールド内のオブジェクトの位置座標)
- ローカル座標 (オブジェクト自体が持つ座標)
- 画面座標 (左下隅から始まるゲーム ウィンドウのピクセル サイズ)
- ビューポート座標 (左下 [0,0] 右上 [1,1])
- GUI 座標 (UI 固有の座標系、計算は左上隅から開始され、右下隅は画面のピクセル サイズ)
Unity 座標系の変換
- 注意を払う唯一のもの:画面から世界へ
- 画面には z 値が必要で、ワールドを回転させると正しい値が得られます
2.参考文献
[1]. Call me Oriental Little Paris.空間直角座標系、左手座標系、右手座標系
[2].qq_38806355.スクリーン座標をワールド座標に変換する Unity の考え方
[3]. GolDHeaven.スクリーンUnity の座標とビュー 座標とワールド座標の相互変換
[4].AbnerHu. Unity の画面座標をワールド座標に変換、オブジェクトはマウスで移動
[5].Peter_Gao_. Unity の各空間の位置: ワールド座標、スクリーン座標、カメラ座標、ローカル座標
[6] ].Htlas. Unity3D 座標系解析 (2): スクリーン座標系、ビュー座標系