4 Star 0 Fork 0

cyb/Computer Graphics Second Experiment

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
planarCamera.h 3.58 KB
一键复制 编辑 原始数据 按行查看 历史
cyb 提交于 2024-05-21 19:45 . 增加了雨滴效果
#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
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cyb_c/computer-graphics-second-experiment.git
git@gitee.com:cyb_c/computer-graphics-second-experiment.git
cyb_c
computer-graphics-second-experiment
Computer Graphics Second Experiment
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385