OpenCAX/entry/src/main/cpp/NativeEGLOCCT/Camera/Camera.cpp
2026-03-28 20:11:28 +08:00

77 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created on 2026/3/6.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".
#include "Camera.h"
#ifndef NATIVE_TAG
#define NATIVE_TAG "CAMERA"
#endif
namespace NativeOpenCAX {
Camera::Camera() : camera(nullptr) {}
Camera::~Camera() {}
bool Camera::InitCamera(Handle(V3d_View)& view) {
try {
camera = new Graphic3d_Camera;
// 将角度转换为弧度并计算对应的缩放因子
camera->SetFOVy(45.0);
camera->SetZRange(1, 10.0);
view->SetCamera(camera);
HILOG_ERROR(NATIVE_TAG,"Camera Scale:%{public}f",camera->Scale());
HILOG_INFO(NATIVE_TAG, "InitCamera Done");
return true;
} catch (std::exception &e) {
HILOG_INFO(NATIVE_TAG, "InitCamera Fail:%{public}d", e.what());
return false;
}
}
void Camera::SetRotation(float xAngle, float yAngle) {
gp_Pnt currentEye = camera->Eye();
gp_Pnt currentCenter = camera->Center();
gp_Dir currentUp = camera->Up();
// 计算当前的视线方向和距离
gp_Vec viewDir = currentCenter.XYZ() - currentEye.XYZ();
double distance = viewDir.Magnitude();
gp_Pnt rotationCenter = currentCenter; // 旋转中心设为当前目标点
// 创建旋转增量
gp_Quaternion rotX, rotY;
// 从 gp_Ax1 中提取方向向量 (gp_Dir -> gp_Vec)
gp_Vec xRotationAxis = camera->Direction().XYZ().Crossed(currentUp.XYZ()); // 叉积得到X旋转轴
if (xRotationAxis.Magnitude() > gp::Resolution()) { // 防止零向量导致的无效四元数
rotX.SetVectorAndAngle(xRotationAxis, xAngle * M_PI / 180.0);
} else {
rotX.SetIdent(); // 如果叉积为零,则无旋转
}
// 从 gp_Ax1 中提取方向向量 (gp_Dir -> gp_Vec)
gp_Vec yRotationAxis = currentUp.XYZ(); // Y旋转轴就是当前的Up方向
if (yRotationAxis.Magnitude() > gp::Resolution()) {
rotY.SetVectorAndAngle(yRotationAxis, yAngle * M_PI / 180.0);
} else {
rotY.SetIdent(); // 如果Up向量无效则无旋转
}
// 组合旋转
gp_Quaternion totalRotation = rotY * rotX;
// 应用旋转到眼睛位置
gp_Vec newViewDir = totalRotation * viewDir.Normalized();
gp_Pnt newEye = rotationCenter.XYZ() - newViewDir.XYZ() * distance;
// 计算新的 Up 方向
gp_Dir newUp = totalRotation * currentUp;
// 设置新相机参数
camera->SetEye(newEye);
camera->SetCenter(rotationCenter);
camera->SetUp(newUp);
HILOG_ERROR(NATIVE_TAG,"Rotation");
}
} // namespace NativeOpenCAX