團結一致
游戲物件沒有父物件,這意味著 TransformPoint 不是必需的,我這樣說對嗎?(worldPosition 和 localPosition 應該相同)這段代碼本質上是“Vector3 = Vector3”嗎?似乎 TransformPoint() 只是將 Transform 更改為 Vector 并使用引數偏移它的值。沒有錯誤,但我真的很想明白!!THX!!!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraBehaviour : MonoBehaviour
{
public Vector3 _camOffset = new Vector3 (0.41f,0.84f,-26.4f);
private Transform target;
void Start()
{
target = GameObject.Find("Hero 1").transform;
}
void LateUpdate()
{
this.transform.position = target.TransformPoint(_camOffset);
this.transform.LookAt(target);
}
}
uj5u.com熱心網友回復:
有一些事情正在發生,讓我試著解釋一下。最重要的“房間里的大象”顯然是 Transform 本身的功能。它在 Unty3D 中非常加載,我們將其分解為三個主要部分:資料結構本身、它在渲染引擎中的作用以及它的方法。
將轉換理解為資料結構是微不足道的。只需將其視為僅包含四個欄位的類:LocalPosition (Vector3)、LocalRotation (Quaternion)、Scale (Vector3) 和 Parent(另一個 Transform 或 null)參考。內部可能有更多,但你永遠只擔心這四件事。只有區域位置和旋轉存盤在變換本身中,需要考慮到父級鏈來計算絕對值,除非父級比 local=absolute 為 null。
在將幀發送到渲染之前,渲染引擎使用這些欄位來定位、縮放和旋轉物件頂點。該程序稱為“轉換”,這可能看起來令人困惑,但在您的問題案例中很重要。當渲染具有非空父物件的物件時,變換是鏈式的,因此例如要獲得未旋轉和未縮放的游戲物件的絕對世界位置,它需要添加鏈上所有父項的位置,直到沒有父母。
第三個元素是方法,Transform 類包含了很多方法。其中之一是 LookAt(Transform),它查找并應用旋轉值,使 ite 將前向矢量點變換為目標位置。
現在主要的一點是:TransformPoint 是一套六種方法的一部分(其他方法是 TransformVector、TransformDirection、InverseTransformPoint、InverseTransformVector、InverseTransformDirection)。附帶說明 - 就我個人而言,最初通常不太清楚我需要這六個中的哪一個,這需要經常進行一些試驗。
在您的情況下,在手冊中對 TransformPoint 的描述中,我們閱讀了:
“將位置從本地空間轉換為世界空間。”
這意味著它需要輸入一個在“本地”參考系中表達的點(就像你“坐在”變換上一樣),但在完成所有“變換”(沿著父樹走并乘以旋轉)后輸出相同的點和縮放,并應用偏移量)以到達另一個表示點的 Vector3,這次不是相對于變換而是相對于世界,結果應用為當前(此)變換的世界空間位置,將其放置在其后面,尊重它的旋轉。
在父級情況下實際發生的事情是統一計算本地引數,以便鏈產生所需的絕對值,這是毫無價值的。
總結一下:您的 _camOffset 矢量表示與“目標”變換相關,并且隨著“目標”變換的移動和旋轉,TransformPoint 的結果也將移動和旋轉,保持相同的偏移量并保持旋轉(僅添加偏移量將忽略旋轉)。然后將此點變換的結果應用為當前物件(可能是相機)的世界位置。
然后在第二行中,放置在被跟蹤物件后面的相機被定向為查看物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316205.html
