统一
游戏对象没有父对象,这意味着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);
}
}
有一些事情正在发生,让我试着解释一下。最重要的"房间里的大象"显然是变换本身的功能。它在Unty3D中加载得很好,我们将把它分解为三个主要部分:数据结构本身,它在渲染引擎中的作用,以及它的方法。
将转换理解为一种数据结构是微不足道的。只需将其视为一个仅由四个字段组成的类:LocalPosition(Vector3)、LocalRotation(四元数)、Scale(Vector3)和Parent(另一个Transform或null)引用。内部可能会有更多,但你永远只会担心这四件事。只有局部位置和旋转存储在变换本身中,需要在考虑父级链的情况下计算绝对值,除非父级为null而不是local=absolute。
渲染引擎使用这些字段来定位、缩放和旋转对象垂直方向,然后再发送帧进行渲染。这个过程被称为"转换",这可能看起来很困惑,但在你的问题案例中有点重要。当渲染具有非null父对象的对象时,变换是链接的,因此,例如,为了获得未旋转和未缩放的游戏对象的绝对世界位置,它需要添加链上所有父对象的位置,直到没有父对象为止。
第三个元素是方法,Transform类包含了很多方法。其中之一是LookAt(Transform),它可以找到并应用旋转值,使ite将正向矢量点转换为目标的位置。
现在主要的一点是:TransformPoint是一套六种方法的一部分(其他方法是TransformVector、TransformDirection、InverseTransformPoint、InverseConvertVector、InversetransfDirection)。顺便说一句,对我个人来说,最初我通常不太清楚我需要这六个中的哪一个,这需要经常进行一些实验。
在您的情况下,在手册中对TransformPoint的描述中,我们阅读了:
"将位置从局部空间转换为世界空间">
这意味着它接受在"局部"参考系中表达的点的输入(就像你"坐"在变换上一样),但在完成所有"变换"(沿着父树走,乘以旋转和缩放,并应用偏移)后输出同一点,以获得代表一个点的另一个Vector3,这一次不是相对于变换,而是相对于世界,结果应用为当前(this)变换的世界空间位置,将其放置在其后面,并考虑其旋转。
毫无价值的是,在父母的情况下实际发生的是单位计算局部参数,这样链就产生了所需的绝对值。
综上所述:_camOffset向量是相对于"target"变换来表达的,随着"target"转换的移动和旋转,TransformPoint的结果也将移动和旋转——保持相同的偏移并保持旋转(仅添加偏移将忽略旋转)。然后,将该点变换的结果应用为当前对象(可能是摄影机)的世界位置。
然后在第二行中,放置在被跟踪对象后面的相机被定向为观察对象。