首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arcball摄像机:如何获得正确的方向和向上的

Arcball摄像机:如何获得正确的方向和向上的
EN

Stack Overflow用户
提问于 2019-05-15 22:07:25
回答 1查看 1.2K关注 0票数 0

我试图实现一个摄像机跟踪一个移动的物体。我实现了以下功能:

代码语言:javascript
复制
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));

}

我想使用这个功能(和音高版本)的相机,跟随一个移动的三维模型。现在,当center_point是(0,1,0)时,它就能工作了。我认为我得到了正确的位置,但是向上向量显然不是总是(0,1,0)。

我怎样才能获得相机的上、视图和右矢量?然后,如果我这样更新相机的眼睛位置,当另一个物体(以center_position参数为中心)移动时,我的相机将如何移动?

这样做的目的是在每次我用centered_value =移动对象的中心进行鼠标输入时更新它。然后使用gluLookAt与视图,眼睛和我的相机上的值(和lookAt,这将是eyes+view)。

EN

回答 1

Stack Overflow用户

发布于 2019-05-15 22:59:01

跟着一个移动的物体就是把相机指向那个物体。这就是典型的lookAt函数所做的事情。查看数学这里,然后使用glm::lookAt()

“Arcball”技术是用来与鼠标旋转的。看一些数学这里

其思想是从屏幕上的位置得到两个矢量(第一,第二)。对于每一个向量,X,Y都取决于鼠标“移动”的像素和窗口的大小。Z是由“跟踪球”数学计算的。用这两个矢量(归一化后),它的交叉积给出了在摄像机坐标下的旋转轴,它的点积给出了角度。现在,您可以通过glm::rotate()旋转相机。

如果你走另一条路(例如自己计算相机矩阵),那么相机的“向上”方向必须由你自己更新。记住,它与相机的另外两个轴垂直。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56158278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档