132 lines
3.3 KiB
C++
132 lines
3.3 KiB
C++
#include "baseCamera.hpp"
|
|
#include <thread>
|
|
|
|
#include "../../platformDefine.hpp"
|
|
|
|
#ifdef GKMS_WINDOWS
|
|
#include <corecrt_math_defines.h>
|
|
#endif // GKMS_WINDOWS
|
|
|
|
|
|
namespace BaseCamera {
|
|
using Vector3_t = UnityResolve::UnityType::Vector3;
|
|
|
|
float moveStep = 0.05;
|
|
float look_radius = 5; // 转向半径
|
|
float moveAngel = 1; // 转向角度
|
|
|
|
int smoothLevel = 1;
|
|
unsigned long sleepTime = 0;
|
|
|
|
|
|
Camera::Camera() {
|
|
Camera(0, 0, 0, 0, 0, 0);
|
|
}
|
|
|
|
Camera::Camera(Vector3_t* vec, Vector3_t* lookAt) {
|
|
Camera(vec->x, vec->y, vec->z, lookAt->x, lookAt->y, lookAt->z);
|
|
}
|
|
|
|
Camera::Camera(Vector3_t& vec, Vector3_t& lookAt) {
|
|
Camera(vec.x, vec.y, vec.z, lookAt.x, lookAt.y, lookAt.z);
|
|
}
|
|
|
|
Camera::Camera(float x, float y, float z, float lx, float ly, float lz) {
|
|
pos.x = x;
|
|
pos.y = y;
|
|
pos.z = z;
|
|
lookAt.x = lx;
|
|
lookAt.y = ly;
|
|
lookAt.z = lz;
|
|
}
|
|
|
|
void Camera::setPos(float x, float y, float z) {
|
|
pos.x = x;
|
|
pos.y = y;
|
|
pos.z = z;
|
|
}
|
|
|
|
void Camera::setLookAt(float x, float y, float z) {
|
|
lookAt.x = x;
|
|
lookAt.y = y;
|
|
lookAt.z = z;
|
|
}
|
|
|
|
void Camera::reset() {
|
|
setPos(0.5, 1.1, 1.3);
|
|
setLookAt(0.5, 1.1, -3.7);
|
|
fov = 60;
|
|
verticalAngle = 0;
|
|
horizontalAngle = 0;
|
|
}
|
|
|
|
Vector3_t Camera::GetPos() {
|
|
return pos;
|
|
}
|
|
|
|
Vector3_t Camera::GetLookAt() {
|
|
return lookAt;
|
|
}
|
|
|
|
void Camera::set_lon_move(float vertanglePlus, LonMoveHState moveState, float multiplier) { // 前后移动
|
|
auto radian = (verticalAngle + vertanglePlus) * M_PI / 180;
|
|
auto radianH = (double)horizontalAngle * M_PI / 180;
|
|
|
|
auto f_step = cos(radian) * moveStep * cos(radianH) / smoothLevel * multiplier; // ↑↓
|
|
auto l_step = sin(radian) * moveStep * cos(radianH) / smoothLevel * multiplier; // ←→
|
|
// auto h_step = tan(radianH) * sqrt(pow(f_step, 2) + pow(l_step, 2));
|
|
auto h_step = sin(radianH) * moveStep / smoothLevel * multiplier;
|
|
|
|
switch (moveState)
|
|
{
|
|
case LonMoveForward: break;
|
|
case LonMoveBack: h_step = -h_step; break;
|
|
default: h_step = 0; break;
|
|
}
|
|
|
|
for (int i = 0; i < smoothLevel; i++) {
|
|
pos.z -= f_step;
|
|
lookAt.z -= f_step;
|
|
pos.x += l_step;
|
|
lookAt.x += l_step;
|
|
pos.y += h_step;
|
|
lookAt.y += h_step;
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
|
|
}
|
|
}
|
|
|
|
void Camera::updateVertLook() { // 上+
|
|
auto radian = verticalAngle * M_PI / 180;
|
|
auto radian2 = ((double)horizontalAngle - 90) * M_PI / 180; // 日
|
|
|
|
auto stepX1 = look_radius * sin(radian2) * cos(radian) / smoothLevel;
|
|
auto stepX2 = look_radius * sin(radian2) * sin(radian) / smoothLevel;
|
|
auto stepX3 = look_radius * cos(radian2) / smoothLevel;
|
|
|
|
for (int i = 0; i < smoothLevel; i++) {
|
|
lookAt.z = pos.z + stepX1;
|
|
lookAt.y = pos.y + stepX3;
|
|
lookAt.x = pos.x - stepX2;
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
|
|
}
|
|
}
|
|
|
|
void Camera::setHoriLook(float vertangle) { // 左+
|
|
auto radian = vertangle * M_PI / 180;
|
|
auto radian2 = horizontalAngle * M_PI / 180;
|
|
|
|
auto stepBt = cos(radian) * look_radius * cos(radian2) / smoothLevel;
|
|
auto stepHi = sin(radian) * look_radius * cos(radian2) / smoothLevel;
|
|
auto stepY = sin(radian2) * look_radius / smoothLevel;
|
|
|
|
for (int i = 0; i < smoothLevel; i++) {
|
|
lookAt.x = pos.x + stepHi;
|
|
lookAt.z = pos.z - stepBt;
|
|
lookAt.y = pos.y + stepY;
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
|
|
}
|
|
}
|
|
|
|
|
|
}
|