代码拉取完成,页面将自动刷新
#ifndef PLANARCAMERA
#define PLANARCAMERA
#include "camera.h"
#include "map.h"
#include <cmath>
class PlanarCamera : public Camera {
public:
bool isJumping = false;
float jumpVelocity = 0.6f; // 初始跳跃速度
float gravity = -9.8f; // 重力加速度
float groundY = -1.0f; // 地面的高度
float jumpHeight = 1.6f; // 跳跃高度
bool isSprinting = false; // 是否正在冲刺
float sprintMultiplier = 1.8f; // 冲刺速度倍增
PlanarCamera(glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f), float yaw = YAW, float pitch = PITCH)
: Camera(position, glm::vec3(0.0f, 1.0f, 0.0f), yaw, pitch) {
}
void ProcessKeyboard(Camera_Movement direction, float deltaTime) override {
float velocity = MovementSpeed * deltaTime;
if (isSprinting) {
velocity *= sprintMultiplier;
}
glm::vec3 frontProjection = glm::normalize(glm::vec3(Front.x, 0.0f, Front.z)); // 计算 Front 在 xz 平面上的投影
glm::vec3 newPosition = Position;
if (direction == FORWARD)
newPosition += frontProjection * velocity;
if (direction == BACKWARD)
newPosition -= frontProjection * velocity;
if (direction == LEFT)
newPosition -= Right * velocity;
if (direction == RIGHT)
newPosition += Right * velocity;
// 在目标方向前进0.5单位后的新位置
glm::vec3 targetPosition = newPosition;
if (direction == FORWARD)
targetPosition += frontProjection * 1.0f;
if (direction == BACKWARD)
targetPosition -= frontProjection * 1.0f;
if (direction == LEFT)
targetPosition -= Right * 1.0f;
if (direction == RIGHT)
targetPosition += Right * 1.0f;
// 碰撞检测:检查新目标位置的高度
float targetGroundY = GetHeightAtPosition(targetPosition.x, targetPosition.z);
// 如果新的地面高度高于当前高度,并且不是在跳跃,阻止移动
if (!isJumping && targetGroundY > Position.y + 0.1f) {
return;
}
// 更新位置和地面高度
Position = newPosition;
groundY = GetHeightAtPosition(Position.x, Position.z);
// 如果当前高度大于新的地面高度,并且没有在跳跃,则下落到新的地面高度
if (!isJumping && Position.y > groundY) {
Position.y = groundY;
}
}
void Jump(float deltaTime) {
if (isJumping) {
Position.y += jumpVelocity * deltaTime;
jumpVelocity += gravity * deltaTime;
// 更新地面高度
groundY = GetHeightAtPosition(Position.x, Position.z);
// 当位置低于地面高度时停止跳跃
if (Position.y <= groundY) {
Position.y = groundY;
isJumping = false;
jumpVelocity = 1.2f; // 重置跳跃速度
}
}
}
void StartJump() {
if (!isJumping) {
isJumping = true;
jumpVelocity = sqrt(2.0f * -gravity * jumpHeight); // 计算初始跳跃速度
}
}
void StartSprint() {
isSprinting = true;
}
void StopSprint() {
isSprinting = false;
}
void Update(float deltaTime) {
// 如果不在跳跃状态,自动下落
if (!isJumping) {
float newGroundY = GetHeightAtPosition(Position.x, Position.z);
if (Position.y > newGroundY) {
Position.y -= 0.1*gravity * deltaTime; // 下落速度可以用 gravity 控制
if (Position.y < newGroundY) {
Position.y = newGroundY;
}
}
}
else {
Jump(deltaTime);
}
}
};
#endif // !PLANARCAMERA
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。