2.Godot游戏对象坐标系节点的基础操作

游戏对象(节点)

游戏对象Node,就是场景包含的内容
在godot中,所有的操作都是基于节点展开的

向Scene窗口中添加几个图片

  1. 准备图片素材
  2. 把图片拖到2D游戏场景中,godot会自动创建一个节点
  3. 在Scene窗口中,观察新加的游戏对象
    游戏对象的简单操作
  4. 选中游戏对象:从左侧的层次管理器(Scene)中选中游戏对象
  5. 移动游戏对象:选中移动工具,拖动小方块
  6. 修改对象名字:在Scene窗口中,可以修改名字,删除对象等操作
    1. godot同级的节点的名称不能是相同的
      ![[Pasted image 20240413194323.png]]
坐标系

坐标原点在左上方,向右为x轴的正方向,向下为y轴的正方向
选择移动工具移动一个对象

  1. 通过鼠标去移动
  2. 通过键盘方向键移动
  3. 手动修改position的坐标x和y去更加精确地移动(Inspector属性面板)
    ![[Pasted image 20240413195849.png]]

移动对象的时候要注意左上角的工具栏

  1. 当选择移动工具的时候,只能去移动这个对象
  2. 选择工具的话,也可以做到同样的事情

世界坐标系
和坐标系是一样的,不过它的原点是世界的原点
godot在运行的时候,都会把当前的场景挂载到godot自己维护的一个场景树,场景树是有一个根节点的
![[Pasted image 20240413200038.png]]

运行一下场景,在左上角运行的remote,可以看到一个root,就是godot维护的一个根节点的场景树
根节点的position也是可以改变的,它的改变是相对于世界坐标系的原点的,是全局坐标系的原点,这个原点是没有办法改变的

一个像素在真实世界中有多大,可以自行约定,比如约定1像素=1米

  • 相对坐标系,又称为局部坐标系或者本地坐标系,相对于父节点的坐标,godot的坐标都是相对坐标
  • 全局坐标和局部坐标可以相互转化
Node2D及其子节点的位置可以使用position和gloabl_position来控制,其中,前者是该节点相对于父节点的相对位置,后者是全局位置。
简而言之,position的坐标系是以父节点的位置坐标为原点的坐标系,方向,还是水平向右为x轴正方向,竖直向下为y轴正方向。
需要注意的是,全局位置是以场景的root节点为原点的,并不是以根结点的位置作为原点的
节点的基础操作
  • Q,选择工具
    ![[Pasted image 20240413193437.png]]
Alt + 鼠标拖曳边框缩放点,保持选中目标中心位置不变进行缩放
Shift + 鼠标拖曳边框缩放点,等比列缩放
Alt + Shift + 鼠标拖曳边框缩放点,既等比例缩放,又中心点固定
Ctrl + 鼠标拖曳,以中心原点为中心旋转当前对象
  • W,移动工具,改变 Position
    ![[Pasted image 20240413193620.png]]
Move Mode 对象的移动:
单独改变X坐标
单独改变Y坐标
拖拽中间的方块,可以任意拖动
也可以直接在 Inspector 中输入坐标,会更精确一些
  • R,旋转工具,改变 Rotation
    ![[Pasted image 20240413193635.png]]
轴心点,又称中心点,是节点的旋转中心

按V,点击对象的任意位置可以改变移动轴心点,
Shift + V 拖拽轴心点

中心点是一个物体的中心,当我们对物体进行操作的时候,都是以中心点为中心进行对物体的操作
轴心点可以理解为把物体抽象成一个点,物体的位置就是指其轴心点的位置,就是该物体坐标系的原点

Rotate Mode 对象的旋转
沿轴心点旋转
  • S,缩放工具,改变 Scale
    ![[Pasted image 20240413193725.png]]
Scale Mode 对象的缩放
对象上会出现两个正方形的方块
拖动红色的方块,对象会沿X轴缩放
拖动绿色的方块,对象会沿Y轴缩放
按Shift等比例缩放
拖拽中间的小方块,X和Y等比例缩放
  • F,居中选取对象,非常有用的快捷键
当前选中了一个物体,此时不在显示范围内
点击F
直接会把选中的物体放到屏幕中间
节点操作的工具
  • 多节点选择工具
    ![[Pasted image 20240413195131.png]]
当两个节点叠在一起,选择节点的时候只能选到最上层的节点
选中多节点选择工具,show a list,主要用来精确选择层叠在一起的节点
  • 轴心点工具
    ![[Pasted image 20240413194010.png]]
移动轴心点,和选择工具中的快捷键V有同样的作用
  • 平滑工具,固定场景
    ![[Pasted image 20240413194000.png]]
这个时候无法选择场景中的任何物体,防止误操作
  • 尺子工具
    ![[Pasted image 20240413193835.png]]
