unity3d 中局部空间 vs 全局空间 vs 对象空间

问题描述 投票:0回答:2

我正在观看这个(游戏开发、空间育儿和轮换) Sebastian Lague 视频,发现实际上有三个空间(不是两个),分别是世界空间、局部空间和对象空间。

  1. 世界空间:静态空间(0,0,0)
  2. 对象空间:与对象空间相关
  3. 本地空间:与对象的父对象相关

令我惊讶的是,我在官方统一形式上没有找到这两个空间(局部空间和物体空间)之间的区别,但实际上它是存在的。我的问题是为什么没有 Space.Local?我发现有空间。自我与空间世界。 Space.Self 是指对象空间。我可以使用这个将我的对象移动到对象空间

    void Update () {
        transform.Translate(new Vector3(0,0,1) * Time.deltaTime * 2,Space.Self);
    }

我可以使用这个将我的对象移动到世界空间

void Update () {
    transform.Translate(new Vector3(0,0,1) * Time.deltaTime * 2,Space.World);
}

但是不支持本地空间,我可以将对象移动到本地空间(意味着移动与其父对象相关的对象)。本地空间和对象空间之间存在明显的区别,但我猜统一没有考虑它,或者我错了。

c# unity-game-engine
2个回答
1
投票

在 Unity 的检查器中,Transform 组件的位置和旋转相对于父组件(在本地空间中定义)

小控件手柄代表的轴要么是全局轴(世界空间),要么是 对象轴,如 S. Lague 在视频中指出的那样。

当您选择游戏对象时,不会显示局部轴(父变换的轴),这与其他 3D 软件(我认为是 Maya)相反,并且没有可以在局部空间中进行平移的 C# 函数,但您可以创建一个:

Vector3 right     = transform.parent.right;
Vector3 up        = transform.parent.up ;
Vector3 forward   = transform.parent.forward;
Vector3 direction = X * right + Y * up + Z * forward ;

transform.Translate(direction * Time.deltaTime, Space.World);

但是,请记住,在对象空间中,对象

A
始终具有 (0, 0, 0) 的位置和旋转,因为后者是由对象本身定义的。对象 A
 无法从 
本身移动/旋转。


0
投票
也许你可以使用

Transform.TransformDirection()

方法,像这样:

public class WhatIsTheLocalSpace : MonoBehaviour { public Transform obt; public bool selfSpace = false; public bool worldSpace = false; public bool parentSpace = false; void Update() { if (Input.GetKey(KeyCode.D)) { // move along self space if (selfSpace && !worldSpace && !parentSpace) { obt.Translate(Vector3.right*Time.deltaTime,Space.Self); } // move along world space if (!selfSpace && worldSpace && !parentSpace) { obt.Translate(Vector3.right*Time.deltaTime,Space.World); } // move along parent space if (!selfSpace && !worldSpace && parentSpace) { obt.Translate(obt.parent.TransformDirection(Vector3.right)*Time.deltaTime,Space.World); } } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.