sin
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — sin
sin
定义
sin() 是正弦函数——给你一个角度,它告诉你这个角度在单位圆上对应的垂直位置(纵坐标)。
打个比方:想象一个摩天轮,你站在摩天轮的正右侧(3 点钟方向)看着它转。有一个人坐在座舱上随摩天轮旋转,sin() 就是告诉你这个人此刻比摩天轮中心高出多少或者低多少。当座舱在正上方(90 度)时,sin() 返回最大值 1;在正下方(270 度)时返回最小值 -1;在左右两侧(0 度和 180 度)时恰好返回 0。
正弦函数的输出永远在 -1 到 1 之间来回波动,就像钟摆一样有规律。
角度单位是弧度,不是度数
sin() 接收的参数是弧度(radian),不是我们日常说的"度数"。比如 90 度在弧度制下约等于 1.5708(也就是 PI/2)。如果你手头是度数,需要先用 deg_to_rad() 转换。这一点对 Godot 中所有三角函数都适用,请务必牢记。
函数签名
C#
// 使用 Godot 的 Mathf(推荐,返回 float)
public static float Sin(float angleRad)GDScript
func sin(angle_rad: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
angleRad / angle_rad | float | 是 | 角度值,单位为弧度。不是度数!90 度 = PI/2 弧度 |
返回值
类型: float
返回给定角度的正弦值,范围固定在 -1.0 到 1.0 之间。
| 输入(弧度) | 输出 | 说明 |
|---|---|---|
| 0 | 0.0 | 正右方,和中心一样高 |
| PI/2(约 1.571) | 1.0 | 正上方,最高点 |
| PI(约 3.14159) | 0.0 | 正左方,又和中心一样高 |
| 3*PI/2(约 4.712) | -1.0 | 正下方,最低点 |
代码示例
基础用法:计算不同角度的正弦值
C#
using Godot;
public partial class SinExample : Node
{
public override void _Ready()
{
// 0 度的正弦值
float r1 = Mathf.Sin(0f);
GD.Print("sin(0) = " + r1);
// 运行结果: sin(0) = 0
// 90 度 = PI/2 弧度
float r2 = Mathf.Sin(Mathf.Pi / 2f);
GD.Print("sin(PI/2) = " + r2);
// 运行结果: sin(PI/2) = 1
// 180 度 = PI 弧度
float r3 = Mathf.Sin(Mathf.Pi);
GD.Print("sin(PI) = " + r3);
// 运行结果: sin(PI) = 0(浮点精度下约为 8.74e-7)
}
}GDScript
extends Node
func _ready():
# 0 度的正弦值
var r1 = sin(0.0)
print("sin(0) = ", r1)
# 运行结果: sin(0) = 0
# 90 度 = PI/2 弧度
var r2 = sin(PI / 2.0)
print("sin(PI/2) = ", r2)
# 运行结果: sin(PI/2) = 1
# 180 度 = PI 弧度
var r3 = sin(PI)
print("sin(PI) = ", r3)
# 运行结果: sin(PI) = 0(浮点精度下约为 8.74e-7)实际场景:让物体沿正弦波上下浮动
C#
using Godot;
public partial class FloatingPlatform : Node2D
{
// 导出属性:浮动幅度(像素)
[Export] public float ExAmplitude = 50f;
// 导出属性:浮动速度
[Export] public float ExSpeed = 2f;
// 内部变量:初始 Y 坐标
private float _startY;
public override void _Ready()
{
_startY = Position.Y;
}
public override void _Process(double delta)
{
// 用时间作为角度输入,sin 产生 -1 ~ 1 的平滑波动
float wave = Mathf.Sin(ExSpeed * (float)Time.GetTicksMsec() / 1000f);
float newY = _startY + wave * ExAmplitude;
Position = new Vector2(Position.X, newY);
// 运行结果: 平台在 _startY - 50 到 _startY + 50 之间平滑上下浮动
}
}GDScript
extends Node2D
## 导出属性:浮动幅度(像素)
@export var ex_amplitude: float = 50.0
## 导出属性:浮动速度
@export var ex_speed: float = 2.0
## 内部变量:初始 Y 坐标
var _start_y: float
func _ready():
_start_y = position.y
func _process(delta):
# 用时间作为角度输入,sin 产生 -1 ~ 1 的平滑波动
var wave = sin(ex_speed * Time.get_ticks_msec() / 1000.0)
var new_y = _start_y + wave * ex_amplitude
position = Vector2(position.x, new_y)
# 运行结果: 平台在 _start_y - 50 到 _start_y + 50 之间平滑上下浮动进阶用法:利用 sin 和 cos 让物体沿圆周运动
C#
using Godot;
public partial class OrbitMotion : Node2D
{
// 导出属性:圆周半径
[Export] public float ExRadius = 100f;
// 导出属性:旋转速度(弧度/秒)
[Export] public float ExOrbitSpeed = 2f;
// 内部变量:中心点
private Vector2 _center;
private float _angle;
public override void _Ready()
{
_center = Position;
_angle = 0f;
}
public override void _Process(double delta)
{
_angle += ExOrbitSpeed * (float)delta;
// cos 决定 X 偏移,sin 决定 Y 偏移,两者组合形成圆周运动
float offsetX = Mathf.Cos(_angle) * ExRadius;
float offsetY = Mathf.Sin(_angle) * ExRadius;
Position = _center + new Vector2(offsetX, offsetY);
GD.Print($"当前角度: {Mathf.RadToDeg(_angle):F1} 度, 位置: {Position}");
// 运行结果: 当前角度: 114.6 度, 位置: (-41.0, 91.2)
}
}GDScript
extends Node2D
## 导出属性:圆周半径
@export var ex_radius: float = 100.0
## 导出属性:旋转速度(弧度/秒)
@export var ex_orbit_speed: float = 2.0
## 内部变量:中心点和当前角度
var _center: Vector2
var _angle: float
func _ready():
_center = position
_angle = 0.0
func _process(delta):
_angle += ex_orbit_speed * delta
# cos 决定 X 偏移,sin 决定 Y 偏移,两者组合形成圆周运动
var offset_x = cos(_angle) * ex_radius
var offset_y = sin(_angle) * ex_radius
position = _center + Vector2(offset_x, offset_y)
print("当前角度: %.1f 度, 位置: %s" % [rad_to_deg(_angle), position])
# 运行结果: 当前角度: 114.6 度, 位置: (-41.0, 91.2)注意事项
- 参数是弧度,不是度数:这是初学者最容易犯的错误。
sin(90)不等于sin(90度)。如果你有度数,必须先用deg_to_rad()转换,例如Mathf.Sin(Mathf.DegToRad(90f))才会得到 1.0。 - 输出范围固定:正弦函数的返回值永远在 -1 到 1 之间。如果需要更大的范围,可以乘以一个系数(如代码示例中的
ExAmplitude)。 - 浮点精度问题:
sin(PI)在数学上应该等于 0,但由于浮点数精度限制,实际结果可能是一个非常接近 0 的极小数(约 8.74e-7)。判断时不要用== 0,而应该用Mathf.IsZeroApprox()或检查绝对值是否足够小。 - 与
cos()是一对好搭档:在游戏开发中,sin()和cos()几乎总是搭配使用。cos(angle)给出圆周上的水平位置(X),sin(angle)给出垂直位置(Y),两者组合可以描述任何圆周或波浪运动。 - C# 中的选择:在 Godot C# 中推荐使用
Mathf.Sin()(返回float),而不是Math.Sin()(返回double),这样可以避免不必要的类型转换。