量图片或者节点的像素
智能对齐Snap和锁定节点
  • 智能对齐,Smart Snap
    ![[Pasted image 20240413194036.png]]
godot 4.x 版本可以按住ctrl,会临时打开智能对齐
打开之后,拖动物体,会出现引导线,是智能的对齐方式
godot中对齐方式是以轴心点对齐的
  • 网格对齐,Grid Snap
    ![[Pasted image 20240413194047.png]]
打开之后会显示网格,只会在网格中进行对齐,不会出现在格子的中间,只会沿着格子对齐
  • 锁定节点,使其不能移动
    ![[Pasted image 20240413194114.png]]

![[Pasted image 20240413194137.png]]

选中节点,点击锁定节点,在场景中不能用鼠标拖拽移动
但是可以通过修改属性手动改
  • 子节点不可选中
    ![[Pasted image 20240413194149.png]]
当选中父节点打开这个功能
发现父节点可以选中
子节点不可选中,把子节点锁定中了
<think>好的,我现在需要回答用户关于Godot引擎中Control节点为什么会在世界空间中使用的问题。首先,我得回忆一下Godot的UI系统结构。Control节点是所有UI元素的基类,通常用于构建2D界面,但用户提到的是它在世界空间中的应用,这可能涉及到3D场景中的UI设计。 接下来,我需要确认Control节点的默认坐标系。通常,UI元素是放在CanvasLayer中的,这样它们会使用屏幕空间,不受相机影响。但如果直接将Control节点放在3D场景中,它们可能会跟随3D空间的变化,比如旋转或缩放。这种情况下,Control节点的位置和大小可能会根据3D世界中的变换而改变,这就是用户提到的“世界空间”中的使用原因。 然后,我应该考虑用户可能的应用场景。例如,在3D游戏中,可能需要将UI元素附着在3D物体上,比如血条跟随角色,或者交互提示出现在物体旁边。这种情况下,Control节点需要作为3D场景的一部分,使用世界空间坐标来正确显示位置。 另外,需要解释Godot如何处理不同的坐标系。CanvasLayer提供的是屏幕空间,而普通的Control节点如果作为3D场景的子节点,会继承3D变换,从而进入世界空间。这可能涉及到Viewport的设置,不同的Viewport可能影响UI的渲染方式。 还要注意可能的问题,比如性能考虑。在世界空间中使用UI元素可能会增加渲染负担,特别是当有大量动态更新的元素时。此外,处理输入事件时,需要确保坐标转换正确,避免点击位置不准确。 最后,我应该提供一些实际的使用示例,比如如何在3D场景中添加一个跟随物体的标签,或者如何调整Control节点的属性以适应世界空间的需求。同时,可能需要提及相关的节点,如Viewport、SubViewportContainer,以及如何结合Shader来增强效果。 总结起来,回答需要涵盖Control节点在3D世界中的工作原理、应用场景、配置方法以及潜在的问题和优化建议,确保用户能够理解并正确应用这一功能。</think>在Godot引擎中,Control节点默认属于CanvasLayer的屏幕坐标系,但通过特定配置可以将其集成到3D世界空间中。以下是详细解释: ### 1. **Control节点坐标系本质** Control节点属于2D坐标系系统,其默认位置由父CanvasLayer或Viewport的屏幕坐标决定。但在3D场景中,若将Control节点直接添加为3D节点的子节点,其坐标系会通过以下方式转换: $$ \text{世界坐标} \xrightarrow{\text{相机投影}} \text{屏幕坐标} $$ 此时Control节点的位置和旋转会继承父3D节点的空间变换[^1]。 ### 2. **世界空间的应用场景** - **3D UI附着**:如游戏中的角色头顶血条、物品交互提示 - **沉浸式UI设计**:VR/AR场景中需要与3D物体联动的UI - **动态界面效果**:实现随视角变化的动态标签(例如:始终朝向相机的告示牌) ### 3. **配置方法** ```gdscript # 示例:创建世界空间中的UI标签 var label = Label.new() label.text = "3D物体标签" add_child(label) label.set_as_top_level(true) # 脱离父节点坐标系 label.rect_position = get_viewport().get_camera().unproject_position(global_transform.origin) ``` ### 4. **关键技术原理** - **Viewport渲染**:通过创建独立的SubViewport节点,可将Control节点渲染到3D材质表面 - **空间变换计算**:使用`unproject_position()`方法将3D坐标转换为2D屏幕坐标 - **层级控制**:通过`z_index`属性管理UI元素在3D空间中的前后遮挡关系 ### 5. **优化建议** - 对频繁更新的世界空间UI启用`visibility_notifier`自动隐藏不可见元素 - 使用`Shader`实现透视校正,避免3D空间中的UI扭曲 - 通过`ViewportContainer`将2D界面嵌入3D表面时,需注意分辨率适配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值