相机是一个纯值类型结构体——视图矩阵与投影矩阵都在你的手里。本章覆盖透视/正交投影、LookAt 视图与大世界下的全局版调用。
xge3d_camera_t 只有两个矩阵和近远裁剪面:
typedef struct xge3d_camera_t {
xge3d_mat4_t view, projection;
float near_z, far_z;
} xge3d_camera_t;没有"相机对象"——投影与视图分别由独立函数填充,渲染时整体传给 xge3dRender。想插值相机动画?直接对两个矩阵做变换或对参数做插值后重建,状态完全透明。
xge3d_camera_t cam;
// 透视:垂直视场(弧度)、纵横比、近远裁剪面(米)
xge3dCameraPerspective(&cam, 1.2f, 16.0f/9.0f, 0.1f, 500.0f);
// 正交:以宽高(米)定义视景体,适合 2.5D 与工具视图
xge3dCameraOrthographic(&cam, 128.0f, 72.0f, -100.0f, 100.0f);
// 视图矩阵:眼点、目标点、上方向
xge3dCameraLookAt(&cam,
(xge3d_vec3_t){ 0, 18, 28 }, // eye
(xge3d_vec3_t){ 0, 2, 0 }, // target
(xge3d_vec3_t){ 0, 1, 0 }); // upxge3dCameraPerspective;视图矩阵按帧重建的开销可以忽略。
当场景设置了双精度原点后,眼点与目标点可以用全局坐标表达——xge3dCameraLookAtGlobal 接受 origin、eye、target,内部完成相对化:
xge3dSceneSetOrigin(pScene, (xge3d_dvec3_t){ 1e9, 0, 1e9 });
xge3dCameraLookAtGlobal(&cam, tOrigin, tGlobalEye, tGlobalTarget,
(xge3d_vec3_t){ 0, 1, 0 });相机结构体还参与两类查询:xge3dCameraScreenRay 把屏幕像素反投影为拾取射线(第 223 章展开);xge3dCameraIntersectsAabb 做视锥包围盒相交测试,供自定义裁剪逻辑使用。
| 函数 / 类型 | 说明 |
|---|---|
xge3d_camera_t | view + projection + near/far,纯值类型 |
xge3dCameraPerspective(out, fov_y, aspect, near, far) | 透视投影 |
xge3dCameraOrthographic(out, width, height, near, far) | 正交投影 |
xge3dCameraLookAt(cam, eye, target, up) | 视图矩阵 |
xge3dCameraLookAtGlobal(cam, origin, eye, target, up) | 双精度全局坐标版 |
xge3dCameraScreenRay(cam, x, y, w, h, out) | 屏幕像素 → 拾取射线 |
xge3dCameraIntersectsAabb(cam, box) | 视锥包围盒测试 |
examples/xge_3d——相机、节点层级、共享网格与深度遮挡的最小演示。xge3dCameraIntersectsAabb 对某包围盒的结果,找出它离开视锥的帧。