首页 > 解决方案 > 如何理解“this.transform.position = target.TransformPoint(_camOffset)”?

问题描述

团结一致

游戏对象没有父对象,这意味着不需要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);
    }
}

标签: unity3dcamera

解决方案


发生了一些事情,让我试着解释一下。最重要的“房间里的大象”显然是 Transform 本身的功能。它在 Unty3D 中加载得非常好,我们将把它分成三个主要部分:数据结构本身、它在渲染引擎中的作用以及它的方法。

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

在将帧发送到渲染之前,渲染引擎使用这些字段来定位、缩放和旋转对象顶点。该过程称为“转换”,这可能看起来令人困惑,但在您的问题案例中很重要。当渲染具有非空父对象的对象时,转换是链式的,因此例如要获得未旋转且未缩放的游戏对象的绝对世界位置,它需要将所有父级的位置添加到链上,直到没有父母。

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

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

就您而言,在手册中对 TransformPoint 的描述中,我们阅读了:

“将位置从本地空间转换到世界空间。”

这意味着它接受在“本地”参考框架中表示的点的输入(当您“坐在”变换上),但在完成所有“变换”后输出相同的点(向上走父树并乘以旋转和缩放,并应用偏移)以获得另一个表示一个点的 Vector3,这次不是相对于变换而是相对于世界,结果应用为当前(此)变换的世界空间位置,将其置于其后面,尊重它的旋转。

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

总结一下:您的 _camOffset 向量是相对于“目标”变换表示的,并且随着“目标”变换的移动和旋转,TransformPoint 的结果也会移动和旋转,保持相同的偏移量并保持旋转(只是添加偏移量会忽略旋转)。然后将该点变换的结果应用为当前对象(可能是相机)的世界位置。

然后在第二行中,放置在被跟踪对象后面的相机被定向以查看对象。


推荐阅读