【Godot_4.2.2】关于归一化normalized()

关键词:Godot,4.2.2,归一化,2d,normalized()
前言:本内容由ChatGPT回答后,经楼主整理所得,仅用于笔记。可随意转载,无需授权



【归一化是什么?在godot中很重要吗?】

在 Godot(以及其他很多游戏开发和图形编程环境)中,归一化是指将一个向量的长度调整为 1,同时保持其方向不变。这个过程产生一个单位向量,其主要作用和重要性如下:

归一化的意义

1.方向和大小分离:
   归一化可以让我们分开处理向量的方向和大小。在某些计算中,我们只需要知道方向,而不是具体的长度。

2.固定运动速度:
   在游戏中,如果你想要物体以恒定的速度移动,可以使用归一化来确保速度向量的方向一致并且长度设置为所需的速度值。例如,先归一化原始速度向量,然后再乘以一个特定的速度值。

3.简化计算:
   使用单位向量进行计算可以简化许多数学公式,比如在计算角度、碰撞检测等时,更容易处理。

4.避免速度过快或过慢的问题:
   归一化后重新设定长度,可以防止由于向量长度不同导致的不一致移动,这样可以帮助维持更连贯的运动体验。

归一化的重要性
   归一化在游戏开发中非常重要,尤其是在处理运动、方向、光照计算、物理模拟等方面。它使得开发者能够更简单地控制对象的行为,并确保其在空间中的表现符合预期。

总之,归一化对于游戏开发中的向量操作是个非常基本但极其重要的概念,掌握它对提高代码质量和降低错误率都大有裨益。


代码例子:

extends Sprite2D

 var speed = 400
var screen_size

func _ready():
	screen_size = get_viewport_rect().size

func _process(delta):
	var velocity = Vector2.ZERO
	
	if Input.is_action_pressed("左"):
		velocity.x -= 1
	if Input.is_action_pressed("右"):
		velocity.x += 1
	if Input.is_action_pressed("上"):
		velocity.y -= 1
	if Input.is_action_pressed("下"):
		velocity.y += 1	

	if velocity.length() <= 0:
		return
		
	velocity = velocity.normalized() * speed
	position += velocity * delta
	position.x = clamp(position.x, 0, screen_size.x)
	position.y = clamp(position.y, 0, screen_size.y)

在 Godot 中,“velocity = velocity.normalized() * speed”的意义如下:

1.归一化 (Normalization):

   velocity.normalized() 将当前速度向量(velocity)转换为单位向量。单位向量的方向与原始向量相同,但长度为 1。这意味着它只表示方向,而不考虑大小。

2.设定速度大小:

   通过将归一化后的向量乘以一个特定的速度值 speed,你实际上是将速度设置为固定的大小(即 speed)。这可以确保物体在运动时以恒定的速度移动,而不管其先前的速度如何。

3.完整的过程可以理解为:

   我们首先获取当前的方向,然后将这个方向的长度调整为 speed,从而得到一个新的速度向量,这个向量的长度为 speed,而方向与原始速度相同。

总结来说,这行代码的目的就是确保物体在每帧移动时始终以设定的 speed 进行移动。

接下来的第二行 position += velocity * delta 则是根据计算出的速度和时间增量 (delta) 更新物体的位置,使得物体在游戏中平滑地移动。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
godot中的`class_name`关键字用于为类注册一个新的类型,并在编辑器中显示自定义图标。使用`class_name`关键字时,可以指定可选的图标路径,以使其在编辑器中显示。 以下是一个示例: ```gd # Item.gd extends Node class_name Item, "res://interface/icons/item.png" ``` 这个示例中,`Item.gd`文件中的类被注册为一个新的类型,并且使用`"res://interface/icons/item.png"`作为它在编辑器中的图标。 另外,godot中的类文件可以包含内部类。内部类使用`class`关键字来定义,并可以使用`ClassName.new()`函数来实例化。 以下是一个示例: ```gd # Inside a class file. # An inner class in this class file. class SomeInnerClass: var a = 5 func print_value_of_a(): print(a) # This is the constructor of the class file's main class. func _init(): var c = SomeInnerClass.new() c.print_value_of_a() ``` 在这个示例中,主类文件中包含了一个内部类`SomeInnerClass`,可以通过`SomeInnerClass.new()`来实例化并调用它的方法。 此外,以文件形式存储的类在godot中被视为资源。要在其他类中访问这些类资源,必须从磁盘加载它们。可以使用`load`函数或`preload`函数来加载类资源。 以下是一个示例: ```gd # Load the class resource when calling load(). var my_class = load("myclass.gd") # Preload the class only once at compile time. const MyClass = preload("myclass.gd") func _init(): var a = MyClass.new() a.some_function() ``` 在这个示例中,使用`load`函数来加载一个类资源,并使用`preload`函数在编译时预加载一个类资源。然后可以通过调用类对象上的`new`函数来实例化该类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值