如何理解“this.transform.position = target.TransformPoint(_camOffset)”?

How to understand" this.transform.position = target.TransformPoint(_camOffset)"?

团结一致

gameobject没有parent,也就是说不需要TransformPoint,我这样说对吗?(worldPosition和localPosition应该是一样的) 这段代码本质上是 “Vector3 = Vector3”? 似乎 TransformPoint() 只是将 Transform 更改为 Vector 并用参数偏移它的值。 没有bug,但是真的很想明白!!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);
    }
}

发生了一些事情,让我试着解释一下。 最重要的'elephant in the room'显然是Transform本身的功能。它在 Unty3D 中加载得很好,我们将把它分为三个主要部分:数据结构本身、它在渲染引擎中的作用以及它的方法。

将转换理解为一种数据结构是微不足道的。只需将其视为仅包含四个字段的 class:LocalPosition (Vector3)、LocalRotation (Quaternion)、Scale (Vector3) 和一个 Parent(另一个 Transform 或 null)引用。内部可能有更多,但你永远只会担心这四件事。只有局部位置和旋转存储在变换本身中,需要考虑 parents 的链来计算绝对值,除非 parent 比 local=absolute.

渲染引擎使用这些字段在将帧发送到渲染之前定位、缩放和旋转 object 顶点。该过程称为 'transforming' ,这可能看起来令人困惑,但在您的问题案例中很重要。渲染具有 non-null parent 的 object 时,转换是链接的,因此例如要获得游戏的绝对世界位置 object 不旋转也不缩放,它需要在链上添加所有 parent 的位置,直到没有 parent.

第三个元素是方法,Transform class包含了很多方法。其中之一是 LookAt(Transform),它查找并应用旋转值,使它变换前向矢量指向目标的位置。

现在是重点:TransformPoint 是一套六种方法的一部分(其他方法是 TransformVector、TransformDirection、InverseTransformPoint、InverseTransformVector、InverseTransformDirection)。附带一提 - 就我个人而言,最初通常不太清楚我需要这六个中的哪一个,这需要经常进行一些试验。

对于您的情况,我们在手册中对 TransformPoint 的描述中读到:

“将位置从本地 space 转换为世界 space。”

这意味着它接受在 'local' 参考系中表达的点的输入(就像你在变换中 'sitting' 一样),但在完成所有 [=36] 之后输出相同的点=](沿着 parent 树向上移动并乘以旋转和缩放,并应用偏移量)得到另一个表示点的 Vector3,这次不是相对于变换而是相对于世界,结果应用为世界space 当前 (this) 变换的位置,将它放在它后面,尊重它的旋转。

毫无价值,在 parented 情况下实际发生的是统一计算局部参数,以便链产生所需的绝对值。

总结一下: 您的 _camOffset 向量是相对于 'target' 变换表示的,随着 'target' 变换移动和旋转,TransformPoint 的结果也会移动和旋转,保持相同的偏移并保持旋转(只是添加偏移量将忽略旋转)。然后将此点转换的结果应用为当前 object(大概是相机)的世界位置。

然后在第二行中,已放置在被跟踪 object 后面的相机被定向为查看 object。