unity3d - 如何理解“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);
}
}
解决方案
发生了一些事情,让我试着解释一下。最重要的“房间里的大象”显然是 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 的结果也会移动和旋转,保持相同的偏移量并保持旋转(只是添加偏移量会忽略旋转)。然后将该点变换的结果应用为当前对象(可能是相机)的世界位置。
然后在第二行中,放置在被跟踪对象后面的相机被定向以查看对象。
推荐阅读
- python - 是否可以使用存储队列实现 Azure Function PULL 模式?
- microsoft-teams - 如何清除 TeamsFx SSO 使用的凭据?
- azure - Azure App Service 免费轮胎存储是否持续存在
- azure-machine-learning-studio - azure ml update service erro AttributeError: AttributeError: 'str' object has no attribute 'id'
- php - 如何使用 cloudinary + Laravel 上传图片?
- javascript - IE11 浏览器:在 React App 中出现 SCRIPT1002 语法错误
- python - 在另一个类的方法中使用一个类的方法时出现 AttributeError
- android - 清单合并失败并出现多个错误,请参阅日志如何解决?
- python - pandas boxplot 包含之前保存的绘图内容
- c# - Linq 方法 - 返回仅在另一个表中找到的行