🎥 一、Camera2D(2D 摄像机)示例:跟随玩家移动

这是最常用的 2D 摄像机写法,比如地图跟随、角色跟随、平滑移动等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "raylib.h"

int main(void)
{
InitWindow(800, 450, "raylib Camera2D example");
SetTargetFPS(60);

// 玩家位置
Vector2 player = { 400, 225 };

// 摄像机
Camera2D camera = { 0 };
camera.target = player; // 摄像机跟随的目标
camera.offset = (Vector2){ 400, 225 }; // 屏幕中心
camera.rotation = 0.0f;
camera.zoom = 1.0f;

while (!WindowShouldClose())
{
// --- 输入控制玩家移动 ---
if (IsKeyDown(KEY_RIGHT)) player.x += 200 * GetFrameTime();
if (IsKeyDown(KEY_LEFT)) player.x -= 200 * GetFrameTime();
if (IsKeyDown(KEY_UP)) player.y -= 200 * GetFrameTime();
if (IsKeyDown(KEY_DOWN)) player.y += 200 * GetFrameTime();

// 摄像机跟随玩家
camera.target = player;

BeginDrawing();
ClearBackground(RAYWHITE);

BeginMode2D(camera); // 开启 2D 摄像机模式

// 世界中的物体
DrawCircleV(player, 20, RED);
DrawGrid(20, 50); // 画一个网格方便观察摄像机移动

EndMode2D(); // 关闭摄像机模式

DrawText("Use arrow keys to move", 10, 10, 20, DARKGRAY);

EndDrawing();
}

CloseWindow();
return 0;
}

🧠 Camera2D 的核心思想

  • camera.target = 世界坐标中你想跟随的点
  • camera.offset = 这个点在屏幕上的位置(通常是屏幕中心)
  • camera.zoom = 缩放
  • BeginMode2D(camera) = 开启摄像机
  • EndMode2D() = 关闭摄像机

你以后做 2D 游戏框架时,这套接口几乎可以原样照搬。

🗻 二、Camera3D(3D 摄像机)示例:第一人称视角

这是 raylib 最经典的 3D 摄像机示例之一。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "raylib.h"

int main(void)
{
InitWindow(800, 450, "raylib Camera3D example");
SetTargetFPS(60);

Camera3D camera = { 0 };
camera.position = (Vector3){ 4.0f, 2.0f, 4.0f }; // 摄像机位置
camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // 观察目标
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // 上方向
camera.fovy = 45.0f; // 视野角度
camera.projection = CAMERA_PERSPECTIVE; // 透视投影

while (!WindowShouldClose())
{
// 内置的第一人称摄像机控制
UpdateCamera(&camera, CAMERA_FIRST_PERSON);

BeginDrawing();
ClearBackground(RAYWHITE);

BeginMode3D(camera);

DrawCube((Vector3){ 0, 1, 0 }, 2, 2, 2, RED);
DrawGrid(20, 1.0f);

EndMode3D();

DrawText("Use WASD + mouse to move camera", 10, 10, 20, DARKGRAY);

EndDrawing();
}

CloseWindow();
return 0;
}

🧠 Camera3D 的核心思想

  • camera.position = 摄像机位置
  • camera.target = 摄像机看向哪里
  • camera.up = 上方向
  • camera.fovy = 视野角度
  • UpdateCamera() = 内置摄像机控制(第一人称/第三人称)
  • BeginMode3D(camera) = 开启 3D 模式