- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在尝试一些 c++ opengl 代码并制作了一个相机。我想给场景一个鼠标输入来环顾四周,所以我添加了这段代码,就像这里的教程一样。 https://learnopengl.com/Getting-started/Camera
但是,关于偏航值和俯仰值,我不理解一些数学概念。这里是鼠标移动的回调函数。
void mouse_callback(GLFWwindow* window, double xpos, double ypos) {
if (firstMouse) //preventing large jumps
{
lastX = xpos;
lastY = ypos;
firstMouse = false;
}
float xoffset = xpos - lastX;
float yoffset = lastY - ypos;
lastX = xpos;
lastY = ypos;
float sensitivity = 0.1f;
xoffset *= sensitivity;
yoffset *= sensitivity;
yaw += xoffset;
pitch += yoffset;
if (pitch > 89.0f)
pitch = 89.0f;
if (pitch < -89.0f)
pitch = -89.0f;
glm::vec3 front;
front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
front.y = sin(glm::radians(pitch));
front.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));
//cameraFront is the direction vector of the camera. Where the camera is looking at
cameraFront = glm::normalize(front);
}
为了以防万一,以下是 mouse_callback 函数中使用的全局变量及其初始值。
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
//lookAt function requires position, target's position, up vector respectively.
有两件事我不明白。据我了解,偏航和俯仰分别从 y 轴和 x 轴计算。而用我们的右手,将拇指朝向轴的+方向,其他手指弯曲的方向就是角度的正方向。
现在假设我将鼠标向右移动但没有更改 yoffset。然后根据 mouse_callback 函数,偏航值增加,因为 xoffset 为正。由于y轴的正方向指向我们正在观看的窗口的顶部,yaw的增加意味着相机的方向 vector 应该向左旋转对吧?但在节目中,镜头转向并显示了场景的右侧部分。我不明白发生了什么。
如果我知道这里发生了什么,我想我就能理解为什么获取 yoffset 的计算顺序与获取 xoffset 值的计算顺序不同。
如有任何帮助,我们将不胜感激。如果我误解了任何数学概念或其他内容,请告诉我。提前致谢!
最佳答案
Since the positive direction of the y axis points to the top of the window we're watching, the increase in yaw means that the direction vector of the camera should rotate to the left direction right?
没有。 y
轴的方向与此处无关。将 pitch
保留为 0,给出的公式等于:
front.x = cos(glm::radians(yaw))
front.y = 0
front.z = sin(glm::radians(yaw));
因此,如果偏航角为 0,您将得到 (1,0,0)
(右)。如果你将它增加到 90 度,你最终会得到 (0,0,1)
,它在右手坐标系中直接指向背面,所以你只是向右转。
你似乎以某种方式将此与正旋转方向联系起来,当围绕 y 旋转时,它总是从 z 到 x。但是这些公式并没有实现围绕 y 轴正向旋转 yaw
角度,但它们实际上旋转了 -yaw
:由于系统设置为在角度 0 处产生 +x,我们可以将其视为正向 vector v= (1,0,0)
围绕轴 y 的旋转,因此经典旋转矩阵将产生:
( cos(yaw) 0 sin(yaw) ) ( cos(yaw) )
v' = ( 0 1 0 ) * v = ( 0 )
( -sin(yaw) 0 cos(yaw) ) (-sin(yaw) )
但是,当您沿负旋转方向旋转时,您最终会得到转置矩阵,只需翻转 sin
的负号即可:
( cos(yaw) 0 -sin(yaw) ) ( cos(yaw) )
v' = ( 0 1 0 ) * v = ( 0 )
( sin(yaw) 0 cos(yaw) ) ( sin(yaw) )
原来如此
front = R_y ( -yaw) * (1,0,0)^T
如果您查看包含 pitch
和 yaw 的完整公式,您会发现它等于:
front = R_y(-yaw) * R_z(pitch) * (1,0,0)^T
这只是一个复合旋转,首先将 (1,0,0) 围绕 z 轴旋转一个角度 pitch
以正缠绕顺序,然后将结果围绕 y 轴旋转一个角度 偏航
负序。
我还认为您在此处引用的源代码的作者要么 a) 匆忙,要么 b) 对此处的数学运算方式有点困惑。我这么说有两个原因:
默认方向为 (0,0,-1),但欧拉角设置为 pitch=0
, yaw=0
导致 (1,0,0) 观察方向,默认为 yaw=-90
。人们可以用一种更清晰、更直观的方式来表述它,以便零角度产生默认的前视方向。
这里完全不需要lookAt
的使用。它将在内部进行的正交归一化只是对处理能力的浪费(按照今天的标准,这不是一个很大的浪费,但仍然如此)。使用 (0,1,0)
作为向上 vector 会在极点附近变得非常不稳定,并将 pitch
限制为 [-89,89]
只是一种防止这种情况发生的技巧。在这个导航模型中让相机向上或向下看实际上没有错(因为你只沿着一个二维平面移动,前向仍然由 yaw
单独定义,即使在看直线上升或下降)。这种情况引起的万向节锁定也无关紧要,因为后面根本没有第三次旋转。
直接从两个旋转角度和相机位置直接创建 View 矩阵确实容易得多,并且完全避免了接近或完全 90 度的任何问题。
关于c++ - opengl 中鼠标输入背后的数学和偏航/俯仰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51341126/
我必须在 Android 中从陀螺仪的智能手机输出中计算偏航、滚转、俯仰,我编写了以下代码: if(event.sensor.getType()==Sensor.TYPE_GYROSCOPE){
四元数有利于它们之间的内插旋转。到目前为止,一切都很好。 如果我有一个网络游戏,将旋转量转换为vector3f就足够了还是应该使用四元数? 为了使游戏更流畅,我可能必须在上次发送的旋转和当前旋转之间进
我正在使用Reach RS +设备来捕获GPS位置数据以及IMU数据(侧倾,俯仰和偏航);请参阅制造商website上的“ Point Collection”图像。 我正在尝试确定底点的GPS坐标(接
如果可能的话,我想知道如何获得确定 Android 设备位置的航向、俯仰和滚动角度。不要考虑设备相关的细节。引用有用的文档也很有值(value)。谢谢! 最佳答案 我手头没有精确的解决方案,但全口径解
我在 WorldWind 中有一个 3D 飞机模型,这是一个在 OpenGL Java 上运行的 3D 地球模型。我使用数据库中的数据(包括纬度、经度和替代度)更新此模型的位置。如何从当前位置获取航向
我想在没有红外感应条的情况下使用 wiimote 来控制光标。我为此使用了俯仰和滚动值。问题是俯仰接近0度的时候,横滚很不稳定,而俯仰接近90度的时候,本身就很不稳定,但是横滚还好。我非常频繁地轮询
我正在为我的学校做一个编程主题的项目。我在 Swift 的 Xcode 中工作。我想制作一个使用陀螺仪的应用程序。我不知道,但由于 Xcode 中的一些我不知道如何修复的错误,它不会在我的 iPhon
我正在尝试使用 Vision 框架获取图像中人脸的俯仰/偏航/滚动,但始终为所有值获取 0。图像应该很容易处理(主要是前瞻性肖像)。 我通过对它们使用 Amazon Rekognition 成功获得了
我有一个基于提供的纬度/经度坐标、缩放、偏航和俯仰的谷歌地图和街景。我需要调用一个 javascript 来为每个值更新一个隐藏字段,每当任何细节从它们的默认值发生变化或当一个按钮被点击时。 因此,无
我的观众没有收到来自被跟随球员的任何投球轮换。 我正尝试与 ShooterGame 项目合作,对 FPS 旁观者功能进行概念验证。我在 GameMode 中添加了将 VictimPlayer 切换到旁
我正在尝试使用陀螺仪制作一个简单的应用程序,其中角色会根据 iPad 1 的旋转进行移动。 我的代码无法正常工作,因此我测试了原始、俯仰、偏航的值,无论我如何移动设备,它们实际上都保持为零。我确定 i
用于从 cvPOSIT 生成的 3*3 旋转矩阵计算偏航(z 轴)、横滚(x 轴)和俯仰(y 轴)的算法是什么。 最佳答案 使用cv::RQDecomp3x3() .“它可选择返回三个旋转矩阵,每个轴
我已经研究了一段时间,现在我必须决定走哪条路。 矿山要求:需要知道设备相对于真实航向(地理北极,而非磁极)的方向。为此,我必须使用指南针,现在我必须决定其他的东西,加速度计或陀螺仪。 因为这对我来说是
我的问题 我想用 3x3 旋转矩阵旋转一个 mayavi.mlab.imshow 对象。我能找到的唯一旋转此对象的方法是将对象的 actor.orientation 设置为 [pitch, roll,
我是一名优秀的程序员,十分优秀!