弧球摄像头:如何获得正确的方向和向上
Arcball Camera: how to obtain right, direction and up
我正在尝试实现一个遵循移动对象的相机。我已经实施了这些功能:
void Camera::espheric_yaw(float degrees, glm::vec3 center_point)
{
float lim_yaw = glm::radians(89.0f);
float radians = glm::radians(degrees);
absoluteYaw += radians;
... clamp absoluteYaw
float radius = 10.0f;
float camX = cos(absoluteYaw) * cos(absoluteRoll) * radius;
float camY = sin(absoluteRoll)* radius;
float camZ = sin(absoluteYaw) * cos(absoluteRoll) * radius;
eyes.x = camX;
eyes.y = camY;
eyes.z = camZ;
lookAt = center_point;
view = glm::normalize(lookAt - eyes);
up = glm::vec3(0, 1, 0);
right = glm::normalize(glm::cross(view, up));
}
我想将此功能(和音高版本(用于遵循移动3D模型的相机。现在,当中心_point为(0,1,0(时,它起作用。我认为我的位置正确,但UP向量显然并不总是(0,1,0(。
如何为相机抬起,查看和正确的向量?然后,如果我以这种方式更新相机的眼睛位置,当另一个对象(以Center_position参数为中心(移动时,我的相机将如何移动?
这个想法是每次我使用centered_value =移动对象中心的鼠标输入时进行更新。然后将glulookat与视图,眼睛和我的相机的值(以及将是眼睛 视图的lookat(。
遵循移动对象之后是将相机指向该对象的问题。这就是典型的lookAt
函数所做的。请参阅此处的数学,然后使用glm::lookAt()
。
"弧球"技术用于用鼠标旋转。在这里查看一些数学。
这个想法是从屏幕上的位置获得两个向量(第一,第二(。对于每个向量,X,Y
都取决于鼠标"旅行"的像素和窗口的大小。Z
通过"轨迹球"数学计算。使用这两个向量(在标准化之后(,其交叉产物在相机坐标中给出了旋转轴,其点产物给出了角度。现在,您可以通过glm::rotate()
如果您走另一个路线(例如,自己计算相机矩阵(,则必须自己更新相机的"向上"方向。请记住,它垂直于相机的其他两个轴。
相关文章:
- 使用Unreal C++获取VR耳机的世界位置/方向
- 在C++中向零方向近似的最佳方法
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- OpenVR:向视图方向移动
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 带有枚举方向/类型的气泡排序结构数组
- OpenGL通常"Up"方向?
- 定义/预设NURBS起点和终点的方向
- 如何按另一个向量的方向调整一个向量?
- 使用源读取器从网络摄像头源获取 H264 样本
- 粒子系统:所有粒子都朝同一方向运动
- 为什么我不能让 3 个网络摄像头与 pthreads 并行运行?
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 如何使用realsense摄像头调试ROS错误消息
- C++指标评价方向
- SFML - 弹丸以不同的方向减速
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 弧球摄像头:如何获得正确的方向和向上